题解:

solution

Code:

A. Apple Business

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N=100010;
  7. int Case,len[N],n,m,i,mx,a[N],size[N],tmp[N];ll ans;
  8. vector<ll>v[N],f[N];
  9. struct E{int u,v,c,w;}e[N];
  10. inline bool cmp(const E&a,const E&b){return a.w>b.w;}
  11. void dfs(int x,int y){
  12. if(x>n)return;
  13. if(y>mx)mx=y;
  14. tmp[y]=a[x];
  15. dfs(x<<1,y<<1);
  16. dfs(x<<1|1,y<<1|1);
  17. }
  18. inline void init(int o){
  19. mx=0;
  20. dfs(o,1);
  21. size[o]=mx;
  22. v[o].resize(mx+1);
  23. f[o].resize(mx+1);
  24. for(int i=1;i<=mx;i++)v[o][i]=f[o][i]=tmp[i];
  25. }
  26. inline int getid(int x,int y){
  27. int k=1<<(len[y]-len[x]);
  28. return (y&(k-1))|k;
  29. }
  30. inline void append(int A,int B,int C,int W){
  31. int x,y,o,t,m;
  32. for(x=A;x;x>>=1){
  33. o=getid(x,B);
  34. m=size[x];
  35. ll dp=f[x][o];
  36. for(y=o>>1;y;o=y,y>>=1){
  37. dp+=v[x][y];
  38. t=y<<1;
  39. if(t<=m&&t!=o&&f[x][t]<0)dp+=f[x][t];
  40. t=y<<1|1;
  41. if(t<=m&&t!=o&&f[x][t]<0)dp+=f[x][t];
  42. }
  43. if(dp<C)C=dp;
  44. }
  45. if(!C)return;
  46. ans+=1LL*C*W;
  47. for(x=A;x;x>>=1){
  48. o=getid(x,B);
  49. m=size[x];
  50. v[x][o]-=C;
  51. f[x][o]-=C;
  52. for(y=o>>1;y;y>>=1){
  53. f[x][y]=v[x][y];
  54. t=y<<1;
  55. if(t<=m&&f[x][t]<0)f[x][y]+=f[x][t];
  56. t=y<<1|1;
  57. if(t<=m&&f[x][t]<0)f[x][y]+=f[x][t];
  58. }
  59. }
  60. }
  61. int main(){
  62. for(i=1;i<N;i++)len[i]=len[i>>1]+1;
  63. scanf("%d",&Case);
  64. while(Case--){
  65. scanf("%d%d",&n,&m);
  66. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  67. for(i=1;i<=n;i++)init(i);
  68. for(i=1;i<=m;i++)scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].c,&e[i].w);
  69. sort(e+1,e+m+1,cmp);
  70. ans=0;
  71. for(i=1;i<=m;i++)append(e[i].u,e[i].v,e[i].c,e[i].w);
  72. printf("%lld\n",ans);
  73. }
  74. }

  

B. Balanced Diet

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=100010;
  6. int T,n,m,i,j,k,l[N];ll f[N],s,A,B,d;
  7. struct E{int a,b;}e[N];
  8. inline bool cmp(const E&a,const E&b){return a.b==b.b?a.a>b.a:a.b<b.b;}
  9. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  10. int main(){
  11. scanf("%d",&T);
  12. while(T--){
  13. scanf("%d%d",&n,&m);
  14. for(i=1;i<=m;i++)scanf("%d",&l[i]);
  15. for(i=1;i<=n;i++)scanf("%d%d",&e[i].a,&e[i].b);
  16. sort(e+1,e+n+1,cmp);
  17. for(i=1;i<=n;i++)f[i]=0;
  18. for(i=1;i<=n;i=j){
  19. for(j=i;j<=n&&e[i].b==e[j].b;j++);
  20. s=0;
  21. for(k=i;k<j;k++){
  22. s+=e[k].a;
  23. if(k-i+1==l[e[i].b])f[k-i+1]+=s;
  24. if(k-i+1>l[e[i].b])f[k-i+1]+=e[k].a;
  25. }
  26. }
  27. for(i=1;i<=n;i++)f[i]+=f[i-1];
  28. A=f[1],B=1;
  29. for(i=2;i<=n;i++)if(f[i]*B>A*i)A=f[i],B=i;
  30. d=gcd(A,B);
  31. printf("%lld/%lld\n",A/d,B/d);
  32. }
  33. }

  

