The 19th Zhejiang Provincial Collegiate Programming Contest
题解:
https://files.cnblogs.com/files/clrs97/2022ZJCPC%E5%88%86%E6%9E%90.zip
Code:
A. JB Loves Math
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<queue> #include<bitset> #include<set> #include<unordered_map> #include<unordered_set> #include<map> #include<cassert> #include<string> using namespace std; #define pb push_back #define mp make_pair #define data dataa #define rep(i,n) for(int i=1;i<=n;i++) typedef long long LL; int main() { int T; for(scanf("%d",&T);T--;) { int a,b; scanf("%d%d",&a,&b); if(a==b)puts("0"); else if(a<b) { if((b-a)%2==1)puts("1"); else if((b-a)/2%2==1)puts("2"); else puts("3"); } else { if((a-b)%2==0)puts("1"); else puts("2"); } } return 0; }
B. JB Loves Comma
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define data dataa #define rep(i,n) for(int i=1;i<=n;i++) typedef long long LL; char s[100010]; bool comma[100010]; int main() { scanf("%s",s+1); int n=strlen(s+1); rep(i,n-2)if(s[i]=='c'&&s[i+1]=='j'&&s[i+2]=='b')comma[i+2]=1; rep(i,n) { putchar(s[i]); if(comma[i])putchar(','); } puts(""); return 0; }
C. JB Wants to Earn Big Money
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define data dataa #define rep(i,n) for(int i=1;i<=n;i++) typedef long long LL; int main() { int n,m,x,ans=0; scanf("%d%d%d",&n,&m,&x); rep(i,n) { int y;scanf("%d",&y); ans+=y>=x; } rep(i,m) { int y;scanf("%d",&y); ans+=y<=x; } printf("%d\n",ans); return 0; }
D. The Profiteer
#include<cstdio> typedef long long ll; const int N=200005,M=20; int n,k,e,i,v[N],a[N],b[N],ans[N]; int f[M][N],g[N],h[N]; inline void up(int&a,int b){a<b?(a=b):0;} inline void copy(int*f,int*g){for(int i=0;i<=k;i++)f[i]=g[i];} inline void ins(int*f,int x,int y){for(int i=k;i>=x;i--)up(f[i],f[i-x]+y);} inline bool check(int l,int r,int x,int y){//ans[x]<=y? if(x>y)return 0; int i; copy(h,g); for(i=l;i<=r;i++)ins(h,x<=i&&i<=y?b[i]:a[i],v[i]); ll sum=0; for(i=1;i<=k;i++)sum+=h[i]; return sum<=1LL*k*e; } void solve(int d,int L,int R,int dl,int dr){ if(L>R||dl>dr)return; int dm=(dl+dr)>>1,l=L,r=R,mid,m=L-1,i; copy(g,f[d]); for(i=dl;i<=dr;i++){ if(i>=L&&i<=R)continue; ins(g,L<=i&&i<=dm?b[i]:a[i],v[i]); } while(l<=r){ mid=(l+r)>>1; if(check(l,r,mid,dm)){ for(i=l;i<=mid;i++)ins(g,mid<i&&i<=dm?b[i]:a[i],v[i]); l=(m=mid)+1; }else{ for(i=mid;i<=r;i++)ins(g,l<=i&&i<=dm?b[i]:a[i],v[i]); r=mid-1; } } for(i=L;i<=m;i++)ans[i]=dm; if(L<=m&&dl<dm){ copy(f[d+1],f[d]); for(i=m+1;i<=R;i++){ if(i>=dl&&i<dm)continue; ins(f[d+1],L<=i&&i<dm?b[i]:a[i],v[i]); } for(i=dm;i<=dr;i++){ if(i>=L&&i<=R)continue; ins(f[d+1],L<=i&&i<dm?b[i]:a[i],v[i]); } solve(d+1,L,m,dl,dm-1); } if(R>m&&dr>dm){ copy(f[d+1],f[d]); for(i=L;i<=m;i++){ if(i>dm&&i<=dr)continue; ins(f[d+1],m<i&&i<=dr?b[i]:a[i],v[i]); } for(i=dl;i<=dm;i++){ if(i>=L&&i<=R)continue; ins(f[d+1],m<i&&i<=dr?b[i]:a[i],v[i]); } solve(d+1,m+1,R,dm+1,dr); } } int main(){ scanf("%d%d%d",&n,&k,&e); for(i=1;i<=n;i++)scanf("%d%d%d",&v[i],&a[i],&b[i]); for(i=1;i<=n;i++)ans[i]=n+1; solve(0,1,n,1,n); ll fin=0; for(i=1;i<=n;i++)fin+=n-ans[i]+1; printf("%lld",fin); }
E. Easy Jump
#include<bits/stdc++.h> using namespace std; const int maxn = 21000; int n,H,S,T1,T2; int P[maxn],o[maxn]; double p[maxn],q[maxn]; double f[maxn][10][10]; int main() { ios_base::sync_with_stdio(false); cin>>n>>H>>S; for(int i=1;i<=n;i++) cin>>P[i]; for(int i=1;i<=n;i++) p[i]=P[i]/100.0,q[i]=1-p[i]; int K; cin>>K; while(K--) { int x; cin>>x; o[x]=1; } cin>>T1>>T2; for(int s=0;s<=S;s++) for(int h=1;h<=H;h++) f[n+1][s][h]=0; for(int i=n;i>=1;i--) { if(o[i]) { if(T1<T2&&S>0) { for(int s=S;s<=S;s++) for(int h=2;h<=H;h++) { double mn; if(h>2) mn= 1+ p[i]*f[i+1][S][h] + q[i]*f[i][s][h-1]; else mn= ( 1+ p[i]*f[i+1][S][h] + q[i]*T1 )/p[i]; for(int k=h;k<=H;k++) { double temp= (k-h)*T1+(1+ p[i]*f[i+1][S][k] + q[i]*T1)/p[i]; mn=min( mn, temp ); } f[i][s][h]=mn; } } else { for(int s=S;s<=S;s++) for(int h=2;h<=H;h++) { if(h>2) f[i][s][h]= 1+ p[i]*f[i+1][o[i+1]?S:s][h] + q[i]*f[i][s][h-1]; else f[i][s][h]= ( 1+ p[i]*f[i+1][o[i+1]?S:s][h] + q[i]*T2 )/p[i]; } } } else { for(int s=0;s<=S;s++) for(int h=2;h<=H;h++) { if(h>2) f[i][s][h]= 1+ p[i]*f[i+1][o[i+1]?S:s][h] + q[i]*f[i][s][h-1]; else { if(s&&T1<T2) { f[i][s][h]= 1+ p[i]*f[i+1][o[i+1]?S:s][h] + q[i]*(f[i][s-1][h]+T1); } else { f[i][s][h]= ( 1+ p[i]*f[i+1][o[i+1]?S:s][h] + q[i]*T2 )/p[i]; } } } } } cout<<fixed<<setprecision(12)<<f[1][S][H]<<endl; return 0; }
F. Easy Fix
#include<bits/stdc++.h> #define lowbit(x) ((x)&(-x)) #define ll long long using namespace std; const int maxn = 110000; const int maxp = maxn*20; int n,m; struct segment { int tot; int seg[maxp],lc[maxp],rc[maxp]; void init() { tot=0; } int newnode() { ++tot; seg[tot]=lc[tot]=rc[tot]=0; return tot; } int loc,c; void upd(int &x,const int l,const int r) { if(!x) x=newnode(); seg[x]+=c; if(l==r) return; int mid=(l+r)>>1; if(loc<=mid) upd(lc[x],l,mid); else upd(rc[x],mid+1,r); } void merge(int &x,const int y) { if(!y) return; if(!x) { x=y;return; } seg[x]+=seg[y]; merge(lc[x],lc[y]); merge(rc[x],rc[y]); } int lx,rx; int query(const int x,const int l,const int r) { if(rx<l||r<lx||!x) return 0; if(lx<=l&&r<=rx) return seg[x]; int mid=(l+r)>>1; return query(lc[x],l,mid)+query(rc[x],mid+1,r); } }; struct Solve { int a[maxn]; segment seg0a,seg0b,seg2,seg_2,segc; int root0a[maxn],root0b[maxn],root2[maxn],root_2[maxn],rootc[maxn]; int li[maxn],ri[maxn]; int s[maxn]; void upd(int x,int c){ for(;x<=n;x+=lowbit(x))s[x]+=c; } int query(int x) { int re=0; for(;x;x-=lowbit(x)) re+=s[x]; return re; } ll ans; void build() { ans=0; for(int i=1;i<=n;i++) s[i]=0; seg0a.init(); seg0b.init(); seg2.init(); seg_2.init(); segc.init(); root0a[0]=root0b[0]=root2[0]=root_2[0]=rootc[0]=0; for(int i=1;i<=n;i++) { int l=query(a[i]),r=a[i]-1-l; li[i]=l,ri[i]=r; int k=l-r; ans+=min(l,r); if(k>=0) { seg0a.loc=a[i],seg0a.c=1; seg0a.upd(root0a[i],1,n); } if(k<=0) { seg0b.loc=a[i],seg0b.c=1; seg0b.upd(root0b[i],1,n); } if(k>=2) { seg2.loc=a[i],seg2.c=1; seg2.upd(root2[i],1,n); } if(k<=-2) { seg_2.loc=a[i],seg_2.c=1; seg_2.upd(root_2[i],1,n); } segc.loc=a[i],segc.c=1; segc.upd(rootc[i],1,n); seg0a.merge(root0a[i],root0a[i-1]); seg0b.merge(root0b[i],root0b[i-1]); seg2.merge(root2[i],root2[i-1]); seg_2.merge(root_2[i],root_2[i-1]); segc.merge(rootc[i],rootc[i-1]); upd(a[i],1); } } ll query(int l,int r) { if(l==r) return ans; ll ret=ans; int x=a[l],y=a[r]; int d= x<y?-2:2; if(x>y) swap(x,y); { ret-=min(li[l],ri[l])+min(li[r],ri[r]); segc.lx=1,segc.rx=a[l]; int numc=segc.query(rootc[r],1,n)-1; ret+=min(numc,a[l]-1-numc); segc.lx=1,segc.rx=a[r]; numc=segc.query(rootc[l-1],1,n); ret+=min(numc,a[r]-1-numc); } if(d==2) { seg0a.lx=x,seg0a.rx=y; ret-=seg0a.query(root0a[r-1],1,n)-seg0a.query(root0a[l],1,n); seg_2.lx=x,seg_2.rx=y; ret+=seg_2.query(root_2[r-1],1,n)-seg_2.query(root_2[l],1,n); //>=0 -,<=-2 + } else { seg0b.lx=x,seg0b.rx=y; ret-=seg0b.query(root0b[r-1],1,n)-seg0b.query(root0b[l],1,n); seg2.lx=x,seg2.rx=y; ret+=seg2.query(root2[r-1],1,n)-seg2.query(root2[l],1,n); //<=0 -, >=2 + } return ret; } }S1; int main() { ios_base::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) cin>>S1.a[i]; S1.build(); cin>>m; while(m--) { int x,y; cin>>x>>y; if(x>y) swap(x,y); cout<<S1.query(x,y)<<endl; } return 0; }
G. Easy Glide
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1020; const double eps = 1e-7; int n; struct point { int x,y; double dis(point k){ return hypot(x-k.x,y-k.y); } }p[maxn],S,T; double Dis[maxn][maxn]; double V1,V2; int vis[maxn]; double f[maxn]; void Dij() { for(int i=0;i<=n+1;i++) { f[i]= Dis[0][i]/V1; } for(int k=0;k<=n+1;k++) { int mni=-1; for(int i=0;i<=n+1;i++) if(!vis[i]) { if(mni==-1 || f[mni]-eps > f[i]) mni=i; } int i=mni; vis[i]=1; for(int j=0;j<=n+1;j++) { double dd=Dis[i][j]; double t; if( i>=1 && i<=n ) t= dd > 3*V2 ? (dd-3*V2)/V1+3 : dd/V2; else t= dd/V1; if(f[j]-eps > f[i]+t) f[j]=f[i]+t; } } } int v1,v2; int main() { ios_base::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y; cin>>S.x>>S.y; cin>>T.x>>T.y; p[0]=S,p[n+1]=T; cin>>V1>>V2; for(int i=0;i<=n+1;i++) for(int j=0;j<=n+1;j++) Dis[i][j]=p[i].dis(p[j]); Dij(); cout<<fixed<<setprecision(12)<<f[n+1]<<endl; return 0; }
H. A=B
#include <bits/stdc++.h> using namespace std; string str[]={ "", "S=XY", "aX=Xa", "bX=Xb", "cX=Xc", "X=ZP", "PA=dp", "PB=ep", "PC=fp", "pa=aP", "pb=bP", "pc=cP", "p=(return)0", "aA=Aa", "bA=Ab", "cA=Ac", "aB=Ba", "bB=Bb", "cB=Bc", "aC=Ca", "bC=Cb", "cC=Cc", "Ya=AY", "Yb=BY", "Yc=CY", "P=", "Z=T1", "1da=ad1", "1eb=be1", "1fc=cf1", "1a=(return)1", "1b=(return)1", "1c=(return)1", "1Y=(return)1", "1=0", "0da=ad0", "0db=bd0", "0dc=cd0", "0ea=ae0", "0eb=be0", "0ec=ce0", "0fa=af0", "0fb=bf0", "0fc=cf0", "0=", "Ta=Z", "Tb=Z", "Tc=Z", "T=(return)0" }; int n = 48; int main(){ int Tid = 0; cin >> Tid; for (int i=1;i<=n;i++) cout << str[i] << endl; return 0; }
I. Barbecue
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int N=1e6+1e3+7; const ull P=(1ull<<61)-1,bs=13131; int n,q; char s[N]; typedef unsigned long long ull; ull mul(ull a,ull b) { ull l1=(uint32_t)a,h1=a>>32,l2=(uint32_t)b,h2=b>>32; ull l=l1*l2,m=l1*h2+l2*h1,h=h1*h2; ull ret=(l&P)+(l>>61)+(h<<3)+(m>>29)+(m<<35>>3)+1; ret=(ret&P)+(ret>>61); ret=(ret&P)+(ret>>61); return ret-1; } ull add(ull x,ull y) { return x+y>=P?x+y-P:x+y; } ull pw[N]; ull hl[N],hr[N]; bool chk(int l,int r) { return add(hl[r],P-mul(hl[l-1],pw[r-l+1]))==add(hr[l],P-mul(hr[r+1],pw[r-l+1])); } int main() { scanf("%d%d",&n,&q); scanf("%s",s+1); pw[0]=1; for(int i=1;i<=n;i++) pw[i]=mul(pw[i-1],bs); for(int i=1;i<=n;i++) hl[i]=add(mul(hl[i-1],bs),s[i]); for(int i=n;i>=1;i--) hr[i]=add(mul(hr[i+1],bs),s[i]); while(q--) { int l,r; scanf("%d%d",&l,&r); if(chk(l,r)) puts("Budada"); else { int len=r-l+1; puts(len&1?"Putata":"Budada"); } } }
J. Frog
#include<bits/stdc++.h> using namespace std; double pi=acos(-1.); struct point { double x,y; point operator+(const point &p)const{return {x+p.x,y+p.y};} point operator-(const point &p)const{return {x-p.x,y-p.y};} point operator*(const double k)const{return {x*k,y*k};} point operator/(const double k)const{return {x/k,y/k};} point turn90()const{return {-y,x};} point turn(const double d)const{return {x*cos(d)-y*sin(d),x*sin(d)+y*cos(d)};} point flip()const{return {x,-y};} double abs()const{return hypot(x,y);} double abs2()const{return x*x+y*y;} point unit()const{return *this/abs();} }; point getmid(const point &A,const point &B) { point del=B-A; point mid=(A+B)/2.; point t=del.unit().turn90()*(sqrt(1.-del.abs2()/4.)); point C=mid+t,D=mid-t; if(C.abs2()>D.abs2())return C; return D; } int main() { ios_base::sync_with_stdio(false); int T; cin>>T; while(T--) { int a,b; cin>>a>>b; double turn=pi*a/180; b-=a; if(b<0)b+=360; int flip=0; if(b>180)flip=1,b=360-b; vector<point> ans; point start{1.,0.},end{cos(b*pi/180.),sin(b*pi/180.)}; ans.push_back(start); if(b==0) { } else if(b<=90) { ans.push_back(getmid(start,end)); ans.push_back(end); } else if(b<=131) { ans.push_back({1.,1.}); ans.push_back(getmid({1.,1.},end)); ans.push_back(end); } else { ans.push_back({1.,1.}); ans.push_back({0.,1.}); ans.push_back(getmid({0.,1.},end)); ans.push_back(end); } for(auto &z:ans) { if(flip)z=z.flip(); z=z.turn(turn); } cout<<ans.size()-1<<endl; for(auto z:ans) { cout<<fixed<<setprecision(10)<<z.x<<' '<<z.y<<endl; } } return 0; }
K. Dynamic Reachability
#include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef unsigned long long ull; const int N=50005,M=100005,Q=100005,K=7,CNT=K*64+5; int n,m,q,i,j,k,l,r,x,y,t,op[Q][3]; int id[N],at[CNT],cnt,pool[CNT]; bool vis[N];int scc,from[N],s[N]; ull mask[N][K],f[CNT][K],F[CNT][K],now[K]; vector<int>g[N],h[N]; struct E{ int u,v; bool active,mark; }e[M]; inline void mark(int x){ if(~id[x])return; at[cnt]=x; id[x]=cnt++; } inline bool bfs(int S,int T){ int h,t,i; static ull vis[K]; for(i=0;i<K;i++)vis[i]=0; for(i=0;i<cnt;i++)if(i!=S)vis[i>>6]^=1ULL<<(i&63); pool[h=t=0]=S; while(h<=t){ int x=pool[h++]; if(x==T)return 1; for(i=0;i<K;i++){ ull o=F[x][i]&vis[i]; for(vis[i]^=o;o;o-=o&-o)pool[++t]=(i<<6)+__builtin_ctzll(o); } } return 0; } void dfs(int x){ vis[x]=1; for(vector<int>::iterator j=h[x].begin();j!=h[x].end();j++) if(e[*j].active&&!e[*j].mark&&!vis[e[*j].u]) dfs(e[*j].u); s[++t]=x; } inline void go(int x){ static int q[N]; int h=1,t=1,i,y; q[1]=x; vis[x]=0; from[x]=++scc; for(i=0;i<K;i++)now[i]=0; while(h<=t){ x=q[h++]; if(~id[x])now[id[x]>>6]|=1ULL<<(id[x]&63); for(vector<int>::iterator j=g[x].begin();j!=g[x].end();j++) if(e[*j].active&&!e[*j].mark){ y=e[*j].v; if(vis[y]){ q[++t]=y; vis[y]=0; from[y]=scc; }else if(from[y]<scc){ y=from[y]; now[0]|=mask[y][0]; now[1]|=mask[y][1]; now[2]|=mask[y][2]; now[3]|=mask[y][3]; now[4]|=mask[y][4]; now[5]|=mask[y][5]; now[6]|=mask[y][6]; } } } for(i=0;i<K;i++)mask[scc][i]=now[i]; } int main(){ scanf("%d%d%d",&n,&m,&q); for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); g[x].push_back(i); h[y].push_back(i); e[i].u=x; e[i].v=y; e[i].active=1; } for(i=0;i<q;i++){ scanf("%d%d",&op[i][0],&op[i][1]); if(op[i][0]==2)scanf("%d",&op[i][2]); } for(i=1;i<=n;i++)id[i]=-1; for(l=0;l<q;l=r){ r=min(q,l+K*32); cnt=0; for(i=0;i<K*64;i++)at[i]=0; for(i=l;i<r;i++){ if(op[i][0]==1){ t=op[i][1]; x=e[t].u; y=e[t].v; e[t].mark=1; }else{ x=op[i][1]; y=op[i][2]; } mark(x); mark(y); } scc=t=0; for(i=1;i<=n;i++)if(!vis[i])dfs(i); for(i=n;i;i--)if(vis[s[i]])go(s[i]); for(i=0;i<cnt;i++)for(k=0;k<K;k++)f[i][k]=mask[from[at[i]]][k]; for(i=l;i<r;i++)if(op[i][0]==1){ t=op[i][1]; x=e[t].u; y=e[t].v; e[t].active^=1; }else{ for(j=0;j<cnt;j++)for(k=0;k<K;k++)F[j][k]=f[j][k]; for(j=l;j<r;j++)if(op[j][0]==1){ t=op[j][1]; if(e[t].active)F[id[e[t].u]][id[e[t].v]>>6]|=1ULL<<(id[e[t].v]&63); } puts(bfs(id[op[i][1]],id[op[i][2]])?"YES":"NO"); } for(i=l;i<r;i++){ if(op[i][0]==1){ t=op[i][1]; x=e[t].u; y=e[t].v; e[t].mark=0; }else{ x=op[i][1]; y=op[i][2]; } id[x]=id[y]=-1; } } }
L. Candy Machine
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define data dataa #define rep(i,n) for(int i=1;i<=n;i++) typedef long long LL; const int N=1000010; int a[N],n; int main() { scanf("%d",&n); rep(i,n)scanf("%d",&a[i]); sort(a+1,a+n+1); int now=0,ans=0; LL sum=0; rep(i,n) { sum+=a[i]; for(;now<i&&(LL)a[now+1]*i<=sum;now++); ans=max(ans,i-now); } printf("%d\n",ans); return 0; }
M. BpbBppbpBB
#include<bits/stdc++.h> using namespace std; char pattern[11][11]={"######","##..##","#....#","#....#","##..##","######"}; int main() { ios_base::sync_with_stdio(false); int n,m,cnt=0,cnt2=0; cin>>n>>m; vector<string> str(n); for(int i=0;i<n;i++) { cin>>str[i]; for(auto ch:str[i]) cnt+=(ch=='#'); } auto check=[&](int x,int y) { for(int i=0;i<6;i++) for(int j=0;j<6;j++) { if(str[x+i][y+j]!=pattern[i][j]) return false; } return true; }; for(int i=0;i+6<n;i++) { for(int j=0;j+6<m;j++) { cnt2+=check(i,j); } } //146x+100y=cnt //2x+y=cnt2 //x=(cnt2*100-cnt)/54 long long x54=(cnt2*100ll-cnt); assert(x54>=0 and x54%54==0); int x=x54/54; assert(cnt2-2*x>=0); int y=cnt2-2*x; cout<<x<<' '<<y<<endl; return 0; }