T1:a

Problem:

给定????个不同的正整数????1,????2, … , ????????,请对0到????每个????计算,在区间[1, ????]中有多少正整数是????中恰好????个数的约数。

Code:

 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 }