C. Line-line Intersection

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=100010;
  6. int Case,n,i;pair<ll,pair<ll,ll> >f[N],g[N];
  7. inline ll myabs(ll x){return x>0?x:-x;}
  8. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  9. inline ll cal(pair<ll,pair<ll,ll> >f[]){
  10. int i,j;
  11. ll ret=0;
  12. sort(f+1,f+n+1);
  13. for(i=1;i<=n;i=j){
  14. for(j=i;j<=n&&f[i]==f[j];j++);
  15. ret+=1LL*(j-i)*(j-i-1);
  16. }
  17. return ret/2;
  18. }
  19. int main(){
  20. scanf("%d",&Case);
  21. while(Case--){
  22. scanf("%d",&n);
  23. for(i=1;i<=n;i++){
  24. int x1,y1,x2,y2;
  25. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  26. int dx=x2-x1,dy=y2-y1;
  27. ll a,b,c;
  28. if(dx==0){
  29. a=1;
  30. b=0;
  31. c=-x1;
  32. }else{
  33. a=-dy;
  34. b=dx;
  35. c=1LL*dy*x1-1LL*dx*y1;
  36. }
  37. if(a<0)a=-a,b=-b,c=-c;
  38. if(a==0&&b<0)b=-b,c=-c;
  39. ll d=gcd(myabs(a),gcd(myabs(b),myabs(c)));
  40. a/=d,b/=d,c/=d;
  41. f[i].first=a,f[i].second.first=b,f[i].second.second=c;
  42. d=gcd(myabs(a),myabs(b));
  43. a/=d,b/=d;
  44. g[i].first=a,g[i].second.first=b,g[i].second.second=0;
  45. }
  46. printf("%lld\n",1LL*n*(n-1)/2-cal(g)+cal(f));
  47. }
  48. }

  

