题面

\(SUMAGCD\)

先去重,易知答案一定是一个数单独一组剩下的一组,前缀后缀\(gcd\)一下就行了

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define inline __inline__ __attribute__((always_inline))
  5. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  9. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  10. using namespace std;
  11. const int N=1e5+5;
  12. int a[N],suf[N],Pre[N],n,T,mx;
  13. int main(){
  14. for(scanf("%d",&T);T;--T){
  15. scanf("%d",&n),mx=0;
  16. fp(i,1,n)scanf("%d",&a[i]);
  17. sort(a+1,a+1+n),n=unique(a+1,a+1+n)-a-1;
  18. if(n==1){printf("%d\n",a[1]<<1);continue;}
  19. Pre[0]=0;fp(i,1,n)Pre[i]=__gcd(a[i],Pre[i-1]);
  20. suf[n+1]=0;fd(i,n,1)suf[i]=__gcd(suf[i+1],a[i]);
  21. fp(i,1,n)cmax(mx,a[i]+__gcd(Pre[i-1],suf[i+1]));
  22. printf("%d\n",mx);
  23. }
  24. return 0;
  25. }

\(CHFING\)

\(1\)到\(k-1\)肯定\(gg\),剩下的放到模\(k\)意义下,共有\(k\)个点,然后\(n-1\)条边,第\(i\)条边可以从\(c\)到\((c+k+i)\%k\),设\(dis_c\)表示到\(c\)点的最短路,那么\(dis_c+p\times k\)都是能被标识的,剩下的不行。然后再仔细讨论一下就行了

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define inline __inline__ __attribute__((always_inline))
  5. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  9. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  10. using namespace std;
  11. typedef long long ll;
  12. int T,res,p;ll n,k;
  13. const int P=1e9+7;
  14. inline int calc(R int x){return (1ll*x*(x+1)>>1)%P;}
  15. inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
  16. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  17. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  18. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  19. int ksm(R int x,R int y){
  20. R int res=1;
  21. for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
  22. return res;
  23. }
  24. int main(){
  25. for(scanf("%d",&T);T;--T){
  26. scanf("%lld%lld",&n,&k),p=(k-1)/(n-1)%P,n%=P,k%=P;
  27. res=add(mul(calc(p),n-1),mul(p+1,dec(k-1,mul(p,n-1))));
  28. res=add(res,P);
  29. printf("%d\n",res);
  30. }
  31. return 0;
  32. }

\(LENTMO\)

分情况讨论,如果\(k=n\)只有操作或不操作,如果\(k\)为奇数等价于\(k=1\),为偶数等价于\(k=2\)

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define inline __inline__ __attribute__((always_inline))
  5. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  9. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  10. using namespace std;
  11. typedef long long ll;
  12. const int N=1e5+5;
  13. int a[N],k,n,x,T;ll res,mx,sum[N];
  14. int main(){
  15. for(scanf("%d",&T);T;--T){
  16. scanf("%d",&n),mx=res=0;
  17. fp(i,1,n)scanf("%d",&a[i]);
  18. scanf("%d%d",&k,&x);
  19. fp(i,1,n)res+=a[i],a[i]=(a[i]^x)-a[i];
  20. sort(a+1,a+1+n);sum[n+1]=0;
  21. fd(i,n,1)sum[i]=sum[i+1]+a[i];
  22. if(k==n)cmax(mx,sum[1]);
  23. else if(k&1)fp(i,1,n)cmax(mx,sum[i]);
  24. else for(R int i=n-1;i>0;i-=2)cmax(mx,sum[i]);
  25. printf("%lld\n",res+mx);
  26. }
  27. return 0;
  28. }

\(INTRPATH\)

首先两条路径有交说明其中一个\(LCA\)在另一个上面。如果\((a,b)\)和\((u,v)\)交于\(w\)上,\(w\)必定是\(LCA(a,b)\)或\(LCA(u,v)\)

