The 3rd Universal Cup. Stage 8: Cangqian
题解:
https://files.cnblogs.com/files/clrs97/ZJCPC24_Tutorial.pdf
Code:
A. Bingo
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 <bits/stdc++.h> using namespace std; string n; int m; typedef long long ll; ll sum[1000005]; int pw[1000005]; bool all[1000005]; int sol[1000020]; void solv() { cin >> n >> m; int am = 0 ; for ( int i = 0;i < n.size();i++) am = (10LL * am + n[i] - '0' ) % m; int ans = m - am; sum[n.size()] = 0; for ( int i = 0;i < n.size();i++) { sum[i] = 1LL * ( '9' - n[i]) * pw[n.size() - i - 1] ; } all[n.size()] = 1; for ( int i = n.size() - 1;i >= 0;i--) { all[i] = all[i + 1] && (n[i] == '9' ) ; } for ( int i = n.size() - 1;i >= 0;i--) sum[i] += sum[i + 1]; string b; int d = m; while (d) { b += ((d % 10) + '0' ) ; d /= 10; } reverse(b.begin() , b.end()) ; vector< int > rm(b.size() + 1) ; for ( int i = b.size() - 1;i >= 0;i--) { rm[i] = (b[i] - '0' ) * pw[b.size() - i - 1] + rm[i + 1] ; } for ( int i = 0;i < n.size() && i + b.size() - 1 < n.size();i++) { //match for ( int j = 0 ; j <= b.size();j++) { /// here mat , diff on n[i + j] if (i + j >= n.size()) break ; if (j == b.size()) { if (!all[i + j]) ans = min(ans , 1) ; break ; } if (b[j] > n[i + j]) { /// // printf("in %d %d : %d %d %d\n",i,j,(ll)(b[j] - n[i + j] - 1) * pw[n.size() - (i + j) - 1] , sum[i + j + 1] , 1LL * rm[j + 1] * pw[n.size() - (i+b.size())]) ; ans = min((ll)ans , 1 + (ll)(b[j] - n[i + j] - 1) * pw[n.size() - (i + j) - 1] + sum[i + j + 1] + 1LL * rm[j + 1] * pw[n.size() - (i+b.size())]); } if (j == b.size() || i + j >= n.size() || b[j] != n[i + j]) break ; } } int L = ( int )n.size() - 1; // printf("L %d\n",L) ; for ( int i = 0;i < n.size() + 15;i++) sol[i] = 0; for ( int i = 0;i < n.size();i++) sol[n.size() - i - 1] = n[i] - '0' ; sol[0] += ans ; for ( int i = 0;i <= L;i++) { sol[i + 1] += sol[i] / 10; sol[i] %= 10; if (sol[i + 1]) L = max(L , i + 1) ; } for ( int i = L;i >= 0;i--) cout << sol[i] ; cout << '\n' ; return ; } int main() { // freopen("in.txt","r",stdin); // freopen("out2.txt","w",stdout) ; ios::sync_with_stdio( false ) ; cin.tie(0) ; cout.tie(0) ; int t;cin >> t; pw[0] = 1; for ( int i = 1;i <= 100000;i++) { pw[i] = min(1000000000LL , pw[i - 1] * 10LL) ; } while (t--) solv() ; } |
B. Simulated Universe
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 | #include<bits/stdc++.h> using namespace std; const int N=8e3+1e2+7; int T,n; int f[2][N]; int main() { ios::sync_with_stdio( false ); cin.tie(0); cin>>T; while (T--) { cin>>n; for ( int i=0;i<=n;i++) f[0][i]=-1e9; f[0][0]=0; int now=0,last=1; int ans=0; for ( int i=1;i<=n;i++) { swap(now,last); for ( int j=0;j<=i+1;j++) f[now][j]=-1e9; string ty; cin>>ty; if (ty== "B" ) { ans+=2; for ( int j=0;j<=i;j++) { if (f[last][j]<0) continue ; f[now][j+1]=max(f[now][j],f[last][j]); if (f[last][j]) f[now][j]=max(f[now][j],f[last][j]-1); } } else { int a,b; cin>>a>>b; for ( int j=0;j<=i;j++) { if (f[last][j]<0) continue ; f[now][max(j-a,0)]=max(f[now][max(j-a,0)],f[last][j]); f[now][j]=max(f[now][j],f[last][j]+b); } } } for ( int i=0;i<=n;i++) if (f[now][i]>=0) { ans-=i; break ; } cout<<ans<< "\n" ; } } /* 1 3 6 1 2 3 4 5 6 6 9 9 8 12 13 10 15 17 12 18 21 */ |
C. Challenge NPC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <bits/stdc++.h> using namespace std; typedef pair< int , int > pii ; vector<pii> Ed; int main() { ios::sync_with_stdio( false ) ; cin.tie(0) ; int k ; cin >> k; int n = k + 2; for ( int i = 1;i <= n;i++) { for ( int j = 1;j < i;j++) { Ed.push_back({j*2 , i*2 - 1}); Ed.push_back({j*2 - 1 , i *2}); } } cout << n*2 << ' ' << Ed.size() << ' ' << 2 << '\n' ; for ( int i = 1;i <= n*2;i++) { cout << (i&1) + 1 << ' ' ; } cout << '\n' ; for ( auto [x,y] : Ed) cout << x << ' ' << y << '\n' ; return 0; } |
D. Puzzle: Easy as Scrabble
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 | #include<bits/stdc++.h> using namespace std; using ll= long long ; const int N=300005,P=998244353; #define NO {puts("NO"); exit(0);} int dx[]={0,0,1,-1},dy[]={1,-1,0,0}; auto solve(){ int n,m; cin>>n>>m; vector<string> a(n+2); for ( auto &s:a) cin>>s; vector f(n+2,vector<array< char ,4>>(m+1)); vector inq(n+2,vector< bool >(m+2)); for ( int i=1;i<=n;i++){ if (a[i][0]!= '.' ) f[i][1][0]=a[i][0]; if (a[i][m+1]!= '.' ) f[i][m][1]=a[i][m+1]; } for ( int j=1;j<=m;j++){ if (a[0][j]!= '.' ) f[1][j][2]=a[0][j]; if (a[n+1][j]!= '.' ) f[n][j][3]=a[n+1][j]; } auto check=[&]( int x, int y){ static int vis[256]; static int time ; int num=0; ++ time ; for ( auto c:f[x][y]){ if (! isalpha (c)) continue ; if (a[x][y]!= 'x' ) a[x][y]=c; if (vis[c]!= time ){ vis[c]= time ; num++; } } if (num>1) return true ; return num==1&&a[x][y]== 'x' ; }; queue<pair< int , int >> qu; for ( int i=1;i<=n;i++){ for ( int j=1;j<=m;j++){ if (check(i,j)){ qu.push({i,j}); inq[i][j]= true ; } } } while (qu.size()){ auto [x,y]=qu.front(); qu.pop(); inq[x][y]= false ; a[x][y]= 'x' ; for ( int i=0;i<4;i++){ if (! isalpha (f[x][y][i])) continue ; int nx=x+dx[i],ny=y+dy[i]; if (nx<=0||ny<=0||nx>n||ny>m) NO; f[nx][ny][i]=f[x][y][i]; if (a[nx][ny]!= 'x' ) a[nx][ny]=f[x][y][i]; if (!inq[nx][ny]&&check(nx,ny)){ inq[nx][ny]= true ; qu.push({nx,ny}); } } f[x][y]={0,0,0,0}; } puts ( "YES" ); for ( int i=1;i<=n;i++){ for ( int j=1;j<=m;j++){ if (a[i][j]== 'x' ) a[i][j]= '.' ; putchar (a[i][j]); } puts ( "" ); } } int main(){ ios::sync_with_stdio( false ); cin.tie(0); int t=1; // cin>>t; while (t--){ solve(); // cout<<solve()<<'\n'; // cout<<(solve()?"Yes":"No")<<'\n'; } return 0; } /* Generated by powerful Codeforces Tool(cf tool) * Author: sleep__ * Time: 2024-04-04 14:25:05 **/ |
E. Team Arrangement
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 | #include<cstdio> #include<algorithm> using namespace std; typedef unsigned long long ull; const int N=65,inf=~0U>>1; int n,i,w[N],num[N],ans;ull in[N],out[N]; struct E{ int l,r;}e[N]; inline bool cmp( const E&a, const E&b){ return a.r<b.r;} inline void solve( int m){ int sum=0; ull S=0; for ( int i=1;i<=m;i++){ S^=in[i]; int now=num[i]; sum+=now*w[i]; now*=i; while (now--){ if (!S) return ; S-=S&-S; } S^=S&out[i]; } if (sum>ans)ans=sum; } void dfs( int x, int m){ if (x>m) return ; num[x]=0; dfs(x+1,m); for ( int i=1;;i++){ m-=x; num[x]=i; if (!m)solve(x); if (m<=0) break ; dfs(x+1,m); } } int main(){ scanf ( "%d" ,&n); for (i=0;i<n;i++) scanf ( "%d%d" ,&e[i].l,&e[i].r); sort(e,e+n,cmp); for (i=0;i<n;i++){ in[e[i].l]^=1ULL<<i; out[e[i].r]^=1ULL<<i; } for (i=1;i<=n;i++) scanf ( "%d" ,&w[i]); ans=-inf; dfs(1,n); if (ans==-inf) puts ( "impossible" ); else printf ( "%d" ,ans); } |
F. Stage: Agausscrab
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 | #include<bits/stdc++.h> using namespace std; const int N=1e3+1e2+7; int n; string s[N]; int a[N]; int main() { ios::sync_with_stdio( false ); cin.tie(0); cin>>n; for ( int i=1;i<=n;i++) cin>>s[i]>>a[i]; string ans; for ( int i=1;i<=n;i++) { int r=0; for ( int j=1;j<=n;j++) if (a[j]>a[i]) r++; r+=1; for ( int j=1;j<=r;j++) if (s[i].size()) s[i].pop_back(); ans+=s[i]; } ans[0]=ans[0]- 'a' + 'A' ; cout<< "Stage: " <<ans<< "\n" ; } |
G. Crawling on a Tree
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<cstdio> #include<algorithm> #include<cstdlib> using namespace std; typedef long long ll; const int N=10005,M=10005; int n,m,i,lim[N],g[N],v[N<<1],w[N<<1],wt[N<<1],nxt[N<<1],ed; int wf[N],wk[N],need[N],sz[N],heavy[N]; ll ans[M]; struct E{ ll s,d[M]; int l,r; void clr(){ s=l=0;r=m; for ( int i=0;i<=m;i++)d[i]=0; } }f[15]; inline void add( int x, int y, int z, int k){ v[++ed]=y; w[ed]=z; wt[ed]=k; nxt[ed]=g[x]; g[x]=ed; } inline void merge( const E&A, const E&B,E&C){ int l=A.l+B.l,r=min(A.r+B.r,m); static ll d[M]; int i=A.l+1,j=B.l+1,k=l+1; while (k<=r&&i<=A.r&&j<=B.r)d[k++]=A.d[i]<B.d[j]?A.d[i++]:B.d[j++]; while (k<=r&&i<=A.r)d[k++]=A.d[i++]; while (k<=r&&j<=B.r)d[k++]=B.d[j++]; C.s=A.s+B.s; C.l=l; C.r=r; for ( int i=l+1;i<=r;i++)C.d[i]=d[i]; } void dfs( int x, int y){ need[x]=lim[x]; sz[x]=1; for ( int i=g[x];i;i=nxt[i]){ int u=v[i]; if (u==y) continue ; wf[u]=w[i]; wk[u]=wt[i]; dfs(u,x); sz[x]+=sz[u]; if (sz[u]>sz[heavy[x]])heavy[x]=u; need[x]=max(need[x],need[u]); } } void go( int x, int y, int o){ int u=heavy[x]; if (u){ go(u,x,o); f[o+1].clr(); merge(f[o],f[o+1],f[o]); } else f[o].clr(); for ( int i=g[x];i;i=nxt[i]){ int u=v[i]; if (u==y||u==heavy[x]) continue ; go(u,x,o+1); merge(f[o],f[o+1],f[o]); } int L=need[x],R=wk[x],W=wf[x]; int A=max(f[o].l,L*2-R),B=min(f[o].r,R); if (A>B){ for ( int i=1;i<=m;i++) puts ( "-1" ); exit (0); } for ( int i=f[o].l+1;i<=A;i++)f[o].s+=f[o].d[i]; f[o].l=A; f[o].r=B; f[o].s+=1LL*(max(L,A)*2-A)*W; for ( int i=A+1;i<=B&&i<=L;i++)f[o].d[i]-=W; for ( int i=max(A,L)+1;i<=B;i++)f[o].d[i]+=W; } int main(){ scanf ( "%d%d" ,&n,&m); for (i=1;i<n;i++){ int x,y,z,k; scanf ( "%d%d%d%d" ,&x,&y,&z,&k); add(x,y,z,k); add(y,x,z,k); } for (i=2;i<=n;i++) scanf ( "%d" ,&lim[i]); wk[1]=m*2; dfs(1,0); go(1,0,0); for (i=1;i<=m;i++)ans[i]=-1; ll sum=f[0].s; for (i=f[0].l;i<=m;i++){ if (i>=need[1])ans[i]=sum; if (i<m)sum+=f[0].d[i+1]; } for (i=1;i<=m;i++) printf ( "%lld\n" ,ans[i]); } |
H. Permutation
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 | #include <bits/stdc++.h> using namespace std; int n; const double C = ( sqrt (5) - 1) / 2; int f[1000005]; int d[1000005]; int qry( int l, int r) { cout << "? " << l << ' ' << r << '\n' ; fflush (stdout) ; int x ; cin >> x; return x; } void solv() { cin >> n; int l = 1 , r = n; int lst_pos = -1; while (l < r) { int c = d[r - l + 1]; // printf("C %d %d %d\n",l,r,c) ; if (lst_pos == -1) lst_pos = qry(l , r); if (r - l == 1) { if (lst_pos == l) l = r; else r = l; break ; } if (l + c - 1 >= lst_pos) { int x = qry(l , l + c - 1); if (x == lst_pos) r = l + c - 1; else { l = l + c; lst_pos = -1; } } else { int x = qry(r - c + 1 , r); if (x == lst_pos) l = r - c + 1; else { r = r - c; lst_pos = -1; } } } cout << "! " << l << '\n' ; fflush (stdout) ; return ; } int main() { // ios::sync_with_stdio(false) ; cin.tie(0) ; int t;cin >> t; f[1] = f[2] = 0; for ( int i = 3;i <= 1000000;i++) { int mxc = ( int )(C * i); f[i] = 1e9; for ( int j = max(mxc - 10 , (i + 1)/2) ; j <= min(i - 1 , mxc + 10) ; j++) { if (max(f[j] + 1 , f[i - j] + 2) < f[i]) { f[i] = max(f[j] + 1 , f[i - j] + 2) ; d[i] = j; } } // if(f[i] > ceil(1.5 * log2(i)) - 1) { // printf("%d %d %lf\n",i,f[i],ceil(1.5 * log2(i)) - 1); // } } // printf("%d\n",f[1000000]) ;? while (t--) solv() ; } |
I. Piggy Sort
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 | #include<bits/stdc++.h> using namespace std; #define int long long const int N=2e3+1e2+7; int T,n,m; int x[N][N],sx[N]; map< int , int > vis[N]; int use[N]; int av[N],bv[N],fd,ans[N]; void dfs( int t) { if (t==n+1) { vector< int > id(n); iota(id.begin(),id.end(),1); sort(id.begin(),id.end(),[&]( const int &a, const int &b){ if (av[a]*bv[b]!=av[b]*bv[a]) return av[a]*bv[b]<av[b]*bv[a]; return a<b; }); fd=1; for ( int i=0;i<n;i++) ans[id[i]]=i+1; for ( int i=1;i<=n;i++) cout<<ans[i]<< " \n" [i==n]; return ; } for ( int i=1;i<=n;i++) { if (use[i]) continue ; int va=x[2][i]-x[1][t]; int vb=sx[2]-sx[1]; int ok=1; for ( int j=3;j<=m;j++) { if (va*(sx[j]-sx[1])%vb) { ok=0; break ; } int w=va*(sx[j]-sx[1])/vb+x[1][t]; if (!vis[j].count(w)||!vis[j][w]) { ok=0; break ; } } if (ok) { for ( int j=1;j<=m;j++) { int w=va*(sx[j]-sx[1])/vb+x[1][t]; vis[j][w]--; } use[i]=1; av[t]=va,bv[t]=vb; dfs(t+1); use[i]=0; for ( int j=1;j<=m;j++) { int w=va*(sx[j]-sx[1])/vb; vis[j][w]++; } } } } signed main() { ios::sync_with_stdio( false ); cin.tie(0); cin>>T; while (T--) { cin>>n>>m; for ( int i=1;i<=m;i++) { vis[i].clear(); sx[i]=0; for ( int j=1;j<=n;j++) cin>>x[i][j],vis[i][x[i][j]]++,sx[i]+=x[i][j]; } if (sx[1]==sx[2]) { for ( int i=1;i<=n;i++) cout<<i<< " \n" [i==n]; continue ; } fd=0; dfs(1); assert (fd); } } /* 1 3 6 1 2 3 4 5 6 6 9 9 8 12 13 10 15 17 12 18 21 */ |
J. Even or Odd Spanning Tree
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 | #include<cstdio> #include<algorithm> using namespace std; const int N=200005,K=18,M=500005,inf=~0U>>1; int Case,n,m,cnt,i,j,x,y,z,tmp,f[N],g[N],v[N<<1],w[N<<1],nxt[N<<1],ed; int d[N],fa[N][K],fe[N][K],fo[N][K]; long long mst,ans; int delta; bool on[M]; struct E{ int x,y,z;}e[M]; inline bool cmp( const E&a, const E&b){ return a.z<b.z;} inline void umax( int &a, int b){a<b?(a=b):0;} int F( int x){ return f[x]==x?x:f[x]=F(f[x]);} inline void add( int x, int y, int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;} void dfs( int x, int y){ for ( int i=1;i<K;i++){ fa[x][i]=fa[fa[x][i-1]][i-1]; fe[x][i]=max(fe[x][i-1],fe[fa[x][i-1]][i-1]); fo[x][i]=max(fo[x][i-1],fo[fa[x][i-1]][i-1]); } for ( int i=g[x];i;i=nxt[i]){ int u=v[i],z=w[i]; if (u==y) continue ; d[u]=d[x]+1; fa[u][0]=x; if (z&1){ fe[u][0]=0; fo[u][0]=z; } else { fe[u][0]=z; fo[u][0]=0; } dfs(u,x); } } inline int ask( int x, int y, int w[][K]){ if (x==y) return 0; if (d[x]<d[y])swap(x,y); int ret=0; for ( int i=K-1;~i;i--) if (d[fa[x][i]]>=d[y]){ umax(ret,w[x][i]); x=fa[x][i]; } if (x==y) return ret; for ( int i=K-1;~i;i--) if (fa[x][i]!=fa[y][i]){ umax(ret,w[x][i]); umax(ret,w[y][i]); x=fa[x][i]; y=fa[y][i]; } umax(ret,w[x][0]); umax(ret,w[y][0]); return ret; } int main(){ scanf ( "%d" ,&Case); while (Case--){ scanf ( "%d%d" ,&n,&m); for (i=0;i<=n;i++){ g[i]=d[i]=0; for (j=0;j<K;j++)fa[i][j]=fe[i][j]=fo[i][j]=0; } mst=cnt=ed=0; for (i=1;i<=m;i++){ scanf ( "%d%d%d" ,&e[i].x,&e[i].y,&e[i].z); on[i]=0; } sort(e+1,e+m+1,cmp); for (i=1;i<=n;i++)f[i]=i; for (i=1;i<=m;i++){ x=e[i].x,y=e[i].y,z=e[i].z; if (F(x)==F(y)) continue ; on[i]=1; f[f[x]]=f[y]; mst+=z; cnt++; add(x,y,z),add(y,x,z); } if (cnt<n-1){ puts ( "-1 -1" ); continue ; } dfs(1,0); delta=inf; for (i=1;i<=m;i++){ if (on[i]) continue ; z=e[i].z; tmp=ask(e[i].x,e[i].y,z&1?fe:fo); if (!tmp) continue ; z-=tmp; if (delta>z)delta=z; } if (delta<inf)ans=mst+delta; else ans=-1; if (mst&1)swap(ans,mst); printf ( "%lld %lld\n" ,mst,ans); } } /* 3 2 1 1 2 5 3 1 1 3 1 4 4 1 2 1 1 3 1 1 4 1 2 4 2 */ |
K. Sugar Sweet 3
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 | #include <bits/stdc++.h> using namespace std; int A , B , C , x; int n ; const int N = 605; const int mod = 1e9 + 7; int fpow( int a, int b) { int ans = 1; while (b) { if (b & 1) ans = 1LL * ans * a %mod; a = 1LL * a * a %mod; b>>= 1; } return ans; } int F[N][N]; // int Ga[N][N] , Gb[N][N], Gc[N][N]; // int dota[N][N] , dotb[N][N] , dotc[N][N]; int dot[N][N]; int Cata[N] ; int d[N] ; int t[N * 2] , rt[N * 2] ; int lm ; ///多项式的项数 int mat[N][N] , rmat[N][N]; int C_( int a, int b) { return 1LL * t[a] * rt[b] % mod * rt[a - b] % mod; } int A_( int a, int b) { return 1LL * t[a] * rt[a - b] % mod; } vector< int > get_coe( int n , vector< int > w) { ///已知n个点值[1 to n],求sum{ai * wi} 对应的 di的系数,i from 0 to n - 1 for ( int i = 1;i <= n;i++) { for ( int j = 1;j <= n;j++) { mat[i][j] = fpow(i , j - 1) ; // MAT * A = D rmat[i][j] = (i == j) ; } } for ( int i = 1;i <= n;i++) { int cur = -1; for ( int j = i ;j <= n;j++) { if (mat[j][i]) {cur = j ; break ;} } for ( int j = 1;j <= n;j++) {swap(mat[cur][j] , mat[i][j]) ; swap(rmat[cur][j] , rmat[i][j]) ;} int r = fpow(mat[i][i] , mod - 2); for ( int j = 1;j <= n;j++) { if (i == j) continue ; int f = (mod - 1LL * mat[j][i] * r %mod) % mod; for ( int k = 1;k <= n;k++) {mat[j][k] = (mat[j][k] + 1LL * mat[i][k] * f) % mod ; rmat[j][k] = (rmat[j][k] + 1LL * rmat[i][k] * f) % mod;} } for ( int j = 1;j <= n;j++) { mat[i][j] = 1LL * mat[i][j] * r % mod; rmat[i][j] = 1LL * rmat[i][j] * r % mod; } } // for(int i = 1;i <= n;i++ , printf("\n")) for(int j = 1;j <= n;j++) printf("%d ",rmat[i][j]) ; ///A = Rmat * D vector< int > coe(n) ; for ( int i = 0;i < n;i++) { for ( int j = 0;j < n;j++) { coe[j] = (coe[j] + 1LL * w[i] * rmat[i + 1][j + 1]) % mod; } } return coe; } int main() { cin >> A >> B >> C >> x; n = A + B + C; if (n & 1) { cout << 0 ; return 0; } if (A > n/2 || B > n/2 || C > n/2) { cout << 0 ; return 0; } t[0] = rt[0] = 1; for ( int i = 1;i <= n + 1;i++) t[i] = 1LL * t[i - 1] * i % mod , rt[i] = fpow(t[i] , mod - 2) ; Cata[0] = 1; for ( int i = 1;i <= n/2;i++) Cata[i] = 1LL * C_(i*2 , i) * fpow(i + 1 , mod - 2) % mod; //// F[i][j]表示i个主元分j段的方案数,Fi(x)作为其egf F[0][0] = 1; lm = n / 2 + 1; for ( int i = 1;i <= n/2;i++) { for ( int j = 1;j <= i;j++) { for ( int k = 1;k <= i;k++) { ///最后一段包含的主元个数 F[i][j] = (F[i][j] + 1LL * F[i - k][j - 1] * Cata[k - 1]) % mod; } // printf("%d %d : %d\n",i,j,F[i][j]) ; } } for ( int i = 0;i <= n/2;i++) { for ( int j = 0;j <= i;j++) F[i][j] = 1LL * F[i][j] * rt[j] % mod ; ///变成egf for ( int j = 1;j <= lm;j++) { dot[i][j] = 0; for ( int k = i;k >= 0;k--) dot[i][j] = (1LL * dot[i][j] * j + F[i][k]) % mod; ///dot 代表点值 } } vector< int > w(n/2 + 1) ; for ( int i = 0;i <= n/2;i++) w[i] = 1LL * fpow(i , x) * t[i] % mod; vector< int > coe = get_coe(n/2 + 1 , w) ; /// coe.len = n/2 + 1 int ans = 0; for ( int a = 0;a <= n/2 && a <= A;a++) { for ( int b = 0;b + a <= n / 2 && b <= B;b++) { int c = n / 2 - a - b; if (c > C) continue ; /// F[a] * F[b] * F[c] for ( int i = 1;i <= lm;i++) d[i] = 1LL * dot[a][i] * dot[b][i] % mod * dot[c][i] % mod; // for(int i = 1;i <= lm;i++) printf("%d ",3LL * d[i] % mod) ; printf("\n") ; int sol = 0; for ( int i = 1;i <= lm;i++) sol = (sol + 1LL * d[i] * coe[i - 1]) % mod; int sol2 = 0; for ( int ab = 0;ab <= A - a && ab <= b; ab++){ int ac = (A - a - ab) ; int bc = (c - ac) ; int ba = (B - b - bc) ; int ca = (a - ba) ; int cb = (C - c - ca) ; if (ac < 0 || bc < 0 || ba < 0 || ca < 0 || cb < 0) continue ; sol2 = (sol2 + 1LL * C_(a , ba) * C_(b , ab) % mod * C_(c , ac)) % mod; } // printf("%d %d %d : %d %d\n",a,b,c,sol,sol2); ans = (ans + 1LL * sol * sol2) % mod; } } cout << ans << '\n' ; } |
L. Challenge Matrix Multiplication
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 | #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; typedef pair< int , int > pii; int to[N] , fir[N] , nxt[N] ; bool ok[N]; int cc = 0; int nc , nodes[N]; void adde( int u, int v) { ++cc; to[cc] = v; nxt[cc] = fir[u]; fir[u] = cc; } int in[N] , out[N] ; int n ,m ; int ans[N]; bool vis[N]; pii fr[N] ; int cnt = 0; int qu[N] , l , r; void bfs( int u) { l = 1 , r = 0; qu[++r] = u; vis[u] = 1; while (l <= r) { int u = qu[l++]; cnt++; for ( int i = fir[u] ; i ; i = nxt[i]) { if (!vis[to[i]]) { qu[++r] = to[i] ; vis[to[i]] = 1; } } } return ; } int main() { ios::sync_with_stdio( false ) ; cin.tie(0); cout.tie(0); clock_t cl = clock () ; cin >>n>>m; //printf("??? %d %d\n",n,m); for ( int i = 1;i <= m;i++) { int u , v;cin >> u >> v; in[v]++ ; out[u]++; adde(u , v); } for ( int i = 1;i <= n;i++) ans[i] = 1; int all = m; clock_t sum0 = 0 , sum1 = 0; while (all) { // clock_t a = clock(); for ( int i = 1;i <= n;i++) { if (in[i] < out[i]) { memset (vis,0, sizeof (vis)) ; vis[i] = 1; int lst; for ( int j = i ; j <= n;j++) { if (!vis[j]) continue ; if (in[j] > out[j]) {lst = j ; break ;} for ( int x = fir[j] ; x ; x = nxt[x]) { if (!vis[to[x]] && !ok[x]) { vis[to[x]] = 1; fr[to[x]] = {j , x}; } } } int u = lst ; nc = 0; while (u) { nodes[nc++] = u; if (u != i) in[u]--; if (u != lst) out[u]--; if (u == i) break ; ok[fr[u].second] = 1; u = fr[u].first ; all--; } break ; } } // sum0 += (clock() - a); // a = clock() ; cnt = 0; memset (vis,0, sizeof (vis)); for ( int i = 0;i < nc;i++) { bfs(nodes[i]) ; ans[nodes[i]] = cnt; } // static int gg = 0; // sum1 += (clock() - a) ; // printf("i-th round %d %d\n",++gg , nc) ; } // cerr << (double)(clock() - cl) / CLOCKS_PER_SEC <<' ' << (double)sum0 / CLOCKS_PER_SEC <<' ' << (double)sum1 / CLOCKS_PER_SEC << '\n'; // return 0; for ( int i = 1;i <= n;i++) cout << ans[i] << ' ' ; cout << '\n' ; } |
M. Triangles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio( false ); long long n,a,b; cin>>n>>a>>b; long long ans=0; for ( long long r=1;r<=n;r++) { ans+=r*(r+1); if (r*2>n)ans-=(r*2-n)*(r*2-n+1)/2; } for ( long long i=1;i<=b;i++) { ans-=(a-b+1); ans-=max(min(a+1-i,n-a)-(b-i),0ll); } cout<<ans<<endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决