2021.10.11
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 }