2023“钉耙编程”中国大学生算法设计超级联赛(3)
题解:
https://files.cnblogs.com/files/clrs97/2023HDU%E7%AC%AC%E4%B8%89%E5%9C%BA%E9%A2%98%E8%A7%A3.pdf
Code:
A. Magma Cave
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include<iostream> #include<algorithm> using namespace std; const int N=50005,M=200005,K=N+M; int Case,n,q,i,ok[M],e[M][4],at[M],bit[M]; int f[K],son[K][2],val[K],mx[K],tmp[K]; bool rev[K]; inline bool isroot( int x){ return !f[x]||son[f[x]][0]!=x&&son[f[x]][1]!=x;} inline void rev1( int x){ if (!x) return ;swap(son[x][0],son[x][1]);rev[x]^=1;} inline void pb( int x){ if (rev[x])rev1(son[x][0]),rev1(son[x][1]),rev[x]=0;} inline void umax( int &a, int b){a<b?(a=b):0;} inline void up( int x){ mx[x]=val[x]; if (son[x][0])umax(mx[x],mx[son[x][0]]); if (son[x][1])umax(mx[x],mx[son[x][1]]); } inline void rotate( int x){ int y=f[x],w=son[y][1]==x; son[y][w]=son[x][w^1]; if (son[x][w^1])f[son[x][w^1]]=y; if (f[y]){ int z=f[y]; if (son[z][0]==y)son[z][0]=x; else if (son[z][1]==y)son[z][1]=x; } f[x]=f[y];f[y]=x;son[x][w^1]=y;up(y); } inline void splay( int x){ int s=1,i=x,y;tmp[1]=i; while (!isroot(i))tmp[++s]=i=f[i]; while (s)pb(tmp[s--]); while (!isroot(x)){ y=f[x]; if (!isroot(y)){ if ((son[f[y]][0]==y)^(son[y][0]==x))rotate(x); else rotate(y);} rotate(x); } up(x); } inline void access( int x){ for ( int y=0;x;y=x,x=f[x])splay(x),son[x][1]=y,up(x);} inline int root( int x){access(x);splay(x); while (son[x][0])x=son[x][0];splay(x); return x;} inline void makeroot( int x){access(x);splay(x);rev1(x);} inline void link( int x, int y){makeroot(x);f[x]=y;access(x);} inline void cutf( int x){access(x);splay(x);f[son[x][0]]=0;son[x][0]=0;up(x);} inline void cut( int x, int y){makeroot(x);cutf(y);} inline int ask( int x, int y){makeroot(x);access(y);splay(y); return mx[y];} inline void modify( int x, int p){ for (;x<=q;x+=x&-x)bit[x]+=p;} inline int getsum( int x){ int t=0; for (;x;x-=x&-x)t+=bit[x]; return t;} inline void solve(){ for (i=1;i<=q;i++)bit[i]=at[i]=0; for (i=1;i<=n+q;i++){ f[i]=0; son[i][0]=son[i][1]=0; val[i]=mx[i]=0; rev[i]=0; } for (i=1;i<=q;i++) if (e[i][0]==1){ at[e[i][3]]=i; val[n+i]=mx[n+i]=e[i][3]; } int cnt=n-1; for (i=1;i<=q;i++) if (e[i][0]==1){ int x=e[i][1],y=e[i][2],z=e[i][3]; if (root(x)==root(y)){ int o=ask(x,y); if (z>o) continue ; o=at[o]; cut(n+o,e[o][1]); cut(n+o,e[o][2]); modify(e[o][3],-1); } else cnt--; link(n+i,x); link(n+i,y); modify(z,1); } else if (!cnt&&at[e[i][2]]&&at[e[i][2]]<=i&&getsum(e[i][2])>=e[i][1])ok[i]++; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>Case; while (Case--){ cin>>n>>q; for (i=1;i<=q;i++){ cin>>e[i][0]>>e[i][1]>>e[i][2]; if (e[i][0]==1)cin>>e[i][3]; else ok[i]=0; } solve(); for (i=1;i<=q;i++) if (e[i][0]==1)e[i][3]=q-e[i][3]+1; else { e[i][1]=n-e[i][1]; e[i][2]=q-e[i][2]+1; } solve(); for (i=1;i<=q;i++) if (e[i][0]==2)cout<<(ok[i]==2? "YES" : "NO" )<<endl; } } |
B. King’s Ruins
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include<iostream> #include<algorithm> using namespace std; typedef unsigned long long ull; const int N=50005,BATCH=23,D=5; int Case,n,m,i,j,k,o,st[N],en[N],x[N][D],w[N],f[N],now,mx[BATCH*4][65537]; ull who[D][N][BATCH]; inline void up( int &a, int b){a<b?(a=b):0;} inline void flip(ull*f, int x){f[x>>6]^=1ULL<<(x&63);} inline bool check( int *a, int *b){ for ( int i=0;i<D;i++) if (a[i]>b[i]) return 0; return 1; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>Case; while (Case--){ cin>>n; for (i=0;i<n;i++){ for (j=0;j<D;j++)cin>>x[i][j]; cin>>w[i]; f[i]=0; } for (i=0;i<n;i++)en[i>>6]=i; for (i=n-1;~i;i--)st[i>>6]=i; m=(n-1)>>6; int L,R; for (L=0;L<=m;L=R+1){ R=min(L+BATCH-1,m); for (i=0;i<BATCH*4;i++) for (j=0;j<65536;j++)mx[i][j]=0; for (i=1;i<=n;i++) for (j=0;j<BATCH;j++){ who[0][i][j]=0; who[1][i][j]=0; who[2][i][j]=0; who[3][i][j]=0; who[4][i][j]=0; } int ST=st[L],EN=en[R]; for (i=ST;i<=EN;i++){ o=i-ST; for (j=0;j<D;j++)flip(who[j][x[i][j]],o); } for (i=2;i<=n;i++) for (j=0;j<BATCH;j++){ who[0][i][j]|=who[0][i-1][j]; who[1][i][j]|=who[1][i-1][j]; who[2][i][j]|=who[2][i-1][j]; who[3][i][j]|=who[3][i-1][j]; who[4][i][j]|=who[4][i-1][j]; } for (i=L;i<=m;i++){ int _ST=st[i],_EN=en[i]; if (i>L){ int lim=min(BATCH,i-L); for (j=_ST;j<=_EN;j++){ now=f[j]; int A=x[j][0],B=x[j][1],C=x[j][2],D=x[j][3],E=x[j][4]; for (k=0;k<lim;k++){ ull S=who[0][A][k]&who[1][B][k]&who[2][C][k]&who[3][D][k]&who[4][E][k]; up(now,mx[k<<2][S&65535]); up(now,mx[(k<<2)+1][(S>>16)&65535]); up(now,mx[(k<<2)+2][(S>>32)&65535]); up(now,mx[(k<<2)+3][S>>48]); } f[j]=now; } } if (i<=R){ for (j=_ST;j<=_EN;j++){ now=f[j]; for (k=_ST;k<j;k++) if (now<f[k]&&check(x[k],x[j]))now=f[k]; now+=w[j]; f[j]=now; o=j-ST; mx[o>>4][1<<(o&15)]=now; } o=(i-L)<<2; for (j=1;j<65536;j++){ mx[o][j]=max(mx[o][j&-j],mx[o][j-(j&-j)]); mx[o+1][j]=max(mx[o+1][j&-j],mx[o+1][j-(j&-j)]); mx[o+2][j]=max(mx[o+2][j&-j],mx[o+2][j-(j&-j)]); mx[o+3][j]=max(mx[o+3][j&-j],mx[o+3][j-(j&-j)]); } } } } for (i=0;i<n;i++)cout<<f[i]<<endl; } } |
C. Leshphon
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include<cstdio> typedef unsigned long long ull; const int N=55,M=N*N,K=5; int Case,n,m,k,i,j,x,y,id[N][N],u[M],v[M],keep[M],mark[M],preg[N],preh[N],pool[K][N*2]; ull ans,g[N],h[N],full,C[M][K]; inline void flip( int o){ int x=u[o],y=v[o]; g[x]^=1ULL<<y; h[y]^=1ULL<<x; } inline bool bfs(ull*g, int *pre){ ull mask=full^1; int h=1,t=1; static int q[N]; q[1]=0; while (h<=t){ int x=q[h++]; for (ull S=mask&g[x];S;S-=S&-S){ mask^=S&-S; int y=__builtin_ctzll(S&-S); pre[y]=x; q[++t]=y; } } return t==n; } inline void ext( int x, int *pool, int &cp){ if (mark[x]) return ; mark[x]=1; pool[cp++]=x; } void solve( int k, int m){ if (!bfs(g,preg)||!bfs(h,preh)){ ans+=C[m][k]; return ; } if (!k) return ; int i,cp=0; for (i=1;i<n;i++){ ext(id[preg[i]][i],pool[k],cp); ext(id[i][preh[i]],pool[k],cp); } for (i=0;i<cp;i++)mark[pool[k][i]]=0; for (i=0;i<cp;i++){ int o=pool[k][i]; if (keep[o]) continue ; m--; flip(o); solve(k-1,m); flip(o); keep[o]=k; } for (i=0;i<cp;i++) if (keep[pool[k][i]]==k)keep[pool[k][i]]=0; } int main(){ for (C[0][0]=i=1;i<M;i++) for (C[i][0]=j=1;j<K;j++)C[i][j]=C[i-1][j-1]+C[i-1][j]; scanf ( "%d" ,&Case); while (Case--){ scanf ( "%d%d" ,&n,&m); k=3; for (i=0;i<n;i++)g[i]=h[i]=0; for (i=0;i<m;i++){ scanf ( "%d%d" ,&x,&y); x--,y--; id[x][y]=i; u[i]=x,v[i]=y; flip(i); } full=(1ULL<<n)-1; ans=0; solve(k,m); printf ( "%llu\n" ,ans); } } |
D. Chaos Begin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include<iostream> #include<algorithm> #include<map> #include<set> using namespace std; typedef long long ll; typedef pair< int , int >PI; const int N=50005*2; int Case,n,m,i,t,DX,DY;set<PI>ans,done; struct P{ int x,y; P(){} P( int _x, int _y){x=_x,y=_y;} P operator-( const P&b) const { return P(x-b.x,y-b.y);} }a[N],b[N],q[N],pool[N]; inline ll cross( const P&a, const P&b){ return 1LL*a.x*b.y-1LL*a.y*b.x;} inline bool cmp1( const P&a, const P&b){ return a.x==b.x?a.y<b.y:a.x<b.x;} inline bool cmp2( const P&a, const P&b){ return a.x==b.x?a.y>b.y:a.x<b.x;} inline bool cmpd( const P&a, const P&b){ if (a.x==b.x) return DY>=0?a.y<b.y:a.y>b.y; return DX>=0?a.x<b.x:a.x>b.x; } inline void check( int dx, int dy){ if (done.find(PI(dx,dy))!=done.end()) return ; done.insert(PI(dx,dy)); done.insert(PI(-dx,-dy)); map<PI, int >T; int i,cnt=0; for (i=1;i<=m;i++)T[PI(b[i].x,b[i].y)]++; DX=dx,DY=dy; sort(b+1,b+m+1,cmpd); for (i=1;i<=m;i++){ int &now=T[PI(b[i].x,b[i].y)]; if (!now) continue ; now--; cnt++; int &nxt=T[PI(b[i].x+dx,b[i].y+dy)]; if (!nxt) return ; nxt--; } if (cnt==n){ ans.insert(PI(dx,dy)); ans.insert(PI(-dx,-dy)); } } inline void findline( const P&A, const P&B){ int i,j,cp=0; for (i=1;i<=m;i++) if (!cross(B,a[i]-A))pool[++cp]=a[i]; for (i=1;i<=cp;i++) for (j=1;j<=cp;j++)check(pool[i].x-pool[j].x,pool[i].y-pool[j].y); } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>Case; while (Case--){ cin>>n; m=n*2; for (i=1;i<=m;i++)cin>>a[i].x>>a[i].y,b[i]=a[i]; ans.clear(); done.clear(); check(0,0); sort(a+1,a+m+1,cmp1); findline(a[1],P(0,1)); findline(a[m],P(0,1)); for (i=1,t=0;i<=m;i++){ if (i>1&&a[i].x==a[i-1].x) continue ; while (t>1&&1LL*(q[t].y-q[t-1].y)*(a[i].x-q[t].x)>=1LL*(a[i].y-q[t].y)*(q[t].x-q[t-1].x))t--; q[++t]=a[i]; } for (i=1;i<t;i++)findline(q[i],q[i+1]-q[i]); sort(a+1,a+m+1,cmp2); for (i=1,t=0;i<=m;i++){ if (i>1&&a[i].x==a[i-1].x) continue ; while (t>1&&1LL*(q[t].y-q[t-1].y)*(a[i].x-q[t].x)<=1LL*(a[i].y-q[t].y)*(q[t].x-q[t-1].x))t--; q[++t]=a[i]; } for (i=1;i<t;i++)findline(q[i],q[i+1]-q[i]); cout<<ans.size()<<endl; for (set<PI>::iterator it=ans.begin();it!=ans.end();it++)cout<<it->first<< " " <<it->second<<endl; } } |
E. Out of Control
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include<cstdio> #include<algorithm> using namespace std; const int N=3005,P=1000000007; int Case,n,m,i,j,sum,ans,a[N],b[N],f[N]; inline void up( int &a, int b){a=a+b<P?a+b:a+b-P;} int main(){ scanf ( "%d" ,&Case); while (Case--){ scanf ( "%d" ,&n); for (i=1;i<=n;i++) scanf ( "%d" ,&a[i]),b[i]=a[i]; sort(b+1,b+n+1); for (m=0,i=1;i<=n;i++) if (i==1||b[i]>b[i-1])b[++m]=b[i]; for (i=1;i<=n;i++)a[i]=lower_bound(b+1,b+m+1,a[i])-b; sort(a+1,a+n+1); for (i=1;i<=m;i++)f[i]=1; printf ( "%d\n" ,m); for (i=2;i<=n;i++){ sum=ans=0; for (j=a[i-1];j<a[i];j++)up(sum,f[j]); for (j=a[i];j<=m;j++){ up(sum,f[j]); f[j]=sum; up(ans,sum); } printf ( "%d\n" ,ans); } } } |
F. Dragon Seal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef unsigned long long ull; const int N=65; int Case,n,i,j,x,y,g[N],v[N<<1],nxt[N<<1],ed,ans; ull num[N][2]; int val[N][2],f[N][2][2]; struct Item{ ull num; int val,col; Item(){} Item(ull _num, int _val, int _col){num=_num,val=_val,col=_col;} }; namespace Matroid{ const int M=N*2,E=100005,inf=~0U>>1,K=64; int n,tot,ans,S,T,g[M],v[E],nxt[E],ed,q[E],h,t,d[M],pre[M],w[M],cnt[N]; bool in[M],use[M]; Item item[M]; ull base[K]; inline bool check1(){ for ( int i=0;i<tot;i++) if (cnt[i]>1) return 0; return 1; } inline bool check2(){ int i,j; for (i=0;i<K;i++)base[i]=0; for (i=0;i<n;i++) if (use[i]){ ull x=item[i].num; bool flag=0; for (j=0;j<K;j++) if (x>>j&1){ if (!base[j]){ base[j]=x; flag=1; break ; } else x^=base[j]; } if (!flag) return 0; } return 1; } inline void add( int x, int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;} inline void ext( int x, int y, int z){ if (d[x]>=y) return ; d[x]=y; pre[x]=z; if (in[x]) return ; q[++t]=x; in[x]=1; } inline bool find(){ int i,j,S=n+1,T=n+2; for (ed=i=0;i<=T;i++)g[i]=w[i]=0; for (i=0;i<n;i++) if (!use[i]){ w[i]=item[i].val; use[i]^=1; cnt[item[i].col]++; if (check1())add(S,i); if (check2())add(i,T); cnt[item[i].col]--; use[i]^=1; } else w[i]=-item[i].val; for (i=0;i<n;i++) if (use[i]) for (j=0;j<n;j++) if (!use[j]){ use[i]^=1,use[j]^=1; cnt[item[i].col]--;cnt[item[j].col]++; if (check1())add(i,j); if (check2())add(j,i); cnt[item[i].col]++;cnt[item[j].col]--; use[i]^=1,use[j]^=1; } for (i=0;i<=T;i++)d[i]=-inf,in[i]=0; q[h=t=1]=S; d[S]=0,in[S]=1; while (h<=t){ int x=q[h++]; for (i=g[x];i;i=nxt[i])ext(v[i],d[x]+w[v[i]],x); in[x]=0; } if (d[T]==-inf) return 0; ans+=d[T]; while (pre[T]!=S){ T=pre[T]; if (use[T])cnt[item[T].col]--; else cnt[item[T].col]++; use[T]^=1; } return 1; } inline int intersection( const vector<Item>&pool, int _tot){ int i; n=ans=0; tot=_tot; for (i=0;i<pool.size();i++) if (pool[i].val>=0)item[n++]=pool[i]; for (i=0;i<tot;i++)cnt[i]=0; for (i=0;i<n;i++)use[i]=0; for (i=0;i<tot;i++) if (!find()) return -1; return ans; } } inline void add( int x, int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;} void dfs( int x, int y){ for ( int i=g[x];i;i=nxt[i]){ int u=v[i]; if (u==y) continue ; dfs(u,x); } for ( int now=0;now<2;now++){ int tot=0; vector<Item>pool; for ( int i=g[x];i;i=nxt[i]){ int u=v[i]; if (u==y) continue ; for ( int j=0;j<2;j++)pool.push_back(Item(num[u][j],f[u][j][now],tot)); tot++; } pool.push_back(Item(num[x][now],val[x][now],tot)); tot++; if (y){ for ( int fa=0;fa<2;fa++){ vector<Item>npool=pool; npool.push_back(Item(num[y][fa],0,tot)); f[x][now][fa]=Matroid::intersection(npool,tot+1); } } else { ans=max(ans,Matroid::intersection(pool,tot)); } } } int main(){ scanf ( "%d" ,&Case); while (Case--){ scanf ( "%d" ,&n); ans=-1; for (ed=i=0;i<=n;i++)g[i]=0; for (i=1;i<=n;i++) for (j=0;j<2;j++) scanf ( "%llu%d" ,&num[i][j],&val[i][j]); for (i=1;i<n;i++) scanf ( "%d%d" ,&x,&y),add(x,y),add(y,x); dfs(1,0); printf ( "%d\n" ,ans); } } |
G. Casino Royale
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include<iostream> #include<map> #include<vector> #include<algorithm> using namespace std; typedef vector< int >V; typedef pair< int ,V>P; typedef long long ll; const int N=55; map<P, int >pre,nxt; int Case,n,m,q,i,j,k,l,r,diff,x,cur,cnt[N],tmp[N]; vector<vector< int > >g[N]; vector<ll>f[N]; ll ans[N*2][N*2]; char s[N]; struct E{ int a,b; void init( int sum, int diff){ a=(sum+diff)/2; b=(sum-diff)/2; } }; vector<E>e[N]; void prework( int n){ V v; pre[P(0,v)]=1; cnt[0]=1; for (i=1;i<=n;i++){ g[i-1].resize(cnt[i-1]); for (j=0;j<cnt[i-1];j++)g[i-1][j].resize(2); nxt.clear(); cur=0; for (map<P, int >::iterator it=pre.begin();it!=pre.end();it++){ for (j=1;j<=2;j++){ m=it->first.second.size(); for (k=0;k<m;k++)tmp[k]=it->first.second[k]; tmp[m++]=j; while (m>=3&&tmp[m-3]<=tmp[m-2]&&tmp[m-2]>=tmp[m-1]){ tmp[m-3]+=tmp[m-1]-tmp[m-2]; m-=2; } V now(m); for (k=0;k<m;k++)now[k]=tmp[k]; int &to=nxt[P(it->first.first+j,now)]; if (!to)to=++cur; g[i-1][it->second-1][j-1]=to-1; } } swap(pre,nxt); cnt[i]=cur; e[i].resize(cur); for (map<P, int >::iterator it=pre.begin();it!=pre.end();it++){ m=it->first.second.size(); for (k=0;k<m;k++)tmp[k]=it->first.second[k]; j=0,k=m-1,x=1,diff=0; while (j<=k){ if (tmp[j]>tmp[k])diff+=x*tmp[j++]; else diff+=x*tmp[k--]; x*=-1; } e[i][it->second-1].init(it->first.first,diff); } } for (i=0;i<=n;i++)f[i].resize(cnt[i]); } int main(){ prework(50); ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>Case; while (Case--){ cin>>n>>q>>s; for (i=0;i<=n;i++) for (j=0;j<cnt[i];j++)f[i][j]=0; f[0][0]=1; for (i=0;i<n;i++){ l=0,r=1; if (s[i]== '1' )r=0; if (s[i]== '2' )l=1; for (j=0;j<cnt[i];j++) if (f[i][j]) for (k=l;k<=r;k++)f[i+1][g[i][j][k]]+=f[i][j]; } for (i=0;i<=n*2;i++) for (j=0;j<=n*2;j++)ans[i][j]=0; for (i=0;i<cnt[n];i++)ans[e[n][i].a][e[n][i].b]+=f[n][i]; while (q--)cin>>i>>j,cout<<ans[i][j]<<endl; } } |
H. Teyberrs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=200005,M=524305,Q=200005; int Case,n,q,start,i,j,x,y,g[N],w[Q],nxt[Q];ll ans[Q]; int a[N],d[N],l[N],r[N],pool[N]; int L,R;ll base; bool no; int cnt[M];ll sum[M]; void build( int x, int a, int b){ cnt[x]=sum[x]=0; if (a==b) return ; int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); } inline void ins( int o){ int c=lower_bound(pool+1,pool+n+1,o)-pool; int x=1,a=1,b=n,mid; while (1){ cnt[x]++; sum[x]+=o; if (a==b) return ; mid=(a+b)>>1; x<<=1; if (c<=mid)b=mid; else a=mid+1,x++; } } inline int delmin(){ int x=1,a=1,b=n,mid; while (a<b){ mid=(a+b)>>1; x<<=1; if (cnt[x])b=mid; else a=mid+1,x++; } int o=pool[a]; for (;x;x>>=1)cnt[x]--,sum[x]-=o; return o; } inline void delmax(){ int x=1,a=1,b=n,mid; while (a<b){ mid=(a+b)>>1; x=x<<1|1; if (cnt[x])a=mid+1; else b=mid,x--; } int o=pool[a]; for (;x;x>>=1)cnt[x]--,sum[x]-=o; } inline void adjust( int l, int r){ while (L<R){ if (l<=L&&L<=r) break ; base+=delmin(); L+=2; } while (L<R){ if (l<=R&&R<=r) break ; delmax(); R-=2; } if (L==R&&L<l||L>r)no=1; } inline ll getsum( int k){ int x=1,a=1,b=n,mid,t;ll ret=0; while (a<b){ mid=(a+b)>>1; x<<=1; t=cnt[x]; if (k<=t)b=mid; else { k-=t; ret+=sum[x]; a=mid+1; x++; } } return ret+1LL*k*pool[a]; } inline ll ask( int x){ if (no||x<L||x>R||((x-L)&1)) return -1; if (x==L) return base; return base+getsum((x-L)>>1); } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>Case; while (Case--){ cin>>n>>q>>start; for (i=1;i<=n;i++){ cin>>x>>y>>l[i]>>r[i]; a[i]=x,d[i]=pool[i]=y-x; } for (i=1;i<=n;i++)g[i]=0; for (i=1;i<=q;i++){ cin>>x>>y; w[i]=y; nxt[i]=g[x]; g[x]=i; } sort(pool+1,pool+n+1); build(1,1,n); L=R=start; base=0; no=0; for (i=1;i<=n;i++){ if (!no){ base+=a[i]; ins(d[i]); L--,R++; adjust(l[i],r[i]); } for (j=g[i];j;j=nxt[j])ans[j]=ask(w[j]); } for (i=1;i<=q;i++)cout<<ans[i]<<endl; } } |
I. Operation Hope
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include<iostream> #include<algorithm> using namespace std; const int N=100005,K=3,inf=~0U>>1; int Case,n,i,j,mi,ma,l,r,mid,ans; int cnt,t,q[N*2],f[N*2]; bool vis[N*2]; int e[N*2][K]; struct DS{ int q[N*2],h,t,d; int get( int val){ if (h<=t){ int x=q[h]; if (e[x][d]<val-mid){ h++; return x; } } if (h<=t){ int x=q[t]; if (e[x][d]>val+mid){ t--; return x; } } return 0; } void reset(){h=1,t=n+n;} }T[K]; inline bool cmp( int x, int y){ return e[x][j]<e[y][j];} void dfs0( int x){ if (vis[x]) return ; vis[x]=1; for ( int d=0;d<K;d++) while (1){ int y=T[d].get(e[x][d]); if (!y) break ; dfs0(y<=n?y+n:y-n); } q[++t]=x; } void dfs1( int x){ if (!vis[x]) return ; vis[x]=0,f[x]=cnt; for ( int d=0;d<K;d++) while (1){ int y=T[d].get(e[x<=n?x+n:x-n][d]); if (!y) break ; dfs1(y); } } inline bool check(){ for (t=cnt=0,i=1;i<=n+n;i++)vis[i]=0; for (i=0;i<K;i++)T[i].reset(); for (i=1;i<=n+n;i++) if (!vis[i])dfs0(i); for (i=0;i<K;i++)T[i].reset(); for (i=t;i;i--) if (vis[q[i]])cnt++,dfs1(q[i]); for (i=1;i<=n;i++) if (f[i]==f[i+n]) return 0; return 1; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>Case; while (Case--){ cin>>n; for (i=1;i<=n;i++){ for (j=0;j<K;j++)cin>>e[i][j]; for (j=0;j<K;j++)cin>>e[i+n][j]; } mi=inf,ma=-inf; for (i=1;i<=n+n;i++) for (j=0;j<K;j++){ mi=min(mi,e[i][j]); ma=max(ma,e[i][j]); } for (j=0;j<K;j++){ for (i=1;i<=n+n;i++)T[j].q[i]=i; T[j].h=1,T[j].t=n+n,T[j].d=j; sort(T[j].q+1,T[j].q+n+n+1,cmp); } l=0,r=ma-mi; while (l<=r){ mid=(l+r)>>1; if (check())r=(ans=mid)-1; else l=mid+1; } cout<<ans<<endl; } } |
J. The Mine of Abyss
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include<iostream> #include<algorithm> #include<vector> using namespace std; typedef long long ll; typedef pair<ll,ll>P; typedef vector<P>V; const int N=50005,M=131075; int Case,n,m,i,op,x,y,pos[N];V ans,v[M]; inline void ext(V&nxt,P&now, const P&o){ if (o.first>now.second+1){ if (now.second>=0)nxt.push_back(now); now=o; } else { now.second=max(now.second,o.second); } } inline V push(V v, const P&o){ for ( int i=0;i<v.size();i++){ v[i].first+=o.first; v[i].second+=o.second; } return v; } inline V combine( const V&a, const V&b){ V nxt; int j=0,k=0; P now(0,-2); while (j<a.size()&&k<b.size())ext(nxt,now,a[j].first<b[k].first?a[j++]:b[k++]); while (j<a.size())ext(nxt,now,a[j++]); while (k<b.size())ext(nxt,now,b[k++]); nxt.push_back(now); return nxt; } inline V merge( const V&a, const V&b){ if (!a.size()) return b; if (!b.size()) return a; V c=a; for ( int i=0;i<b.size();i++)c=combine(c,push(a,b[i])); return c; } inline void init( int x){ v[x].resize(2); v[x][0]=P(0,0); cin>>v[x][1].first>>v[x][1].second; } void build( int x, int a, int b){ if (a==b){ pos[a]=x; init(x); return ; } int mid=(a+b)>>1; build(x<<1,a,mid); build(x<<1|1,mid+1,b); v[x]=merge(v[x<<1],v[x<<1|1]); } inline void change( int x){ x=pos[x]; init(x); for (x>>=1;x;x>>=1)v[x]=merge(v[x<<1],v[x<<1|1]); } void ask( int x, int a, int b, int c, int d){ if (c<=a&&b<=d){ ans=merge(ans,v[x]); return ; } int mid=(a+b)>>1; if (c<=mid)ask(x<<1,a,mid,c,d); if (d>mid)ask(x<<1|1,mid+1,b,c,d); } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>Case; while (Case--){ cin>>n>>m; build(1,1,n); while (m--){ cin>>op>>x; if (op==1)change(x); else { cin>>y; ans.clear(); ask(1,1,n,x,y); ll fin=0; for (i=0;i<ans.size();i++)fin+=ans[i].second-ans[i].first+1; cout<<fin<<endl; } } } } |
K. 8-bit Zoom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include<cstdio> const int N=55; int Case,n,rate; char a[N][N],b[N*8][N*8]; bool check(){ rate/=25; if (n*rate%4) return 0; int m=n*rate; for ( int i=0;i<n;i++) for ( int j=0;j<n;j++){ int xl=i*rate,xr=xl+rate; int yl=j*rate,yr=yl+rate; char w=a[i][j]; for ( int A=xl;A<xr;A++) for ( int B=yl;B<yr;B++)b[A][B]=w; } for ( int i=0;i<m;i+=4) for ( int j=0;j<m;j+=4){ char w=b[i][j]; for ( int A=i;A<i+4;A++) for ( int B=j;B<j+4;B++) if (b[A][B]!=w) return 0; } for ( int i=0;i<m;i+=4){ for ( int j=0;j<m;j+=4) putchar (b[i][j]); puts ( "" ); } return 1; } int main(){ scanf ( "%d" ,&Case); while (Case--){ scanf ( "%d%d" ,&n,&rate); for ( int i=0;i<n;i++) scanf ( "%s" ,a[i]); if (!check()) puts ( "error" ); } } |
L. Noblesse Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include<iostream> #include<algorithm> #include<vector> using namespace std; typedef long long ll; typedef pair<ll,ll>P; typedef vector<ll>V; const int N=50005; int Case,n,q,i,x,cnt,ce,ans[N];ll A,B; struct E{V s; int t;}e[N*3]; inline int compare( const V&a, const V&b){ int n=a.size(),m=b.size(),i; if (a[0]!=b[0]) return a[0]<b[0]?-1:1; for (i=1;i<n&&i<m;i+=2){ if (a[i]!=b[i]) return a[i]<b[i]?-1:1; if (!a[i]) return 0; if (a[i+1]<b[i+1]){ if (i+2>=n) return -1; return a[i+2]<b[i]?-1:1; } if (a[i+1]>b[i+1]){ if (i+2>=m) return 1; return a[i]<b[i+2]?-1:1; } } if (i<n) return 1; if (i<m) return -1; return 0; } inline bool cmp( const E&a, const E&b){ int sgn=compare(a.s,b.s); if (sgn) return sgn<0; return a.t<b.t; } inline P decode( const V&s){ P ret(s[0],s[0]); for ( int i=1;i+1<s.size();i+=2){ if (s[i]==-1)ret.first+=ret.second*s[i+1]; else ret.second+=ret.first*s[i+1]; } return ret; } inline V zip(P p){ V s; while (1){ if (p.first==p.second) break ; if (p.first>p.second){ ll old=p.first; p.first%=p.second; if (!p.first)p.first=p.second; s.push_back((old-p.first)/p.second); s.push_back(-1); } else { ll old=p.second; p.second%=p.first; if (!p.second)p.second=p.first; s.push_back((old-p.second)/p.first); s.push_back(-2); } } s.push_back(p.first); reverse(s.begin(),s.end()); return s; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>Case; while (Case--){ cin>>n>>q; ce=0; for (i=1;i<=n;i++){ cin>>A>>B; e[++ce].t=0; e[ce].s=zip(P(A,B)); } for (i=1;i<=q;i++){ ans[i]=0; cin>>A>>B; V s=zip(P(A,B)); e[++ce].t=-i; e[ce].s=s; e[++ce].t=i; s.push_back(0); e[ce].s=s; } sort(e+1,e+ce+1,cmp); cnt=0; for (i=1;i<=ce;i++){ x=e[i].t; if (!x)cnt++; if (x>0)ans[x]+=cnt; if (x<0)ans[-x]-=cnt; } for (i=1;i<=q;i++)cout<<ans[i]<<endl; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2016-10-05 XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
2015-10-05 BZOJ3836 : [Poi2014]Tourism