树剖,对于\(w\)是\(LCA(a,b)\)的情况,每个节点上记录不同时经过\(u\)和\(u\)的重儿子的简单路径的条数,然后做个前缀和。跳到另一条重链上的时候特殊处理一下,\(LCA\)上特殊处理一下

对于\(w\)是\(LCA(u,v)\)的情况,计算一下跨过这棵子树的路径条数就可以了

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define inline __inline__ __attribute__((always_inline))
  5. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  9. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  10. using namespace std;
  11. char buf[1<<21],*p1=buf,*p2=buf;
  12. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  13. int read(){
  14. R int res,f=1;R char ch;
  15. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  16. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  17. return res*f;
  18. }
  19. typedef long long ll;
  20. const int N=3e5+5;
  21. struct eg{int v,nx;}e[N<<1];int head[N],tot;
  22. inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
  23. int dfn[N],rk[N],sz[N],fa[N],dep[N],top[N],son[N];ll f[N],g[N],sum[N];
  24. int n,tim,q,T;
  25. inline void swap(R int &x,R int &y){R int t=x;x=y,y=t;}
  26. void dfs1(int u){
  27. sz[u]=1,dep[u]=dep[fa[u]]+1,f[u]=1,son[u]=0;
  28. go(u)if(v!=fa[u]){
  29. fa[v]=u,dfs1(v),f[u]+=1ll*sz[v]*sz[u],sz[u]+=sz[v];
  30. if(sz[v]>sz[son[u]])son[u]=v;
  31. }
  32. g[u]=1ll*(sz[u]-sz[son[u]])*sz[son[u]],f[u]-=g[u];
  33. }
  34. void dfs2(int u,int t){
  35. top[u]=t,sum[dfn[u]=++tim]=f[u];
  36. if(!son[u])return;dfs2(son[u],t);
  37. go(u)if(v!=fa[u]&&v!=son[u])dfs2(v,v);
  38. }
  39. int jump(int u,int lca){
  40. int tmp=0;
  41. while(top[u]!=top[lca])tmp=top[u],u=fa[tmp];
  42. return sz[u==lca?tmp:son[lca]];
  43. }
  44. ll query(int u,int v){
  45. if(u==v)return f[u]+g[u]+1ll*sz[u]*(n-sz[u]);
  46. ll res=0;int x=u,y=v,lca,si;ll s;
  47. while(top[u]!=top[v]){
  48. if(dep[top[u]]<dep[top[v]])swap(u,v);
  49. u=fa[top[u]];
  50. }
  51. lca=dep[u]<dep[v]?u:v,u=x,v=y;
  52. while(top[u]!=top[v]){
  53. if(dep[top[u]]<dep[top[v]])swap(u,v);
  54. res+=sum[dfn[u]]-sum[dfn[top[u]]-1],u=top[u];
  55. if(fa[u]!=lca)res+=g[fa[u]]-1ll*sz[u]*(sz[fa[u]]-sz[u]);
  56. u=fa[u];
  57. }
  58. if(dep[u]<dep[v])swap(u,v);
  59. res+=sum[dfn[u]]-sum[dfn[v]];
  60. u=x,v=y,x=y=0;
  61. if(u!=lca)res+=g[u],x=jump(u,lca);
  62. if(v!=lca)res+=g[v],y=jump(v,lca);
  63. s=f[lca]+g[lca],si=sz[lca],s-=1ll*x*(si-x),si-=x,s-=1ll*y*(si-y);
  64. res+=s,res+=1ll*(sz[lca]-x-y)*(n-sz[lca]);
  65. return res;
  66. }
  67. inline void clr(){memset(head,0,(n+1)<<2),memset(fa,0,(n+1)<<2),tot=tim=0;}
  68. int main(){
  69. // freopen("testdata.in","r",stdin);
  70. for(T=read();T;--T){
  71. n=read(),q=read();
  72. for(R int i=1,u,v;i<n;++i)u=read(),v=read(),add(u,v),add(v,u);
  73. dfs1(1),dfs2(1,1);
  74. fp(i,1,n)sum[i]+=sum[i-1];
  75. for(R int u,v;q;--q)u=read(),v=read(),printf("%lld\n",query(u,v));
  76. clr();
  77. }
  78. return 0;
  79. }