D. Master of Data Structure

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. const int N=500010,M=2010,K=M*4,inf=~0U>>1;
  5. int Case,n,m,i,o,x,y,z,root,op[M][4];
  6. int vip[N],g[N],v[N<<1],nxt[N<<1],ed,f[N],d[N],id[N],cnt;
  7. int at[K],G[K],W[K],NXT[K],F[K],D[K];
  8. int vv[K],ve[K];
  9. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
  10. inline void addedge(int x,int y,int z){NXT[y]=G[x];G[x]=y;W[y]=z;}
  11. inline void umin(int&a,int b){a>b?(a=b):0;}
  12. inline void umax(int&a,int b){a<b?(a=b):0;}
  13. inline int abs(int x){return x>0?x:-x;}
  14. inline void swap(int&a,int&b){int c=a;a=b;b=c;}
  15. void dfs(int x){
  16. int deg=0;
  17. for(int i=g[x];i;i=nxt[i]){
  18. int u=v[i];
  19. if(u==f[x])continue;
  20. f[u]=x;
  21. d[u]=d[x]+1;
  22. dfs(u);
  23. if(!id[u])continue;
  24. deg++;
  25. id[x]^=id[u];
  26. }
  27. if(deg>1)vip[x]=1;
  28. if(!vip[x])return;
  29. id[x]=++cnt;
  30. at[cnt]=x;
  31. for(int i=g[x];i;i=nxt[i]){
  32. int u=v[i];
  33. if(u==f[x])continue;
  34. u=id[u];
  35. if(!u)continue;
  36. addedge(cnt,u,d[at[u]]-d[x]-1);
  37. }
  38. }
  39. void dfs2(int x,int y){
  40. F[x]=y;
  41. D[x]=D[y]+1;
  42. for(int i=G[x];i;i=NXT[i])dfs2(i,x);
  43. }
  44. int main(){
  45. scanf("%d",&Case);
  46. while(Case--){
  47. scanf("%d%d",&n,&m);
  48. for(ed=cnt=i=0;i<=n;i++)f[i]=d[i]=id[i]=vip[i]=g[i]=0;
  49. memset(G,0,sizeof G);
  50. memset(W,0,sizeof W);
  51. memset(F,0,sizeof F);
  52. memset(D,0,sizeof D);
  53. memset(vv,0,sizeof vv);
  54. memset(ve,0,sizeof ve);
  55. for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
  56. for(i=1;i<=m;i++){
  57. scanf("%d%d%d",&o,&x,&y);
  58. vip[x]=vip[y]=1;
  59. op[i][0]=o;
  60. op[i][1]=x;
  61. op[i][2]=y;
  62. if(o==1||o==2||o==3||o==7)scanf("%d",&op[i][3]);
  63. }
  64. for(i=1;i<=n;i++)if(vip[i])root=i;
  65. dfs(root);
  66. dfs2(id[root],0);
  67. for(i=1;i<=m;i++){
  68. o=op[i][0];
  69. x=id[op[i][1]];
  70. y=id[op[i][2]];
  71. z=op[i][3];
  72. if(o==1){
  73. while(x!=y){
  74. if(D[x]<D[y])swap(x,y);
  75. vv[x]+=z;
  76. ve[x]+=z;
  77. x=F[x];
  78. }
  79. vv[x]+=z;
  80. }
  81. if(o==2){
  82. while(x!=y){
  83. if(D[x]<D[y])swap(x,y);
  84. vv[x]^=z;
  85. ve[x]^=z;
  86. x=F[x];
  87. }
  88. vv[x]^=z;
  89. }
  90. if(o==3){
  91. while(x!=y){
  92. if(D[x]<D[y])swap(x,y);
  93. if(vv[x]>=z)vv[x]-=z;
  94. if(ve[x]>=z)ve[x]-=z;
  95. x=F[x];
  96. }
  97. if(vv[x]>=z)vv[x]-=z;
  98. }
  99. if(o==4){
  100. long long ans=0;
  101. while(x!=y){
  102. if(D[x]<D[y])swap(x,y);
  103. ans+=vv[x];
  104. ans+=1LL*ve[x]*W[x];
  105. x=F[x];
  106. }
  107. printf("%lld\n",ans+vv[x]);
  108. }
  109. if(o==5){
  110. int ans=0;
  111. while(x!=y){
  112. if(D[x]<D[y])swap(x,y);
  113. ans^=vv[x];
  114. if(W[x]&1)ans^=ve[x];
  115. x=F[x];
  116. }
  117. printf("%d\n",ans^vv[x]);
  118. }
  119. if(o==6){
  120. int mi=inf,ma=0;
  121. while(x!=y){
  122. if(D[x]<D[y])swap(x,y);
  123. umin(mi,vv[x]);
  124. umax(ma,vv[x]);
  125. if(W[x]){
  126. umin(mi,ve[x]);
  127. umax(ma,ve[x]);
  128. }
  129. x=F[x];
  130. }
  131. umin(mi,vv[x]);
  132. umax(ma,vv[x]);
  133. printf("%d\n",ma-mi);
  134. }
  135. if(o==7){
  136. int ans=inf;
  137. while(x!=y){
  138. if(D[x]<D[y])swap(x,y);
  139. umin(ans,abs(vv[x]-z));
  140. if(W[x])umin(ans,abs(ve[x]-z));
  141. x=F[x];
  142. }
  143. umin(ans,abs(vv[x]-z));
  144. printf("%d\n",ans);
  145. }
  146. }
  147. }
  148. }

  

