传送门

\(A\)

咕咕

  1. const int N=1005;
  2. int a[N],n,T;
  3. int main(){
  4. for(scanf("%d",&T);T;--T){
  5. scanf("%d",&n);
  6. fp(i,1,10)a[i]=n%10,n/=10;
  7. R int fl=1;
  8. fp(i,1,9)if(a[i]<a[i+1]){fl=0;break;}
  9. if(!fl)puts("Impossible");
  10. else printf("%d\n",a[1]);
  11. }
  12. return 0;
  13. }

\(B\)

枚举内心,那么三个点合法当且仅当到这个内心距离相同,组合数算一下就行了

  1. typedef long long ll;
  2. const int N=2005;
  3. int x[N],y[N],n;ll res,dis[N];
  4. inline ll d(R int i,R int j){return 1ll*(x[i]-x[j])*(x[i]-x[j])+1ll*(y[i]-y[j])*(y[i]-y[j]);}
  5. inline ll calc(R int x){return 1ll*x*(x-1)*(x-2)/6;}
  6. int main(){
  7. scanf("%d",&n);
  8. fp(i,1,n)scanf("%d%d",&x[i],&y[i]);
  9. fp(i,1,n){
  10. R int tot=0;
  11. fp(j,1,n)if(i!=j)dis[++tot]=d(i,j);
  12. sort(dis+1,dis+1+tot);
  13. for(R int l=1,r=1;l<=tot;l=r){
  14. while(r<=tot&&dis[r]==dis[l])++r;
  15. res+=calc(r-l);
  16. }
  17. }
  18. printf("%lld\n",res);
  19. return 0;
  20. }

\(C\)

首先肯定存在一个分界点,满足前面是\(A\)掉的,后面是没交过或者fst的,记最后一个\(A\)掉的人为\(i\),那么\(i\)以及之前要满足\(a_i\)递增,\(i\)之后的要能分成两个集合,一个是fst的,一个是没交的,两个都要满足\(a_i\)递增,且fst的所有人的编号都小于没交的人的编号,同时任意一个\(a_j<a_i\)的\(j\)都必须是fst的,直接暴力\(check\)就行了

  1. //quming
  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. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. const int N=505;
  11. int a[N],stx[N],sty[N],id[N],fl[N],fr[N],tx,ty,n,T,l,r;
  12. bool ck(int l,int r,int tt){
  13. if(l>=r)return 1;
  14. int top=0;
  15. fp(i,l,r)id[++top]=i;
  16. sort(id+1,id+1+top,[](const int &x,const int &y){return a[x]<a[y];});
  17. fl[0]=fr[top+1]=1,id[0]=l-1,id[top+1]=r+1;
  18. fp(i,1,top)fl[i]=fl[i-1]&(id[i]>id[i-1]);
  19. fd(i,top,1)fr[i]=fr[i+1]&(id[i]<id[i+1]);
  20. fp(i,tt,top)if(fl[i]&&fr[i+1])return true;
  21. return false;
  22. }
  23. int main(){
  24. // freopen("testdata.in","r",stdin);
  25. for(scanf("%d",&T);T;--T){
  26. scanf("%d",&n),l=n+1,r=0;
  27. fp(i,1,n)scanf("%d",&a[i]);
  28. a[n+1]=n+1,a[0]=0;
  29. fp(i,0,n){
  30. if(i&&a[i]<a[i-1])break;
  31. if(ck(i+1,n,a[i]-i))cmin(l,i),cmax(r,i);
  32. }
  33. if(l>r)l=r=-1;
  34. printf("%d %d\n",l,r);
  35. }
  36. return 0;
  37. }

\(D\)

