给定????个不同的正整数????1,????2, … , ????????,请对0到????每个????计算,在区间[1, ????]中有多少正整数是????中恰好????个数的约数。
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=205;
4 int n,m,a[maxn],cnt,b[1000000],f[maxn];
5 inline void add(int n){
6 for(int i=1;i<=n/i;i++){
7 if(n%i==0){
8 b[++cnt]=i;
9 b[++cnt]=n/i;
10 }
11 }
12 }
13 inline int cal(int d){
14 int t=0;
15 for(int i=1;i<=m;i++){
16 if(a[i]%d==0){
17 t++;
18 }
19 }
20 return t;
21 }
22 int main(){
23 scanf("%d%d",&n,&m);
24 for(int i=1;i<=m;i++){
25 scanf("%d",&a[i]);
26 add(a[i]);
27 }
28 sort(b+1,b+cnt+1);
29 for(int i=1;i<=cnt;i++){
30 if(b[i]<=n&&b[i]!=b[i-1]){
31 f[cal(b[i])]++;
32 }
33 }
34 f[0]=n;
35 for(int i=1;i<=m;i++){
36 f[0]-=f[i];
37 }
38 for(int i=0;i<=m;i++){
39 printf("%d\n",f[i]);
40 }
41 return 0;
42 }
T2:b
Problem:
小 B 正在学习函数的光滑性,他对 Lipschitz 常数非常感兴趣:当一个定义域为[????, ????]的函数????,对于定义域内的任意????, ????都有|????(????) − ????(????)| ≤ ???? × |???? − ????|时,则称????为该函数在[????, ????]上的 Lipschitz 常数。
然而小 B 并不满足于函数,所以他定义:对于一个序列????1, ????2,… , ????????的 Lipschitz 常数????,当1 ≤ ???? < ???? ≤ ????且????, ????均为整数时,同样满足|???????? − ????????| ≤ ???? × |???? − ????|。
现在给你一个长度为????的序列????1, ????2,… , ????????并给出????个询问,对于每对询问[????, ????],你需要求出????????,????????+1, … , ????????的所有子序列????????, … , ????????(???? ≤ ???? < ???? ≤ ????)的 Lipschitz 常数之和。
Code:
1 #include<bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4 const ll maxn=1e5+7;
5 ll n,q,v[maxn],mn[maxn*2];
6 struct pir{
7 ll x,v;
8 }h[22][maxn];
9 pir mer(pir a,pir b){
10 return (a.v>b.v)?a:b;
11 }
12 pir query(ll l,ll r){
13 ll k=mn[r-l+1];
14 return mer(h[k][l],h[k][r-(1<<k)+1]);
15 }
16 ll solve(ll l,ll r){
17 pir u=query(l,r);
18 ll ans=u.v*(u.x-l+1)*(r-u.x+1);
19 if(l!=u.x) ans+=solve(l,u.x-1);
20 if(r!=u.x) ans+=solve(u.x+1,r);
21 return ans;
22 }
23 int main(){
24 scanf("%lld%lld",&n,&q);
25 for(int i=1;i<=n;i++) scanf("%lld",&v[i]);
26 for(int i=1;i<=n-1;i++) h[0][i]=(pir){i,abs(v[i]-v[i+1])};
27 for(ll i=1;(1<<i)<n;i++){
28 for(int j=1;j<=n-(1<<i);j++){
29 h[i][j]=mer(h[i-1][j],h[i-1][j+(1<<(i-1))]);
30 }
31 for(ll j=(1<<i)+1;j<=(1<<(i+1));j++) mn[j]=i;
32 }
33 for(int i=1;i<=q;i++){
34 ll l,r;
35 scanf("%lld%lld",&l,&r);
36 printf("%lld\n",solve(l,r-1));
37 }
38 return 0;
39 }
T3:c
Problem:
一些小鸟想要通过一堵墙,墙上有????个洞供他们通过,由于小鸟体型不同且洞的形状不同,通过时间也是不同的。小鸟共有????种,第????种通过第????个洞需要????(????,????)时间。一个洞一次只能过一只鸟,后面的鸟需要等待。
已知第????种鸟有????????只。初始这些鸟都在墙的一侧,现在请你安排这些鸟的通过顺序,使得它们等待的时间之和最小。一只鸟的等待时间是它通过墙的时刻减去初始时刻。
Code:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=45;
4 const int maxm=105;
5 const int maxl=80115;
6 const int maxp=805;
7 int n,m,P=0;
8 int pop[maxm+4];
9 int tab[maxn+4][maxm+4];
10 struct edge{
11 int to,flow,c,cost,next;
12 edge(){}
13 edge(int tt,int ff,int cc,int co,int nn):to(tt),flow(ff),c(cc),cost(co),next(nn){}
14 }e[maxn*maxl];
15 int head[maxl+10],et=-1;
16 int S=0,T;
17 int line[maxl+4];
18 int dist[maxl+4];
19 bool ever[maxl+4];
20 int from[maxl+4][3];
21 int dt[maxl+4];
22 int times=0;
23 int FLOW=0,COST=0;
24 void Init(){
25 register int i,j;
26 scanf("%d%d",&n,&m);
27 memset(head,-1,sizeof(head));
28 for(i=1;i<=n;++i){
29 scanf("%d",&pop[i]);
30 P+=pop[i];
31 }
32 for(i=1;i<=n;++i) for(j=1;j<=m;++j) scanf("%d",&tab[i][j]);
33 T=m*P+n+1;
34 }
35 void Prepare(){
36 register int i,j;
37 register int fond=P*m;
38 for(i=1;i<=n;++i){
39 e[++et]=edge(i+fond,0,pop[i],0,head[S]),head[S]=et;
40 e[++et]=edge(S,0,0,0,head[i+fond]),head[i+fond];
41 }
42 for(i=1;i<=fond;++i){
43 e[++et]=edge(T,0,1,0,head[i]),head[i]=et;
44 e[++et]=edge(i,0,0,0,head[T]),head[T]=et;
45 }
46 for(i=1;i<=n;++i){
47 for(j=1;j<=m;++j){
48 e[++et]=edge(j,0,1,tab[i][j],head[i+fond]),head[i+fond]=et;
49 e[++et]=edge(i+fond,0,0,-tab[i][j],head[j]),head[j]=et;
50 }
51 }
52 }
53 void Spfa(){
54 register int h=0,t=0;
55 register int now,i,j;
56 ++times;
57 dist[0]=0;
58 dt[0]=times;
59 line[h++]=S;
60 ever[S]=1;
61 while(h!=t){
62 now=line[t];
63 t=(t==maxl)?0:(t+1);
64 ever[now]=0;
65 for(i=head[now];i!=-1;i=e[i].next){
66 if(e[i].c-e[i].flow&&(dt[e[i].to]!=times||dist[e[i].to]>dist[now]+e[i].cost)){
67 dt[e[i].to]=times;
68 dist[e[i].to]=dist[now]+e[i].cost;
69 from[e[i].to][0]=now;
70 from[e[i].to][1]=i;
71 if(ever[e[i].to]==0){
72 ever[e[i].to]=1;
73 line[h]=e[i].to;
74 h=(h==maxl)?0:(h+1);
75 }
76 }
77 }
78 }
79 if(dt[T]!=times) dist[T]=2e9;
80 }
81 void Add(){
82 register int i,j,flow=2e9,cost=0;
83 i=T;
84 while(i!=S){
85 flow=min(flow,e[from[i][1]].c-e[from[i][1]].flow);
86 cost+=e[from[i][1]].cost;
87 i=from[i][0];
88 }
89 i=T;
90 while(i!=S){
91 e[from[i][1]].flow+=flow;
92 e[from[i][1]^1].flow-=flow;
93 i=from[i][0];
94 }
95 j=from[T][0];
96 FLOW+=flow;
97 COST+=flow*cost;
98 j=from[T][0];
99 if(j+m>P*m) return ;
100 int fond=P*m;
101 int ge=(j-1)/m+2;
102 for(i=1;i<=n;++i){
103 e[++et]=edge(j+m,0,1,tab[i][(j-1)%m+1]*ge,head[i+fond]),head[i+fond]=et;
104 e[++et]=edge(i+fond,0,0,-(tab[i][(j-1)%m+1]*ge),head[j+m]),head[j+m]=et;
105 }
106 }
107 void Solve(){
108 while(1){
109 Spfa();
110 if(dist[T]>=2e9) break;
111 Add();
112 }
113 cout<<COST<<endl;
114 }
115 int main(){
116 Init();
117 Prepare();
118 Solve();
119 return 0;
120 }
60 }
61 ifx==y) return x;
62 for(int i=17;i>=0;i--){
63 if(w[i][x]!=w[i][y]){
64 x=w[i][x];
65 y=w[i][y];
66 }
67 }
68 return w[0][x];
69 }
70 int to[maxp][5],fail[maxp],tc,g[maxn*8],G[maxn*8],d[maxm];
71 int ed[20][maxn*2],p2[maxp],q2[maxp],pp;
72 inline void dd(int x){
73 p2[x]=++pp;
74 for(int i=e2.head[x];i;i=e2.nxt[i]){
75 dd(e2.to[i]);
76 }
77 q2[x]=pp;
78 }
79 int ans,f[maxp];
80 inline void bt(int i,int x,int y,int dp){
81 g[i]=++tc;
82 for(int j=x;j<=y;j++){
83 int p=g[i];
84 for(int k=ls[b[j].x];k<=rs[b[j].x];k++){
85 if(!to[p][s[k]]) to[p][s[k]]=++tc;
86 p=to[p][s[k]];
87 }
88 ed[dp][j]=p;
89 }
90 G[i]=tc;
91 for(int j=1;j<=e2.tot;j++){
92 e2.nxt[j]=0;
93 }
94 e2.tot=0;
95 for(int j=0;j<=4;j++){
96 to[0][j]=g[i];
97 }
98 d[d[0]=1]=g[i];
99 for(int j=1;j<=d[0];j++){
100 int x=d[j];
101 if(j>1) e2.add(fail[x],x);
102 for(int k=0;k<=4;k++){
103 if(to[x][k]){
104 int y=to[x][k],p=fail[x];
105 while(!to[p][k]) p=fail[p];
106 fail[y]=to[p][k];
107 d[++d[0]]=y;
108 }
109 }
110 }
111 dd(g[i]);
112 for(int j=x;j<=y;j++){
113 f[p2[ed[dp][j]]]+=a[b[j].x]*b[j].y;
114 if(q2[ed[dp][j]]<G[i]){
115 f[q2[ed[dp][j]]+1]-=a[b[j].x]*b[j].y;
116 }
117 }
118 int q=G[i]-g[i]+1;
119 for(int j=1;j<=q;j++){
120 if(j+lowbit(j)<=q){
121 f[g[i]+j+lowbit(j)-1]+=f[g[i]+j-1];
122 }
123 }
124 if(x==y) return ;
125 int mid=(x+y)>>1;
126 bt(i<<1,x,mid,dp+1);
127 bt(i<<1|1,mid+1,y,dp+1);
128 }
129 int pl,pr,px;
130 inline void add(int x,int n,int st,int c){
131 x-=--st;
132 while(x+st<=n){
133 f[x+st]+=c;
134 x+=lowbit(x);
135 }
136 }
137 inline void ff(int x,int st){
138 x-=--st;
139 while(x){
140 ans+=f[x+st];
141 x-=lowbit(x);
142 }
143 }
144 inline void xiu(int i,int x,int y,int dp){
145 if(y<pl||x>pr) return ;
146 add(p2[ed[dp][pl]],G[i],g[i],px);
147 add(q2[ed[dp][pl]]+1,G[i],g[i],-px);
148 if(x==y) return ;
149 int mid=(x+y)>>1;
150 xiu(i<<1,x,mid,dp+1);
151 xiu(i<<1|1,mid+1,y,dp+1);
152 }
153 char t[maxm];
154 int lt;
155 inline void fi(int i,int x,int y,int dp){
156 if(y<pl||x>pr) return ;
157 if(x>=pl&&y<=pr){
158 int p=g[i];
159 for(int j=0;j<=4;j++){
160 to[0][j]=p;
161 }
162 for(int j=1;j<=lt;j++){
163 while(!to[p][t[j]]) p=fail[p];
164 p=to[p][t[j]];
165 ff(p2[p],g[i]);
166 }
167 return ;
168 }
169 int mid=(x+y)>>1;
170 fi(i<<1,x,mid,dp+1);
171 fi(i<<1|1,mid+1,y,dp+1);
172 }
173 int main(){
174 scanf("%d%d",&n,&tp);
175 for(int i=1;i<=n;i++){
176 scanf("%s",str+1);
177 len=strlen(str+1);
178 ls[i]=rs[i-1]+1;
179 rs[i]=rs[i-1]+len;
180 for(int j=ls[i];j<=rs[i];j++){
181 s[j]=ch(str[j-ls[i]+1]);
182 }
183 }
184 for(int i=1;i<=n;i++){
185 scanf("%d",&a[i]);
186 }
187 for(int i=1;i<=n-1;i++){
188 scanf("%d%d",&x,&y);
189 e.add(x,y);
190 e.add(y,x);
191 }
192 dg(1);
193 for(int i=1;i<=17;i++){
194 for(int j=1;j<=n;j++){
195 w[i][j]=w[i-1][w[i-1][j]];
196 }
197 }
198 bt(1,1,tt,0);
199 scanf("%d",&Q);
200 for(int ii=1;ii<=Q;ii++){
201 scanf("%d%d%d",&op,&x,&y);
202 x^=ans*tp;
203 y^=ans*tp;
204 if(op==1){
205 scanf("%s",t+1);
206 lt=strlen(t+1);
207 for(int j=1;j<=lt;j++){
208 t[j]=ch(t[j]);
209 }
210 int z=lca(x,y);
211 ans=0;
212 pl=p[z];
213 pr=p[x];
214 fi(1,1,tt,0);
215 pl=p[z]+1;
216 pr=p[y];
217 fi(1,1,tt,0);
218 printf("%d\n",ans);
219 }
220 else{
221 pl=pr=p[x];
222 px=y-a[x];
223 xiu(1,1,tt,0);
224 pl=pr=q[x];
225 px=-px;
226 xiu(1,1,tt,0);
227 a[x]=y;
228 }
229 }
230 return 0;
231 }