The 18th Zhejiang Provincial Collegiate Programming Contest
题解:
https://files.cnblogs.com/files/clrs97/ZJCPC2021analyze.zip
Code:
A. League of Legends
#include<cstdio> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) typedef long long LL; int main() { int x=0,y=0; rep(i,5){int z;scanf("%d",&z);x+=z;} rep(i,5){int z;scanf("%d",&z);y+=z;} puts(x>=y?"Blue":"Red"); return 0; }
B. Restore Atlantis
//n log^2 m + q sqrt(n) + m^2 #include<cstdio> #include<queue> using namespace std; const int N=100005,M=2000,K=(N>>8)+5; int n,m,i,j,ga[M+5],gd[M+5],v[N<<1],nxt[N<<1],ed,st[M+5][M+5],en[M+5][M+5]; bool del[N]; struct Rect{int l,r,v;}rect[N]; priority_queue<int>val[4111]; int g[N],nxtq[N],w[N],ans[N],G[N],V[M*M+5],NXT[M*M+5],ED; int be[K],sum[K],f[N]; inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;} void clr(int x,int a,int b){ while(!val[x].empty())val[x].pop(); if(a==b)return; int mid=(a+b)>>1; clr(x<<1,a,mid); clr(x<<1|1,mid+1,b); } void ins(int x,int a,int b,int c,int d,int p){ if(c<=a&&b<=d){ val[x].push(p); return; } int mid=(a+b)>>1; if(c<=mid)ins(x<<1,a,mid,c,d,p); if(d>mid)ins(x<<1|1,mid+1,b,c,d,p); } void dfs(int x,int a,int b,int c){ while(!val[x].empty()){ int t=val[x].top(); if(del[t]){ val[x].pop(); continue; } if(c<t)c=t; break; } if(a==b){ st[i][a]=c; return; } int mid=(a+b)>>1; dfs(x<<1,a,mid,c); dfs(x<<1|1,mid+1,b,c); } void init(){ for(i=1;i<=M;i++){ for(j=ga[i];j;j=nxt[j])ins(1,1,M,rect[v[j]].l,rect[v[j]].r,rect[v[j]].v); dfs(1,1,M,0); for(j=gd[i];j;j=nxt[j])del[rect[v[j]].v]=1; } } inline void modify(int x){ sum[x>>8]++; f[x]++; } inline int ask(int x){ int ret=0,X=x>>8,i; for(i=0;i<X;i++)ret+=sum[i]; for(i=be[X];i<=x;i++)ret+=f[i]; return ret; } int main(){ scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ int xl,xr,yl,yr; scanf("%d%d%d%d",&xl,&yl,&xr,&yr); xl++,yl++; rect[i].l=yl; rect[i].r=yr; rect[i].v=i; add(ga[xl],i); add(gd[xr],i); } for(i=1;i<=m;i++){ int l,r; scanf("%d%d",&l,&r);//l<=st&&en<=r w[i]=r; nxtq[i]=g[l]; g[l]=i; } init(); for(i=1;i<=M;i++)for(j=1;j<=M;j++)en[i][j]=st[i][j]; for(i=1;i<=n;i++)rect[i].v=n-i+1,del[i]=0; clr(1,1,M); init(); for(i=1;i<=M;i++)for(j=1;j<=M;j++)if(en[i][j]){ int x=n-st[i][j]+1; V[++ED]=en[i][j]; NXT[ED]=G[x]; G[x]=ED; //if(x>en[i][j])printf("! (%d,%d) st=%d en=%d %d\n",i,j,x,en[i][j],st[i][j]); } for(i=n;i;i--)be[i>>8]=i; for(i=n;i;i--){ for(j=G[i];j;j=NXT[j])modify(V[j]); for(j=g[i];j;j=nxtq[j])ans[j]=ask(w[j]); } for(i=1;i<=m;i++)printf("%d\n",ED-ans[i]); }
C. Cube
#include<bits/stdc++.h> #define rep(i,n) for(int i=0;i<n;++i) using namespace std; struct poi{ int x,y,z; poi operator+(poi p){return (poi){x+p.x,y+p.y,z+p.z};} poi operator-(poi p){return (poi){x-p.x,y-p.y,z-p.z};} int operator%(poi p){return x*p.x+y*p.y+z*p.z;} int dis2(){return *this%*this;} void scan(){scanf("%d%d%d",&x,&y,&z);} bool operator==(poi p){return x==p.x&&y==p.y&&z==p.z;} }a[8],b[8]; bool cmp_dis2(poi a,poi b){ return a.dis2()<b.dis2(); } bool cmp_xyz(poi a,poi b){ if(a.x!=b.x)return a.x<b.x; if(a.y!=b.y)return a.y<b.y; return a.z<b.z; } bool check(){ if(a[1].dis2()==0)return 0; if(a[1].dis2()!=a[2].dis2())return 0; if(a[2].dis2()!=a[3].dis2())return 0; if(a[1]%a[2]!=0)return 0; if(a[2]%a[3]!=0)return 0; if(a[1]%a[3]!=0)return 0; rep(i,8){ poi t=(poi){0,0,0}; if(i&1)t=t+a[1]; if(i&2)t=t+a[2]; if(i&4)t=t+a[3]; b[i]=t; } sort(a,a+8,cmp_xyz); sort(b,b+8,cmp_xyz); rep(i,8)if(!(a[i]==b[i]))return 0; return 1; } int T; int main(){ for(scanf("%d",&T);T--;){ rep(i,8)a[i].scan(); rep(i,8)a[i]=a[i]-a[7]; sort(a,a+8,cmp_dis2); puts(check()?"YES":"NO"); } return 0; }
D. Shortest Path Query
#include<cstdio> #include<algorithm> #include<queue> #include<vector> using namespace std; typedef long long ll; typedef pair<ll,int>P; const int N=100005,K=17,M=200005; const ll inf=1LL<<60; int n,m,i,S,x,y,z,g[N],v[M<<1],w[M<<1],nxt[M<<1],ed,dep[N]; ll d[N],f[N][K];//f[i][j]=dis(i,i>>j) priority_queue<P,vector<P>,greater<P> >q; inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;} void dfs1(int x){ if(x>n)return; d[x]=inf; dfs1(x<<1); dfs1(x<<1|1); } void dfs2(int x,int y){ if(x>n)return; f[x][y]=d[x]; dfs2(x<<1,y+1); dfs2(x<<1|1,y+1); } inline void ext(int x,ll y){ if(x<S)return; if(d[x]<=y)return; q.push(P(d[x]=y,x)); } inline int lca(int x,int y){ for(;x!=y;x>>=1)if(dep[x]<dep[y])swap(x,y); return x; } int main(){ scanf("%d%d",&n,&m); while(m--){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } for(i=1;i<=n;i++)dep[i]=dep[i>>1]+1; for(S=1;S<=n;S++){ dfs1(S); ext(S,0); while(!q.empty()){ P t=q.top();q.pop(); if(d[t.second]<t.first)continue; for(i=g[t.second];i;i=nxt[i])ext(v[i],t.first+w[i]); } dfs2(S,0); } scanf("%d",&m); while(m--){ scanf("%d%d",&x,&y); z=lca(x,y); ll ans=inf; int A=dep[x]-dep[z],B=dep[y]-dep[z]; while(z){ ans=min(ans,f[x][A]+f[y][B]); z>>=1,A++,B++; } if(ans==inf)ans=-1; printf("%lld\n",ans); } }
E. Specially Super Rare
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef unsigned long long ull; const int N=10000005,S=13331,K=1000; int n,m,i,val,ans,pre[K<<1],nxt[K<<1]; char a[N],b[N]; ull p[N],f[N],g[N]; inline void up(int&a,int b){a<b?(a=b):0;} inline ull ask(int l,int r,ull*f){return f[r]-f[l-1]*p[r-l+1];} inline int lcp(int A,int B){ if(A>n||B>n)return 0; if(a[A]!=b[B])return 0; int l=1,r=min(n-A+1,n-B+1),mid,t=0; while(l<=r){ mid=(l+r)>>1; if(ask(A,A+mid-1,f)==ask(B,B+mid-1,g))l=(t=mid)+1;else r=mid-1; } return t; } int main(){ scanf("%s%d",a+1,&m); n=strlen(a+1); for(i=1;i<=n;i++)b[i]=a[n-i+1]; for(p[0]=i=1;i<=n;i++){ p[i]=p[i-1]*S; f[i]=f[i-1]*S+a[i]; g[i]=g[i-1]*S+b[i]; } while(1){ for(i=-ans-1;i<=ans+1;i++)nxt[i+K]=-1; for(i=-ans;i<=ans;i++)if(~pre[i+K]){ //dp[ans][i]=pre[i+M] val=pre[i+K];//[1..val] [1..val+i] val+=lcp(val+1,val+i+1); //printf("dp[%d][%d]=%d\n",ans,i,val); if(val==n&&!i)return printf("%d",n-ans/2),0; if(val<n)up(nxt[i-1+K],val+1); if(val+i<n)up(nxt[i+1+K],val); } ans++; for(i=-ans;i<=ans;i++)pre[i+K]=nxt[i+K]; } }
F. Fair Distribution
#include <bits/stdc++.h> using namespace std; typedef long long LL; int a, b; // a - // b + int gao(int bb, int dd) { return (bb + dd - 1) / dd * dd; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&a,&b); int ans = 1e9; for (int i=1;i<=20000;i++) { // sub a to i if (i <= a) { int tmp = a - i + gao(b, i) - b; ans = min(ans, tmp); } // give each one i int newb = gao(b, i); int newa = newb / i; if (newa <= a) { ans = min(ans, a - newa + newb - b); } } printf("%d\n",ans); } }
G. Wall Game
#include<bits/stdc++.h> #define ll long long #define db long double using namespace std; const int dx[]={0,1,-1,1,-1,0}; const int dy[]={-1,-1,0,0,1,1}; const int maxn = 510000; map< pair<int,int> ,int >mp; int cnt; int n; int fa[maxn],s[maxn]; int findfa(const int x){ return fa[x]==x?x:fa[x]=findfa(fa[x]); } void merge(int x,int y,int i) { for(int k=0;k<6;k++) { if(mp.count(make_pair(x+dx[k],y+dy[k]))!=0) { int j=mp[make_pair(x+dx[k],y+dy[k])]; int f1=findfa(i),f2=findfa(j); s[f1]--; s[f2]--; if(f1!=f2) { fa[f2]=f1; s[f1]+=s[f2]; } } } } int main() { ios_base::sync_with_stdio(false); //freopen("tmp.in","r",stdin); cin>>n; while(n--) { int op,x,y; cin>>op>>x>>y; pair<int,int>temp=make_pair(x,y); if(op==1) { if(mp.count(temp)==0) { mp[temp]=++cnt; fa[cnt]=cnt; s[cnt]=6; merge(x,y,cnt); } } else cout<<s[findfa(mp[temp])]<<endl; } return 0; }
H. Grammy and HearthStone
#include<bits/stdc++.h> using namespace std; int a[2333333],vis[2333333],top; int ans[2333333]; int main() { ios_base::sync_with_stdio(false); int n; cin>>n; if(n%4==2||n%4==3) { cout<<-1<<endl; return 0; } if(n==1) { cout<<1<<endl; return 0; } if(n==4) { cout<<"7 2 3 1"<<endl; return 0; } if(n==8) { cout<<"8 1 13 11 2 4 5 6"<<endl; return 0; } if(n%4==0) { int k=n/4; for(int i=4*k;i>=2;i-=2)a[++top]=i; a[++top]=4*k-1; for(int i=2;i<=4*k;i+=2)a[++top]=i; a[++top]=2*k-1; for(int i=4*k-3;i>=2*k+1;i-=2)a[++top]=i; for(int i=2*k-3;i>=3;i-=2)a[++top]=i; a[++top]=4*k-1; a[++top]=2*k-1; for(int i=3;i<=2*k-3;i+=2)a[++top]=i; a[++top]=1; a[++top]=1; for(int i=2*k+1;i<=4*k-3;i+=2)a[++top]=i; } else { int k=n/4; a[++top]=4*k+1; for(int i=4*k-2;i>=2;i-=2)a[++top]=i; a[++top]=4*k; for(int i=2;i<=4*k-2;i+=2)a[++top]=i; a[++top]=2*k+1; for(int i=4*k+1;i>=2*k+3;i-=2)a[++top]=i; for(int i=2*k-1;i>=3;i-=2)a[++top]=i; a[++top]=4*k; a[++top]=2*k+1; for(int i=3;i<=2*k-1;i+=2)a[++top]=i; a[++top]=1; a[++top]=1; for(int i=2*k+3;i<=4*k-1;i+=2)a[++top]=i; } for(int i=1;i<=2*n;i++) { // cerr<<a[i]<<' '; if(!vis[a[i]]) { ans[a[i]]=i; vis[a[i]]=1; } } cerr<<endl; for(int i=1;i<=n;i++) { cout<<ans[i]<<" \n"[i==n]; } return 0; }
I. Grammy and Ropes
#include<bits/stdc++.h> using namespace std; bool a[11],b[11]; string s[11]; int main() { for(int i=1;i<=6;i++)cin>>s[i]; for(int i=1;i<=6;i++) { if(s[i]=="true")a[i]=1; else a[i]=0; } int ans=7; for(int i=1;i<=3;i++) { ans-=(a[i]!=a[i+3]); b[i]=(a[i]==1); } b[2]^=1; if(ans==7&&!(b[1]==b[2]&&b[1]==b[3]))ans++; cout<<ans<<endl; return 0; }
J. Grammy and Jewelry
#include<bits/stdc++.h> #define ll long long #define db long double using namespace std; inline void up(int &a,const int &b){ if(a<b)a=b; } const int maxn = 6050; int n,m,T; int a[maxn]; vector<int>V[maxn]; int f[maxn],g[maxn]; queue<int>q; int dp[maxn]; int main() { ios_base::sync_with_stdio(false); cin>>n>>m>>T; for(int i=2;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; V[x].push_back(y),V[y].push_back(x); } for(int i=1;i<=n;i++) f[i]=-1; f[1]=0; q.push(1); while(!q.empty()) { const int x=q.front(); q.pop(); for(auto y:V[x]) if(f[y]==-1) { f[y]=f[x]+1; q.push(y); } } for(int i=1;i<=n;i++) if(f[i]!=-1) up(g[f[i]<<1],a[i]); dp[0]=0; for(int i=1;i<=T;i++) { for(int j=1;j<=i;j++) up(dp[i],dp[i-j]+g[j]); } for(int i=1;i<=T;i++) cout<<dp[i]<<' '; cout<<endl; return 0; }
K. Grammy's Kingdom
#include<bits/stdc++.h> #define rep(i,n) for(int i=1;i<=n;++i) #define mp make_pair #define pb push_back #define st first #define nd second using namespace std; using ll=long long; using pr=pair<int,int>; const int N=2e6+5,mod=998244353; int inv[N]; int n,m; bool is[N]; int cnt[N]; vector<int>b; vector<pr>cb; int S2[N]; int sol(int x,int y,int bg){ //sig(f(l,r)) l<=x r<=y f(1,1)=to protect bg nodes bg=bg-1; //ret=ret+SS[bg-1]; bg<=1 return ((S2[x+y+bg-1]-S2[y+bg-1]-S2[x+bg-1])%mod+mod)%mod; } int main(){ scanf("%d%d",&n,&m); inv[1]=1; for(int i=2;i<=n+1;++i) inv[i]=((ll)mod-(mod/i))*inv[mod%i]%mod; rep(i,n)S2[i]=(ll)(n-i)*inv[i+1]%mod;//to protect i nodes rep(i,n)S2[i]=(S2[i]+S2[i-1])%mod;//1+...+i rep(i,n)S2[i]=(S2[i]+S2[i-1])%mod;//i*1+...+1*i rep(i,m){ int x; scanf("%d",&x); is[x]=1; } is[n+1]=1; int la=0; //b = block rep(i,n+1)if(is[i])b.pb(i-la),++cnt[i-la],la=i; //bc = <size,cnt> rep(i,n)if(cnt[i]>0)cb.pb(mp(i,cnt[i])); int ans=0; int siz=cb.size(); for(int i=0;i<siz;++i){ //same sized //C(size,2) int X=((ll)cb[i].nd*(cb[i].nd-1)/2)%mod; ans=(ans+(ll)sol(cb[i].st,cb[i].st,2)*X)%mod; for(int j=i+1;j<siz;++j){ //different sized int X=(ll)cb[i].nd*cb[j].nd%mod; ans=(ans+(ll)sol(cb[i].st,cb[j].st,2)*X)%mod; } } //adjacent blocks act differently siz=b.size(); for(int i=0;i+1<siz;++i) ans=((ll)ans-sol(b[i],b[i+1],2)+sol(b[i],b[i+1],1)+mod)%mod; //inside a block for(int i=0;i<siz;++i) ans=(ans+S2[b[i]-1])%mod; printf("%d\n",ans); return 0; }
L. String Freshman
#include<cstdio> int n,i;char a[100005]; int main(){ scanf("%d%s",&n,a+1); for(i=2;i<=n;i++)if(a[i]==a[1])return puts("Wrong Answer"),0; puts("Correct"); }
M. Game Theory
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(long long i=1;i<=n;++i) #define mp make_pair #define pb push_back int main() { puts("0.0000"); return 0; }