\(COOLCHEF\)

某位大佬:复杂度算啥能过就行

简单来说就是用\(vector\)存下每个数的出现位置,然后每一个询问暴力二分就可以了……我也不知道为什么能过……唯一的剪枝就是把总共出现次数只有一次的去掉……

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. using namespace std;
  8. char buf[1<<21],*p1=buf,*p2=buf;
  9. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  10. int read(){
  11. R int res,f=1;R char ch;
  12. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  13. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  14. return res*f;
  15. }
  16. const int N=3e5+5,P=1e9+7;
  17. inline void swap(R int &x,R int &y){R int t=x;x=y,y=t;}
  18. inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
  19. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  20. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  21. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  22. int ksm(R int x,R int y){
  23. R int res=1;
  24. for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
  25. return res;
  26. }
  27. vector<int>pos[N];int top,n,q,ans,m;
  28. int fac[N],ifac[N],b[N],a[N],sz[N],bg[N],ed[N],st[N];
  29. int main(){
  30. // freopen("testdata.in","r",stdin);
  31. n=read(),q=read();
  32. fp(i,1,n)a[i]=b[i]=read();
  33. fac[0]=ifac[0]=1;fp(i,1,n)fac[i]=mul(fac[i-1],i);
  34. ifac[n]=ksm(fac[n],P-2);fd(i,n-1,1)ifac[i]=mul(ifac[i+1],i+1);
  35. sort(b+1,b+1+n),m=unique(b+1,b+1+n)-b-1;
  36. fp(i,1,n)a[i]=lower_bound(b+1,b+1+m,a[i])-b,pos[a[i]].push_back(i);
  37. fp(i,1,m)if(pos[i].size()>1)
  38. st[++top]=i,bg[top]=pos[i].front(),ed[top]=pos[i].back();
  39. for(R int l1,l2,r1,r2,l,r,c;q;--q){
  40. l1=read(),l2=read(),r1=read(),r2=read();
  41. l=(1ll*l1*ans+l2)%n+1,r=(1ll*r1*ans+r2)%n+1;
  42. if(l>r)swap(l,r);
  43. ans=1;
  44. fp(i,1,top)if(bg[i]<=r&&ed[i]>=l){
  45. c=upper_bound(pos[st[i]].begin(),pos[st[i]].end(),r)
  46. -lower_bound(pos[st[i]].begin(),pos[st[i]].end(),l);
  47. ans=mul(ans,ifac[c]);
  48. }
  49. ans=mul(ans,fac[r-l+1]);
  50. printf("%d\n",ans);
  51. }
  52. return 0;
  53. }

\(COUNTIT\)

为了方便把前\(n\)个数记为\(a_i\),后\(m\)个数记为\(b_i\)

可以证明,当且仅当\(\max(a_i)=\max(b_i)\)一定是一组合法解(如果不想看证明的可以直接跳过)

必要性很显然。对于充分性,假设\(a_i\)和\(b_i\)的最大值都只有一个,那么把除了这一行一列之外的其他数都设为\(1\),这一行一列的数调整到满足对应行列的需求。如果有多个最大值同理

所以答案就是

\[\sum_{i=1}^k\left(i^n-(i-1)^n\right)(i^m-(i-1)^m)
\]

后面展开是一个\(n+m\)次多项式,前缀和是一个\(n+m+1\)次多项式,拉格朗日插值就行了

代码还没调出来再等等