E. Minimum Spanning Tree

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N=100010;
  7. int Case,n,i,j,x,y,z;vector<int>f[N];ll ans;
  8. int main(){
  9. scanf("%d",&Case);
  10. while(Case--){
  11. scanf("%d",&n);
  12. for(i=1;i<=n;i++)f[i].clear();
  13. for(i=1;i<n;i++)scanf("%d%d%d",&x,&y,&z),f[x].push_back(z),f[y].push_back(z);
  14. ans=0;
  15. for(i=1;i<=n;i++)if(f[i].size()>1){
  16. sort(f[i].begin(),f[i].end());
  17. for(j=1;j<f[i].size();j++)ans+=f[i][0]+f[i][j];
  18. }
  19. printf("%lld\n",ans);
  20. }
  21. }

  

F. Mini-game Before Contest

  1. #include<cstdio>
  2. const int N=100010,M=200010,K=1<<24;
  3. int Case,n,m,i,j,k,S,A,B,x,y,z,o,deg[N],g[N],v[M],nxt[M],ed;
  4. bool isactor[6],isa[6],ismin[6];
  5. char tmp[9];
  6. int f[N][6],w[N][6][3];
  7. int q[K+5],h,t;
  8. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
  9. inline void ext(int x,int y,int B){
  10. int A=f[x][y];
  11. if(A==B)return;
  12. t=(t+1)&(K-1);
  13. q[t]=(x<<7)|(y<<4)|(A<<2)|B;
  14. f[x][y]=B;
  15. }
  16. inline void check(int x,int y){
  17. int ret;
  18. if(ismin[y]){
  19. if(w[x][y][0])ret=0;
  20. else if(w[x][y][1])ret=1;
  21. else ret=2;
  22. }else{
  23. if(w[x][y][2])ret=2;
  24. else if(w[x][y][1])ret=1;
  25. else ret=0;
  26. }
  27. ext(x,y,ret);
  28. }
  29. int main(){
  30. scanf("%d",&Case);
  31. while(Case--){
  32. scanf("%d%d",&n,&m);
  33. for(ed=i=0;i<=n;i++)deg[i]=g[i]=0;
  34. while(m--)scanf("%d%d",&x,&y),deg[x]++,add(y,x);
  35. scanf("%s",tmp);
  36. for(i=0;i<6;i++)isa[i]=tmp[i]=='A';
  37. scanf("%s",tmp);
  38. for(i=0;i<6;i++)isactor[i]=tmp[i]=='1';
  39. for(i=0;i<6;i++)ismin[i]=isa[i]^isactor[i];
  40. for(i=1;i<=n;i++)for(j=0;j<6;j++){
  41. f[i][j]=1;
  42. for(k=0;k<3;k++)w[i][j][k]=0;
  43. w[i][j][1]=deg[i];
  44. }
  45. h=1,t=0;
  46. for(i=1;i<=n;i++)if(!deg[i])for(j=0;j<6;j++){
  47. if(isa[j])ext(i,j,2);
  48. else ext(i,j,0);
  49. }
  50. while(h!=((t+1)&(K-1))){
  51. S=q[h];
  52. h=(h+1)&(K-1);
  53. x=S>>7,y=S>>4&7,A=S>>2&3,B=S&3;
  54. o=(y+5)%6;
  55. for(i=g[x];i;i=nxt[i]){
  56. z=v[i];
  57. w[z][o][A]--;
  58. w[z][o][B]++;
  59. check(z,o);
  60. }
  61. }
  62. for(i=1;i<=n;i++){
  63. if(f[i][0]==0)putchar('A');
  64. if(f[i][0]==1)putchar('D');
  65. if(f[i][0]==2)putchar('B');
  66. }
  67. puts("");
  68. }
  69. }

  