这个数字\(s\)要能被表示成若干个\({10^k-1\over 9}\)之和,那么就是\(9s\)要能表示成若干个\(10^k-1\)之和,我们枚举数字个数\(p\),那么就是\(9s+p\)能被表示成\(10^k\)之和,条件就是\(p\)大于等于所有数位之和,且由于一次进位是让某一位-10,另一位+1,所以还要满足\(p\)和所有数位之和在模\(9\)意义下相等。显然\(p\)是\(O(|s|)\)级别的,根据\(01\)计算器的原理,复杂度\(O(|s|)\)

  1. //quming
  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. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. const int N=2e6+5;
  11. char s[N];int a[N],q[N],h,t,n,res,T,sum;
  12. inline int min(R int x,R int y){return x<y?x:y;}
  13. int calc(){
  14. fp(k,1,23333333){
  15. R int i=1;
  16. while(a[i]==9)a[i++]=0,sum-=9;
  17. ++a[i],++sum;
  18. if(k>=sum&&sum%9==k%9)return k;
  19. }
  20. }
  21. int main(){
  22. // freopen("testdata.in","r",stdin);
  23. for(scanf("%d",&T);T;--T){
  24. scanf("%s",s+1),n=strlen(s+1);
  25. fp(i,1,n)a[i]=s[n-i+1]-'0',a[i]=a[i]*9;
  26. fp(i,1,n-1)a[i+1]+=a[i]/10,a[i]%=10;
  27. for(;a[n]>9;++n)a[n+1]=a[n]/10,a[n]%=10;
  28. fp(i,n+1,n+233333)a[i]=0;
  29. sum=0;
  30. fp(i,1,n)sum+=a[i];
  31. printf("%d\n",calc());
  32. }
  33. return 0;
  34. }

\(E\)

对于某一个元素,我们把对他进行的所有操作放在时间轴上,一个push记为+1,一个pop记为-1,那么一次时间t时的query,就是找到一个最大的i,满足[i,t]之和大于等于pos,那么这个i处肯定是一个push,且这个push的元素即为答案了

那么对于区间push和区间pop直接离线,然后就能维护每个元素的所有操作的时间轴了

代码里实现的时候略微有点不同,因为查询[i,t]太难写了,所以我代码里是把时间轴反过来,然后查询一个最小的满足条件的前缀和的位置的,且push记为-1,pop记为+1,所以看代码的时候注意一下

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define pb push_back
  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=2e5+5;
  12. inline int min(R int x,R int y){return x<y?x:y;}
  13. struct node;typedef node* ptr;
  14. struct node{
  15. ptr lc,rc;int t,mn;
  16. inline void ppd(R int x){t+=x,mn+=x;}
  17. inline void pd(){if(t)lc->ppd(t),rc->ppd(t),t=0;}
  18. inline void upd(){mn=min(lc->mn,rc->mn);}
  19. }e[N<<2],*rt,*pp=e;
  20. int a[N],n,q;
  21. char s[15];vector<int>ad[N],ed[N],qr[N];
  22. void build(ptr &p,int l,int r){
  23. p=++pp;if(l==r)return;
  24. int mid=(l+r)>>1;
  25. build(p->lc,l,mid),build(p->rc,mid+1,r);
  26. p->upd();
  27. }
  28. int K,ans,ANS[N];
  29. void query(ptr p,int l,int r,int x){
  30. if(l==r)return ans=r,void();
  31. int mid=(l+r)>>1;p->pd();
  32. if(!ans&&x<=mid&&p->lc->mn<=K)query(p->lc,l,mid,x);
  33. if(!ans&&x<=r&&p->rc->mn<=K)query(p->rc,mid+1,r,x);
  34. }
  35. int get(ptr p,int l,int r,int x){
  36. if(l==r)return p->mn;
  37. int mid=(l+r)>>1;p->pd();
  38. return x<=mid?get(p->lc,l,mid,x):get(p->rc,mid+1,r,x);
  39. }
  40. void update(ptr p,int l,int r,int ql,int qr,int v){
  41. if(ql<=l&&qr>=r)return p->ppd(v),void();
  42. int mid=(l+r)>>1;p->pd();
  43. if(ql<=mid)update(p->lc,l,mid,ql,qr,v);
  44. if(qr>mid)update(p->rc,mid+1,r,ql,qr,v);
  45. p->upd();
  46. }
  47. int main(){
  48. // freopen("testdata.in","r",stdin);
  49. scanf("%d%d",&n,&q);
  50. build(rt,1,q);
  51. for(R int i=1,l,r,v,id;i<=q;++i){
  52. scanf("%s",s+1);
  53. switch(s[2]){
  54. case 'u':{
  55. scanf("%d%d%d",&l,&r,&v);
  56. a[q-i+1]=v,ad[l].pb(q-i+1),ed[r+1].pb(q-i+1);
  57. break;
  58. }
  59. case 'o':{
  60. scanf("%d%d",&l,&r);
  61. ed[l].pb(q-i+1),ad[r+1].pb(q-i+1);
  62. break;
  63. }
  64. case 'i':{
  65. scanf("%d%d",&id,&v);
  66. a[q-i+1]=v,qr[id].pb(q-i+1);
  67. break;
  68. }
  69. }
  70. }
  71. fp(i,1,n){
  72. for(auto v:ad[i])update(rt,1,q,v,q,-1);
  73. for(auto v:ed[i])update(rt,1,q,v,q,1);
  74. for(auto v:qr[i]){
  75. K=get(rt,1,q,v)-a[v],ans=0;
  76. query(rt,1,q,v);
  77. // printf("%d %d\n",v,ans);
  78. ANS[v]=a[ans];
  79. }
  80. }
  81. fd(i,q,1)if(ANS[i])printf("%d\n",ANS[i]);
  82. return 0;
  83. }