好吧原来是拉格朗日插值打错了……

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. using namespace std;
  8. const int P=1e9+7;
  9. inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
  10. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  11. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  12. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  13. int ksm(R int x,R int y){
  14. R int res=1;
  15. for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
  16. return res;
  17. }
  18. const int N=5e5+5;
  19. int fn[N],fm[N],f[N],fac[N],ifac[N],Pre[N],suf[N],n,m,p,T,c;
  20. int Lagrange(int n,int k){
  21. if(k<=n)return f[k];
  22. Pre[0]=1;fp(i,1,n)Pre[i]=mul(Pre[i-1],k-i);
  23. suf[n+1]=1;fd(i,n,1)suf[i]=mul(suf[i+1],k-i);
  24. int res=0,ty=(n&1)?1:P-1;
  25. fp(i,1,n)upd(res,1ll*f[i]*ty%P*Pre[i-1]%P*suf[i+1]%P*ifac[i-1]%P*ifac[n-i]%P),ty=P-ty;
  26. return res;
  27. }
  28. int main(){
  29. // freopen("testdata.in","r",stdin);
  30. int t=2e5+10;
  31. fac[0]=ifac[0]=1;fp(i,1,t)fac[i]=mul(fac[i-1],i);
  32. ifac[t]=ksm(fac[t],P-2);fd(i,t-1,1)ifac[i]=mul(ifac[i+1],i+1);
  33. for(scanf("%d",&T);T;--T){
  34. scanf("%d%d%d",&n,&m,&p),c=n+m+5;
  35. fn[0]=fm[0]=0;
  36. fp(i,1,c)fn[i]=ksm(i,n);
  37. fp(i,1,c)fm[i]=ksm(i,m);
  38. fp(i,1,c)f[i]=mul(dec(fn[i],fn[i-1]),dec(fm[i],fm[i-1]));
  39. fp(i,1,c)upd(f[i],f[i-1]);
  40. printf("%d\n",Lagrange(c,p));
  41. }
  42. }

\(FGTREE\)

七月月赛都开了我才补完六月的……

我们对于\(dfs\)序从小到大考虑,维护一个栈,表示的是从根节点到当前节点的这条链,对于新的节点,如果还在这条链上就加入,否则说明之前有一些节点可以出栈了,那么就可以顺便更新左边界和他们的父亲

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. using namespace std;
  8. const int N=105;
  9. int fa[N],l[N],st[N],top,n,T;
  10. bool ask(int x,int l,int r){
  11. printf("Q %d %d %d\n",x,l,r),fflush(stdout);
  12. char s[5];scanf("%s",s);return s[0]=='Y';
  13. }
  14. int main(){
  15. for(scanf("%d",&T);T;--T){
  16. scanf("%d",&n),top=0;
  17. memset(fa,-1,(n+1)<<2);
  18. fp(i,1,n){
  19. int las=0;
  20. while(top&&ask(st[top],l[st[top]],i-1)){
  21. if(las)fa[las]=st[top];
  22. las=st[top--];
  23. }
  24. las?(fa[las]=i,l[i]=l[las]):l[i]=i;
  25. st[++top]=i;
  26. }
  27. while(top>1)fa[st[top]]=st[top-1],--top;
  28. putchar('A');
  29. fp(i,1,n)printf(" %d",fa[i]);
  30. puts(""),fflush(stdout);
  31. }
  32. return 0;
  33. }