G. Radar Scanner

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=100010;
  6. int Case,n,m,i,j,e[N<<1];
  7. struct P{int l,r;}a[N],b[N];
  8. inline ll solve(P*a){
  9. m=0;
  10. ll ans=0;
  11. for(i=1;i<=n;i++){
  12. e[++m]=a[i].l;
  13. e[++m]=a[i].r;
  14. ans-=a[i].r-a[i].l;
  15. }
  16. sort(e+1,e+m+1);
  17. for(i=1;i<=m;i++)ans+=abs(e[i]-e[n]);
  18. return ans/2;
  19. }
  20. int main(){
  21. scanf("%d",&Case);
  22. while(Case--){
  23. scanf("%d",&n);
  24. for(i=1;i<=n;i++)scanf("%d%d%d%d",&a[i].l,&b[i].l,&a[i].r,&b[i].r);
  25. printf("%lld\n",solve(a)+solve(b));
  26. }
  27. }

  

H. Skyscraper

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=100010;
  4. int Case,n,m,i,op,x,y;ll z,a[N],b[N],f[N],g[N];
  5. inline void ins(ll*f,int x,ll p){for(;x<=n;x+=x&-x)f[x]+=p;}
  6. inline ll ask(ll*f,int x){ll t=0;for(;x;x-=x&-x)t+=f[x];return t;}
  7. int main(){
  8. scanf("%d",&Case);
  9. while(Case--){
  10. scanf("%d%d",&n,&m);
  11. for(i=1;i<=n;i++)scanf("%lld",&a[i]);
  12. for(i=1;i<=n;i++)b[i]=a[i]-a[i-1];
  13. for(i=1;i<=n;i++)f[i]=g[i]=0;
  14. for(i=1;i<=n;i++){
  15. ins(f,i,b[i]);
  16. if(b[i]>0)ins(g,i,b[i]);
  17. }
  18. while(m--){
  19. scanf("%d%d%d",&op,&x,&y);
  20. if(op==1){
  21. y++;
  22. scanf("%lld",&z);
  23. ins(f,x,z);
  24. ins(f,y,-z);
  25. if(b[x]>0)ins(g,x,-b[x]);
  26. if(b[y]>0)ins(g,y,-b[y]);
  27. b[x]+=z;
  28. b[y]-=z;
  29. if(b[x]>0)ins(g,x,b[x]);
  30. if(b[y]>0)ins(g,y,b[y]);
  31. }else{
  32. printf("%lld\n",ask(f,x)+ask(g,y)-ask(g,x));
  33. }
  34. }
  35. }
  36. }

  