\(F\)

对于\(C\),我们从后往前来枚举\(i\)并判断\([i+1,n]\)是否可行,由于是从后往前,那么相当于每次往集合里加入一个数,我们记\(ql\)和\(qr\)表示sort之后,开头最长值域和下标都递增的长度以及结尾最长值域和下标都递增的长度,每次用新插入的这个数更新ql和qr就行了,用平衡树维护一下即可,代码写的FHQtreap

  1. //quming
  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. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. unsigned int aaa=19260817;
  11. inline unsigned int rd(){aaa^=aaa>>15,aaa+=aaa<<12,aaa^=aaa>>3;return aaa;}
  12. const int N=2e5+5;
  13. struct node;typedef node* ptr;
  14. struct node{
  15. ptr lc,rc;int v,sz;unsigned int pr;
  16. inline void init(R int val){v=val,pr=rd(),sz=1;}
  17. inline ptr upd(){return sz=lc->sz+rc->sz+1,this;}
  18. }e[N],*rt=e;int tot;
  19. inline ptr newnode(R int v){return e[++tot].init(v),(e+tot)->lc=(e+tot)->rc=e,e+tot;}
  20. void split(ptr p,int k,ptr &s,ptr &t){
  21. if(p==e)return s=t=e,void();
  22. if(p->v<=k)s=p,split(p->rc,k,p->rc,t);
  23. else t=p,split(p->lc,k,s,p->lc);
  24. p->upd();
  25. }
  26. ptr merge(ptr s,ptr t){
  27. if(s==e)return t;if(t==e)return s;
  28. if(s->pr<t->pr)return s->rc=merge(s->rc,t),s->upd();
  29. return t->lc=merge(s,t->lc),t->upd();
  30. }
  31. void insert(int k){
  32. ptr s,t;
  33. split(rt,k,s,t);
  34. rt=merge(merge(s,newnode(k)),t);
  35. }
  36. void erase(int k){
  37. ptr s,t,p;
  38. split(rt,k,s,t),split(s,k-1,s,p),p=merge(p->lc,p->rc);
  39. rt=merge(merge(s,p),t);
  40. }
  41. int rk(int k){
  42. ptr s,t;int now;
  43. split(rt,k-1,s,t);now=s->sz+1;
  44. return rt=merge(s,t),now;
  45. }
  46. int Kth(ptr p,int k){
  47. if(p->lc->sz==k-1)return p->v;
  48. if(p->lc->sz>=k)return Kth(p->lc,k);
  49. return Kth(p->rc,k-p->lc->sz-1);
  50. }
  51. int Pre(int k){
  52. ptr s,t;int now;
  53. split(rt,k-1,s,t),now=Kth(s,s->sz);
  54. return rt=merge(s,t),now;
  55. }
  56. int nxt(int k){
  57. ptr s,t;int now;
  58. split(rt,k,s,t),now=Kth(t,1);
  59. return rt=merge(s,t),now;
  60. }
  61. int ok[N],a[N],kr[N],n,ql,qr,T,l,r;
  62. int main(){
  63. // freopen("testdata.in","r",stdin);
  64. for(scanf("%d",&T);T;--T){
  65. rt=e,tot=0;
  66. scanf("%d",&n),l=n+1,r=0;
  67. fp(i,1,n)scanf("%d",&a[i]),kr[a[i]]=i,ok[i]=0;
  68. a[0]=0,a[n+1]=n+1,kr[0]=0,kr[n+1]=n+1,ok[0]=ok[n+1]=0;
  69. ok[n+1]=1;
  70. insert(0),insert(n+1),ql=qr=2;
  71. R int cnt=2;
  72. fd(i,n,1){
  73. R int pl=Pre(a[i]),pr=nxt(a[i]);
  74. R int sz=rk(pl);
  75. if(ql>=sz){
  76. if(i>kr[pl]&&i<kr[pr])++ql;
  77. else if(i<kr[pl])ql=sz;
  78. else ql=sz+1;
  79. }
  80. sz=cnt-(rk(pr)-1);
  81. if(qr>=sz){
  82. if(i>kr[pl]&&i<kr[pr])++qr;
  83. else if(i>kr[pr])qr=sz;
  84. else qr=sz+1;
  85. }
  86. ++cnt;
  87. insert(a[i]);
  88. ok[i]=(ql+qr>=cnt&&ql>=a[i-1]-(i-1)+1);
  89. }
  90. fp(i,0,n){
  91. if(i&&a[i]<a[i-1])break;
  92. if(ok[i+1])cmin(l,i),cmax(r,i);
  93. }
  94. if(l>r)l=r=-1;
  95. printf("%d %d\n",l,r);
  96. }
  97. return 0;
  98. }