Code Chef JUNE Challenge 2019题解的更多相关文章

  1. Code Chef February Challenge 2019题解

    传送门 \(HMAPPY2\) 咕 话说这题居然卡\(scanf\)的么??? int T;cin>>T; while(T--){ cin>>n>>a>> ...

  2. Code Chef January Challenge 2019题解

    传送门 \(div2\)那几道题不来做了太水了-- \(DPAIRS\) 一个显然合法的方案:\(A\)最小的和\(B\)所有连,\(A\)剩下的和\(B\)最大的连 算了咕上瘾了,咕咕咕 const ...

  3. Code Chef May Challenge 2019题解

    传送门 \(REDONE\) 贡献可以拆成\(X(Y+1)+Y\),那么一个数\(x\)的贡献对最终答案的贡献就是\(x(a_1+1)(a_2+1)...\),那么最终答案肯定是\(\sum\limi ...

  4. Code Chef October Challenge 2019题解

    传送门 \(MSV\) 设个阈值搞一搞就行了 //quming #include<bits/stdc++.h> #define R register #define pb emplace_ ...

  5. Code Chef April Cook-Off 2019题解

    传送门 \(PEWDSVTS\) 我哪根筋不对了要把所有可行的拿出来\(sort\)一下--还有忘开\(long\ long\)真的好难受-- int main(){ // freopen(" ...

  6. Code Chef December Challenge 2018题解

    传送门 \(MAXEP\) 二分,不过二分的时候要注意把\(mid\)设成\(\left\lfloor{9l+r\over 10}\right\rfloor\),这样往右的次数不会超过\(6\)次 / ...

  7. CodeChef April Challenge 2019题解

    传送门 \(Maximum\ Remaining\) 对于两个数\(a,b\),如果\(a=b\)没贡献,所以不妨假设\(a<b\),有\(a\%b=a\),而\(b\%a<a\).综上, ...

  8. CodeChef March Challenge 2019题解

    传送门 \(CHNUM\) 显然正数一组,负数一组 for(int T=read();T;--T){ n=read(),c=d=0; fp(i,1,n)x=read(),x>0?++c:++d; ...

  9. CodefChef September Challenge 2019 题解

    传送门 \(CHEFK1\) 首先连出一个环和所有的自环,剩下的每次按\(n\)个一连就可以了 //quming #include<bits/stdc++.h> #define R reg ...

随机推荐

  1. JDK8-lambda表达式以及接口可以定义默认方法

    一.Lambda表达式 1.Lamdba Lambda 允许把函数作为一个方法的参数,使用Lamdba可以让开发的代码更加简洁,但是易读性差,新人不了解Lamdba表达式或者代码功底有点差,不容易读懂 ...

  2. NEST 字符串sort

    text字符串sort会先分词.可先建立filed字段.并设置为keyword mapping public void Mapping() { var response = client.IndexE ...

  3. DBCP数据库连接池初探

    1. 概述 数据库连接是很“宝贵的”,如果每次获取Connection都去创建数据库连接,使用之后就断开,再次使用又重新创建,程序效率是很低的.因为Socket连接的建立很消耗资源. 所以需要数据库连 ...

  4. 什么是MBR

    MBR的定义 MBR(Main Boot Record)主引导记录是位于磁盘最前边的一段引导代码,由磁盘操作系统(DOS)在对磁盘初始化时产生,负责磁盘操作系统(DOS)对磁盘进行读写时磁盘分区合法性 ...

  5. jenkins配置Webhook-gitlab

    1.Jenkins 安装完成以后,首先我们在Jenkins中需要安装一下,Gitlab Hook Plugin,GitLab Plugin,Gitlab Authentication plugin插件 ...

  6. iOS - 外加字体(只需三步-教你轻松实现)

    外加字体 1.首先info.plist中加入属性Fonts provided by application,在item 0 处填写导入的ttf文件名 eg: <key>UIAppFonts ...

  7. 浮动和渐变色,定位position,元素的层叠顺序

    浮动: float 是我们网页布局的一种 浮动 可以有 left 左浮动 right 右浮动 两种 浮动的特点: 脱离正常的文档流,原本的空间不占据,浮动的标签都具有块级标签的一些特点,可以手动设置宽 ...

  8. DDL 操作表结构

    DDL 操作表结构:CRUD 一.C(create)创建 1.创建表 create table 表名( 列名1 数据类型1, 列名2 数据类型2, 列名3 数据类型3, ... 列名n 数据类型n ) ...

  9. 详解html中的marquee属性

    转自:https://www.jb51.net/web/531309.html 该标签不是HTML3.2的一部分,并且只支持MSIE3以后内核,所以如果你使用非IE内核浏览器(如:Netscape)可 ...

  10. Android多种方式实现相机圆形预览

    效果图如下: 一.为预览控件设置圆角 为控件设置ViewOutlineProvider public RoundTextureView(Context context, AttributeSet at ...