I. Temperature Survey

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<map>
  4. using namespace std;
  5. const int N=524288,M=200010,K=18,P=998244353,G=3;
  6. typedef unsigned int uint32;
  7. typedef long long int64;
  8. typedef unsigned long long uint64;
  9. typedef uint32 word;
  10. typedef uint64 dword;
  11. typedef int sword;
  12. const int word_bits=sizeof(word)*8;
  13. word mod,Modinv,r2;
  14. struct UnsafeMod{
  15. word x;
  16. UnsafeMod(): x(0) {}
  17. UnsafeMod(word _x): x(init(_x)) {}
  18. UnsafeMod& operator += (const UnsafeMod& rhs) {
  19. (x += rhs.x) >= mod && (x -= mod);
  20. return *this;
  21. }
  22. UnsafeMod& operator -= (const UnsafeMod& rhs) {
  23. sword(x -= rhs.x) < 0 && (x += mod);
  24. return *this;
  25. }
  26. UnsafeMod& operator *= (const UnsafeMod& rhs) {
  27. x = reduce(dword(x) * rhs.x);
  28. return *this;
  29. }
  30. UnsafeMod operator + (const UnsafeMod &rhs) const {
  31. return UnsafeMod(*this) += rhs;
  32. }
  33. UnsafeMod operator - (const UnsafeMod &rhs) const {
  34. return UnsafeMod(*this) -= rhs;
  35. }
  36. UnsafeMod operator * (const UnsafeMod &rhs) const {
  37. return UnsafeMod(*this) *= rhs;
  38. }
  39. UnsafeMod pow(uint64 e) const {
  40. UnsafeMod ret(1);
  41. for (UnsafeMod base = *this; e; e >>= 1, base *= base) {
  42. if (e & 1) ret *= base;
  43. }
  44. return ret;
  45. }
  46. word get() const {
  47. return reduce(x);
  48. }
  49. static word modulus() {
  50. return mod;
  51. }
  52. static word init(word w) {
  53. return reduce(dword(w) * r2);
  54. }
  55. static void set_mod(word m) {
  56. mod = m;
  57. Modinv = mul_inv(mod);
  58. r2 = -dword(mod) % mod;
  59. }
  60. static word reduce(dword x) {
  61. word y = word(x >> word_bits) - word((dword(word(x) * Modinv) * mod) >> word_bits);
  62. return sword(y) < 0 ? y + mod : y;
  63. }
  64. static word mul_inv(word n, int e = 6, word x = 1) {
  65. return !e ? x : mul_inv(n, e - 1, x * (2 - x * n));
  66. }
  67. };
  68. int Case,n,i,j,lim[M];
  69. UnsafeMod a[M],b[M],c[M],d[M];
  70. UnsafeMod ta[N+5],tb[N+5];
  71. UnsafeMod g[K+1],ng[K+10],gw[N+10],ngw[N+10];
  72. int pos[N+10],inv[N+10];
  73. UnsafeMod fac[N+5],rev[N+5];
  74. map<int,UnsafeMod>f[M];
  75. struct E{int xl,xr,yl,yr;}e[M];
  76. inline UnsafeMod C(int n,int m){return n<m?0:fac[n]*rev[m]*rev[n-m];}
  77. inline void NTT(UnsafeMod*a,int n,int t){
  78. int j=__builtin_ctz(n)-1;
  79. for(int i=0;i<n;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
  80. for(int i=1;i<n;i++)if(i<pos[i])std::swap(a[i],a[pos[i]]);
  81. for(int d=0;(1<<d)<n;d++){
  82. int m=1<<d,m2=m<<1;
  83. UnsafeMod*_w=t==1?gw:ngw;
  84. _w+=m;
  85. for(int i=0;i<n;i+=m2){
  86. UnsafeMod*w=_w;
  87. for(int j=i;j<m+i;j++,w++){
  88. UnsafeMod t=*w*a[j+m];
  89. a[j+m]=a[j]-t;
  90. a[j]+=t;
  91. }
  92. }
  93. }
  94. if(t==-1){
  95. UnsafeMod j=inv[n];
  96. for(int i=0;i<n;i++)a[i]*=j;
  97. }
  98. }
  99. void build(int l,int r,int yl){
  100. if(l>r)return;
  101. int mid=(l+r)>>1;
  102. e[mid].xl=mid;
  103. e[mid].xr=r;
  104. e[mid].yl=yl;
  105. e[mid].yr=lim[mid];
  106. build(l,mid-1,yl);
  107. build(mid+1,r,lim[mid]+1);
  108. }
  109. inline UnsafeMod cal(int x,int y){
  110. UnsafeMod t=0;
  111. if(x>1)t=f[x-1][y];
  112. if(y>1)t+=f[x][y-1];
  113. return f[x][y]=t;
  114. }
  115. inline void work0(int n,int m,UnsafeMod*a,UnsafeMod*b){
  116. int i,k;
  117. for(k=1;k<=(n-1)*2;k<<=1);
  118. for(i=0;i<k;i++)ta[i]=tb[i]=0;
  119. for(i=0;i<n;i++){
  120. ta[i]=a[i]*rev[m];
  121. tb[i]=fac[i+m]*rev[i];
  122. }
  123. NTT(ta,k,1),NTT(tb,k,1);
  124. for(i=0;i<k;i++)ta[i]*=tb[i];
  125. NTT(ta,k,-1);
  126. for(i=0;i<n;i++)b[i]+=ta[i];
  127. }
  128. inline void work1(int n,int m,UnsafeMod*a,UnsafeMod*b){
  129. int i,k;
  130. for(k=1;k<=n+n+m-2;k<<=1);
  131. for(i=0;i<k;i++)ta[i]=tb[i]=0;
  132. for(i=0;i<n;i++)ta[i]=a[i]*rev[n-i];
  133. for(i=0;i<n+m;i++)tb[i]=fac[i];
  134. NTT(ta,k,1),NTT(tb,k,1);
  135. for(i=0;i<k;i++)ta[i]*=tb[i];
  136. NTT(ta,k,-1);
  137. for(i=0;i<m;i++)b[i]+=ta[i+n]*rev[i];
  138. }
  139. inline void solve(int o){
  140. int xl=e[o].xl,xr=e[o].xr,yl=e[o].yl,yr=e[o].yr;
  141. if(yl>yr)return;
  142. int i,j,k,ca,cb;
  143. if(xl==1){
  144. for(i=xl;i<=xr;i++)for(j=yl;j<=yr;j++)f[i][j]=C(i+j-2,i-1);
  145. return;
  146. }
  147. cal(xl,yl);
  148. for(i=yl+1,k=0;i<=yr;i++,k++)a[k]=cal(xl,i);
  149. for(i=xl+1,k=0;i<=xr;i++,k++)b[k]=cal(i,yl);
  150. ca=yr-yl-1;
  151. cb=xr-xl-1;
  152. if(ca<=0||cb<=0){
  153. for(i=xl;i<=xr;i++)for(j=yl;j<=yr;j++){
  154. if(i==xl||j==yl)continue;
  155. cal(i,j);
  156. }
  157. return;
  158. }
  159. for(i=0;i<ca;i++)c[i]=b[cb];
  160. for(i=0;i<cb;i++)d[i]=a[ca];
  161. work0(ca,cb,a,c);
  162. work0(cb,ca,b,d);
  163. work1(ca,cb,a,d);
  164. work1(cb,ca,b,c);
  165. for(i=0;i<ca;i++)f[xr][yl+i+1]=c[i];
  166. for(i=0;i<cb;i++)f[xl+i+1][yr]=d[i];
  167. f[xr][yr]=c[ca-1]+d[cb-1];
  168. }
  169. int main(){
  170. UnsafeMod::set_mod(P);
  171. for(g[K]=((UnsafeMod)G).pow((P-1)/N),ng[K]=g[K].pow(P-2),i=K-1;~i;i--)g[i]=g[i+1]*g[i+1],ng[i]=ng[i+1]*ng[i+1];
  172. for(i=0;i<=K;i++){
  173. gw[1<<i]=ngw[1<<i]=1;
  174. for(j=1;j<1<<i;j++){
  175. gw[(1<<i)+j]=gw[(1<<i)+j-1]*g[i];
  176. ngw[(1<<i)+j]=ngw[(1<<i)+j-1]*ng[i];
  177. }
  178. }
  179. for(inv[0]=inv[1]=1,i=2;i<=N;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
  180. for(rev[0]=rev[1]=1,i=2;i<=N;i++)rev[i]=rev[i-1]*inv[i];
  181. for(fac[0]=i=1;i<=N;i++)fac[i]=fac[i-1]*i;
  182. scanf("%d",&Case);
  183. while(Case--){
  184. scanf("%d",&n);
  185. for(i=1;i<=n;i++)scanf("%d",&lim[i]);
  186. n++;
  187. lim[n]=lim[n-1];
  188. for(i=1;i<=n;i++)f[i].clear();
  189. build(1,n,1);
  190. for(i=1;i<=n;i++)solve(i);
  191. printf("%u\n",f[n][lim[n]].get());
  192. }
  193. }

  

J. Time Limit

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. int Case,n,i,x,ans;
  5. int main(){
  6. scanf("%d",&Case);
  7. while(Case--){
  8. scanf("%d",&n);
  9. for(i=1;i<=n;i++){
  10. scanf("%d",&x);
  11. if(i==1)ans=x*3;
  12. else ans=max(ans,x+1);
  13. }
  14. while(ans%2)ans++;
  15. printf("%d\n",ans);
  16. }
  17. }

  

The 13th Chinese Northeast Collegiate Programming Contest的更多相关文章

  1. 【The 13th Chinese Northeast Collegiate Programming Contest E题】

    题目大意:给定一棵 N 个点的树,边有边权,定义"线树"为一个图,其中图的顶点是原树中的边,原树中两条有公共端点的边对应在线图中存在一条边,边权为树中两条边的边权和,求线图的最小生 ...

  2. 【The 13th Chinese Northeast Collegiate Programming Contest H 题】

    题目大意:NOIP2018d1t1 支持 M 次区间查询答案和区间修改操作. 题解: 首先考虑不带区间修改的情况.从左到右进行考虑,发现对于第 i 个数来说,对答案的贡献仅仅取决于第 i-1 个数的大 ...

  3. The 13th Chinese Northeast Collegiate Programming Contest(B C E F H J)

    B. Balanced Diet 思路:把每一块选C个产生的价值记录下来,然后从小到大枚举C. #include<bits/stdc++.h> using namespace std; ; ...

  4. ZOJ 3946.Highway Project(The 13th Zhejiang Provincial Collegiate Programming Contest.K) SPFA

    ZOJ Problem Set - 3946 Highway Project Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward, the ...

  5. The 13th Zhejiang Provincial Collegiate Programming Contest - D

    The Lucky Week Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward, the headmaster of the Marja ...

  6. The 13th Zhejiang Provincial Collegiate Programming Contest - I

    People Counting Time Limit: 2 Seconds      Memory Limit: 65536 KB In a BG (dinner gathering) for ZJU ...

  7. The 13th Zhejiang Provincial Collegiate Programming Contest - C

    Defuse the Bomb Time Limit: 2 Seconds      Memory Limit: 65536 KB The bomb is about to explode! Plea ...

  8. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Moving On

    Firdaws and Fatinah are living in a country with nn cities, numbered from 11 to nn.Each city has a r ...

  9. The 2015 China Collegiate Programming Contest A. Secrete Master Plan hdu5540

    Secrete Master Plan Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

随机推荐

  1. Unity Glossary

    https://docs.unity3d.com/2018.4/Documentation/Manual/Glossary.html 2D terms 2D Physics terms AI term ...

  2. RedisHelper (C#)

    <add key="RedisServers" value="172.20.2.90:9379,password=Aa+123456789" /> ...

  3. kettle文件输入 通配符匹配多个文件

    写法:采用正则表达式写法,例如:.*\.txt,记得要先点“确定”在打开点“显示文件名”  有时候未保存所以显示不出来

  4. 不常用但是又得有的一个标签——音频(audio)

    这几天做一个项目里面出现了H5的一个标签,音频(audio),可以说这是我第一次遇见这种标签基本上很少用的,也许是我做的项目少吧, 下面我来说一下我的思路,当然这是我自己想的,当时我想到的是如何让一个 ...

  5. SpringBoot入门-SpringBoot性能优化

    SpringBoot启动优化 显示声明扫包范围: 即不使用@SpringBootApplication默认扫包,使用@ComponentScan(basePackages = { "com. ...

  6. iframe嵌套页面中的跳转

    简单说一下场景. 假设有A.B.C和D四个JSP页面,D通过iframe嵌套在C中,C通过iframe嵌套在B中,B通过iframe嵌套在A中. 然后现在在D中编写JavaScript代码跳转页面. ...

  7. 关于 BenchmarkDotNet

    using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Order; using System.Reflection; namespace Be ...

  8. [CrackMe]160个CrackMe之001

    吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.Serial/Name 之 暴力破解 1. 熟悉界面:很常规的一个界面,输入完账号密码之后会进行验证.  2. ...

  9. C# 三元表达式

    一.背景 因编程的基础差,因此最近开始巩固学习C#基础,后期把自己学习的东西,总结相应文章中,有不足处请大家多多指教. 二.语法 表达式1?表达式2:表达式3 描述: 表达式1一般为一个关系表达式. ...

  10. vue 脚手架搭建步骤!

    ========================================================== 说出来都是泪,最开始都不知道从哪里开始(回头一看还是很简单的,关键是要找到入口)  ...