\(G\)

首先类似于CF840B,如果我们已经确定了每个点的度数的奇偶,那么一定可以构造出一组合法方案

由于这个构造只需要一棵生成树就可以完成,那么我们把标号大边的尽量留在生成树上,这样标号小的边就可以全部选了

先来考虑某一棵生成树,把可以选的全部选完之后,就是树上某些点为奇某些为偶,我们可以只考虑偶数点,对于任意两个点,我们可以对他们路径上的所有边取反,从而只改变这两个点的状态而不改变路径上其它点的状态,所以可知最终的偶数点只有\(0/1\)两种情况

那么再来考虑边,我们建一个并查集重构树,保证序号小的边深度浅,那么从上到下一次考虑每条边,选了一条边之后就相当于对于它所连接的两个连通块中各改变一个点的状态,我们发现如果两个连通块都是偶数点为\(0\)的情况,这条边选了之后最终答案一定变劣,这种情况下不选,其他情况下都可以选,用树状数组维护一下即可

  1. //quming
  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. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. const int N=2e6+5;
  11. struct eg{int v,nx;}e[N<<1];int head[N],tot;
  12. inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
  13. int dfn[N],d[N],low[N],c[N],fa[N],fr[N],to[N],vis[N],bl[N],ls[N],rs[N];
  14. int n,m,nd,cnt;
  15. inline void chg(R int x){for(;x<=n;x+=x&-x)c[x]^=1;}
  16. inline int qwq(R int x){R int res=0;for(;x;x-=x&-x)res^=c[x];return res;}
  17. inline int query(R int l,R int r){return qwq(r)^qwq(l-1);}
  18. inline int find(R int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  19. void dfs(int u){
  20. if(u<=n)return dfn[u]=low[u]=++cnt,void();
  21. dfn[u]=nd+1,low[u]=0;
  22. go(u)dfs(v),cmin(dfn[u],dfn[v]),cmax(low[u],low[v]);
  23. }
  24. int main(){
  25. freopen("testdata.in","r",stdin);
  26. scanf("%d%d",&n,&m),nd=n;
  27. fp(i,1,m)scanf("%d%d",&fr[i],&to[i]),++fr[i],++to[i];
  28. fp(i,1,n)fa[i]=i;
  29. for(R int i=m,u,v;i;--i){
  30. u=find(fr[i]),v=find(to[i]);
  31. if(u==v)vis[i]=1,d[fr[i]]^=1,d[to[i]]^=1;
  32. else{
  33. ++nd,fa[u]=fa[v]=fa[nd]=nd,ls[nd]=u,rs[nd]=v,bl[i]=nd;
  34. add(nd,u),add(nd,v);
  35. }
  36. }
  37. dfs(nd);
  38. fp(i,1,n)if(!d[i])chg(dfn[i]);
  39. fp(i,1,m)if(bl[i]){
  40. R int l=query(dfn[ls[bl[i]]],low[ls[bl[i]]]);
  41. R int r=query(dfn[rs[bl[i]]],low[rs[bl[i]]]);
  42. if(l||r)vis[i]=1,chg(dfn[fr[i]]),chg(dfn[to[i]]);
  43. }
  44. fp(i,1,m)putchar(vis[i]+'0');
  45. putchar('\n');
  46. return 0;
  47. }

Comet OJ - Contest #15 题解的更多相关文章

  1. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  2. Comet OJ - Contest #0题解

    传送门 菜爆了--总共只有一道题会做的--而且也没有短裙好难过 为啥必须得有手机才能注册账号啊喂--歧视么-- \(A\) 解方程 推一下柿子大概就是 \[x-\sqrt{n}=y+z+2\sqrt{ ...

  3. Comet OJ Contest #15 D. 双十一特惠(困难版)

    以 $d(x)$ 表示正整数 $x$ 的十进制表示的数位之和.熟知下列关于 $d(x)$ 的结论: $d(x) \equiv x \pmod{9}$.从而对于任意正整数列 $a_1, a_2, \do ...

  4. Comet OJ - Contest #3 题解

    传送门 太菜了连\(D\)都做不出来没有小裙子\(QAQ\) \(A\) 暴力把所有的数对都算出来,然后\(sort\)一下就行了 const int N=505; int a[N],st[N*N], ...

  5. Comet OJ - Contest #2题解

    传送门 既然没参加过就没有什么小裙子不小裙子的了-- 顺便全是概率期望真是劲啊-- 因自过去而至的残响起舞 \(k\)增长非常快,大力模拟一下就行了 int main(){ scanf("% ...

  6. Comet OJ - Contest #11题解

    传送门 \(A\) 咕咕咕 const int N=1e6+5; char s[N],t[N];int n,res; inline bool cmp(const int &x,const in ...

  7. Comet OJ - Contest #8题解

    传送门 \(A\) 咕咕咕 const int N=1005; char s[N][N];int len[N],n,id; inline bool cmp(R int j,R int k){ R in ...

  8. Comet OJ - Contest #14题解

    Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <io ...

  9. Comet OJ - Contest #15(B: 当我们同心在一起 )

    题目链接 题目描述 平面上有 nn 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 nn 个点之中? 输入描述 第一行有一个正整数 nn 代表平面上的点数. 接下来有 nn  ...

随机推荐

  1. .NET / C# HTTP中的GET和PSOT

    需要引入using System.IO;using System.Net; public string GETs(string URL) { //创建httpWebRequest对象 HttpWebR ...

  2. Redis常用配置和命令总结

    Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  3. intel AVX指令集

    听说这 AVX 很牛,,支持Win7,大幅提高游戏浮点运算性能warning C4752: 发现 Intel(R) 高级矢量扩展:请考虑使用 /arch:AVX

  4. 接口例_龟车赛跑_Java

    此例演示java中接口的一般用法. 屋子里有一群程序员,每个人在写着自己的类,共同构建一个世界. 项目经理突然出现:“打扰大家一下,公司决定举办一个竞速比赛,你们写的类都可以参加.为了比赛的顺利进行, ...

  5. 再谈初学者关心的ssh应用方方面面

    http://blog.robertelder.org/what-is-ssh/ https://www.ssh.com/ssh/key/ 什么是ssh? ssh是一个在计算机之间实现安全通信的网络协 ...

  6. 【WEB基础】HTML & CSS 基础入门(10)布局与定位

    块级元素和行内元素 HTML里的元素可以分为块级元素和行内元素两大类:

  7. keras学习入门一

    基本概念 1. 张量 tensor 所有的数据类型都可以看成是张量,可以看成是向量,矩阵在推广 张量的阶,有时候也叫维度,或是轴(axis) 0阶张量如 [] ,5 也叫做标量 1阶张量 如 [ 1, ...

  8. MAC OS系统替换brew.npm, pip 使用阿里云的镜像源

    替换brew.git:cd "$(brew --repo)"git remote set-url origin https://mirrors.aliyun.com/homebre ...

  9. 【转】Webpack 快速上手(中)

    由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件输入和输出 中篇介绍了 webpack 在输入和输出 ...

  10. 生意bisynes单词bisynes商业

    英语bisynes商务概念的提出是改革的产物,有一个演变的过程:贸易部--商业部.外贸部--内贸部--内贸局--商务部.是内外贸一体化的概念. 中文名:商务 外文名:Business,Bisynes商 ...