• Codeforcess834


    Codeforcess

    A

    暴力枚单个循环节

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define C getchar()-48
    5. inline ll read()
    6. {
    7. ll s=0,r=1;
    8. char c=C;
    9. for(;c<0||c>9;c=C) if(c==-3) r=-1;
    10. for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    11. return s*r;
    12. }
    13. int t,la;
    14. char a[80],b[80]={'Y','e','s','Y','e','s','Y','e','s','Y','e','s'};
    15. int main()
    16. {
    17. t=read();
    18. while(t--)
    19. {
    20. scanf("%s",a+1);la=strlen(a+1);
    21. int pd=0;
    22. for(int k=0;k<=2;k++)
    23. {
    24. int tmppd=1;
    25. for(int i=1;i<=la;i++) if(a[i]!=b[(i+k)%3]) tmppd=0;
    26. pd|=tmppd;
    27. }
    28. if(pd==1) puts("YES");
    29. else puts("NO");
    30. }
    31. return 0;
    32. }

    B

    从小到大暴力枚举,累加上没出现的,判断是否合法

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define C getchar()-48
    5. inline ll read()
    6. {
    7. ll s=0,r=1;
    8. char c=C;
    9. for(;c<0||c>9;c=C) if(c==-3) r=-1;
    10. for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    11. return s*r;
    12. }
    13. const int N=110,M=3e5+10;
    14. int t;
    15. int m,s,sum;
    16. int mp[M+10],a[N];
    17. #define p1 puts("YES")
    18. #define p2 puts("NO")
    19. int main()
    20. {
    21. t=read();
    22. int tmpsum=0;
    23. for(int i=1;i<=100;i++) tmpsum+=i,mp[tmpsum]=1;
    24. while(t--)
    25. {
    26. m=read(),s=read();sum=0;int pd=1;
    27. for(int i=1;i<=m;i++) a[i]=read(),sum+=a[i];
    28. sort(a+1,a+1+m);
    29. if(!mp[sum+s]){p2;continue;}
    30. int tmpsum=sum+s,del=1;
    31. while(tmpsum>0) tmpsum-=del++;
    32. if(tmpsum==0&&del>a[m]){p1;continue;}
    33. else{p2;continue;}
    34. }
    35. return 0;
    36. }

    C

    经典做法,贪心。将区间的可行情况转化为两个端点进行讨论。

    一个点一定范围之外才能走,对于一个区间,如果能走进区间,那么显然能走到两端点其中之一。
    如果区间内两点可走,那么两端点必然相互可走。
    以区间的两端点为媒介进行走,判断起点终点与两端点的可走情况,讨论出步数。

    当时具体地考虑每种情况真是太蠢了,要先考虑优化。

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define int ll
    5. const int MaxN=2e5+100;
    6. int N,M,T,L,R,x,a,b;
    7. template
    8. inline void qread(T &sum)
    9. {
    10. sum=0;int boo=1;
    11. char x=getchar();
    12. while(x<'0'||x>'9'){if(x=='-')boo=-1;x=getchar();}
    13. while(x>='0'&&x<='9'){sum=(sum<<1)+(sum<<3)+x-'0';x=getchar();}
    14. sum*=boo;
    15. }
    16. template
    17. void qput(T x)
    18. {
    19. if(x<0) {x=-x;putchar('-');}
    20. if(x>9){qput(x/10);}
    21. putchar(x%10+48);
    22. }
    23. inline void Solve()
    24. {
    25. qread(L);qread(R);qread(x);
    26. qread(a);qread(b);
    27. if(a==b)
    28. {
    29. qput(0);putchar('\n');return;
    30. }
    31. if(b>R||b
    32. {
    33. qput(-1);putchar('\n');return;
    34. }
    35. if(abs(b-a)>=x)
    36. {
    37. qput(1);putchar('\n');return;
    38. }
    39. if(abs(a-L)>=x&&abs(b-L)>=x)
    40. {
    41. qput(2);putchar('\n');return;
    42. }
    43. if(abs(a-R)>=x&&abs(b-R)>=x)
    44. {
    45. qput(2);putchar('\n');return;
    46. }
    47. if(abs(R-a)>=x&&abs(L-b)>=x)
    48. {
    49. qput(3);putchar('\n');return;
    50. }
    51. if(abs(L-a)>=x&&abs(R-b)>=x)
    52. {
    53. qput(3);putchar('\n');return;
    54. }
    55. qput(-1);putchar('\n');return;
    56. }
    57. signed main()
    58. {
    59. qread(T);
    60. while(T--) Solve();
    61. }

    C

    a*b后缀0最多,b<=c, a,c

    相乘结果为10,只有10,2,5,1的情况。

    先提因数10,再提2,5
    b中能用2,5消掉a的,尽量用,因为消耗小,再尽量用10

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define C getchar()-48
    5. inline ll read()
    6. {
    7. ll s=0,r=1;
    8. char c=C;
    9. for(;c<0||c>9;c=C) if(c==-3) r=-1;
    10. for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    11. return s*r;
    12. }
    13. const ll inf=1e9;
    14. int t;
    15. ll n,m;
    16. inline void work()
    17. {
    18. n=read(),m=read();ll tmpn=n;
    19. ll gs2=0,gs5=0,ans=0,sum2=1,sum5=1;
    20. while(n%10==0) n/=10;
    21. while(n%2==0) n/=2,gs2++,sum2*=5;
    22. while(n%5==0) n/=5,gs5++,sum5*=2;
    23. if(gs2)
    24. {
    25. for(ll i=inf;i>=1;i/=10) if(m>=sum2*i)
    26. {
    27. printf("%lld\n",(m/(sum2*i))*(sum2*i)*tmpn);
    28. return;
    29. }
    30. ans=1;
    31. while(ans*5<=m) ans*=5;
    32. printf("%lld\n",(m/(ans))*(ans)*tmpn);
    33. return;
    34. }
    35. if(gs5)
    36. {
    37. for(ll i=inf;i>=1;i/=10) if(m>=sum5*i)
    38. {
    39. printf("%lld\n",(m/(sum5*i))*(sum5*i)*tmpn);
    40. return;
    41. }
    42. ans=1;
    43. while(ans*2<=m) ans*=2;
    44. printf("%lld\n",(m/(ans))*(ans)*tmpn);
    45. return;
    46. }
    47. for(ll i=inf;i>=1;i/=10) if(m>=i)
    48. {
    49. printf("%lld\n",(m/(i))*(i)*tmpn);
    50. return;
    51. }
    52. }
    53. int main()
    54. {
    55. t=read();
    56. while(t--) work();
    57. return 0;
    58. }

    E

    暴力枚举使用223,232,322情况,不够就喝药

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define C getchar()-48
    5. inline ll read()
    6. {
    7. ll s=0,r=1;
    8. char c=C;
    9. for(;c<0||c>9;c=C) if(c==-3) r=-1;
    10. for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    11. return s*r;
    12. }
    13. const ll N=2e5+10;
    14. ll t;
    15. ll n,h,gs;
    16. ll a[N];
    17. inline void tj(ll v1,ll v2,ll v3)
    18. {
    19. ll tmpgs,tmpsum,cs;
    20. tmpgs=0,tmpsum=h,cs=0;
    21. for(ll i=1;i<=n;i++)
    22. {
    23. while(a[i]>=tmpsum&&cs<3)
    24. {
    25. if(cs==0) tmpsum*=v1;
    26. if(cs==1) tmpsum*=v2 ;
    27. if(cs==2) tmpsum*=v3;
    28. cs++;
    29. }
    30. if(a[i]
    31. {
    32. tmpgs++;
    33. tmpsum+=a[i]/2;
    34. }
    35. }
    36. gs=max(gs,tmpgs);
    37. }
    38. inline void work()
    39. {
    40. n=read(),h=read();gs=0;
    41. for(ll i=1;i<=n;i++) a[i]=read();
    42. sort(a+1,a+1+n);
    43. tj(2,2,3);tj(2,3,2);tj(3,2,2);
    44. cout<endl;
    45. }
    46. int main()
    47. {
    48. t=read();
    49. while(t--) work();
    50. return 0;
    51. }

    F

    最多p-1次,倒数第二位最多进1,直接讨论

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define C getchar()-48
    5. inline ll read()
    6. {
    7. ll s=0,r=1;
    8. char c=C;
    9. for(;c<0||c>9;c=C) if(c==-3) r=-1;
    10. for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    11. return s*r;
    12. }
    13. const ll N=2e5+10,inf=1e9+7;
    14. ll t,lb;
    15. ll n,p;
    16. ll a[N],b[N];
    17. inline void work()
    18. {
    19. n=read(),p=read();
    20. for(int i=1;i<=n;i++) a[i]=b[i]=read();
    21. sort(b+1,b+1+n);
    22. lb=unique(b+1,b+1+n)-(b+1);
    23. int tmpr=lb,tmpl=1,mxr=p,mnl=-1;
    24. while(tmpr>=1&&b[tmpr]==mxr-1) mxr--,tmpr--;
    25. while(tmpl<=lb&&b[tmpl]==mnl+1) mnl++,tmpl++;
    26. if(mxr==0){puts("0");return;}
    27. if(mnl>=a[n]-1){cout<-1<<endl;return;}
    28. int ans=p-a[n];b[++lb]=0;
    29. int tmpw=n-1;
    30. while(tmpw>=1&&a[tmpw]==p-1) tmpw--;
    31. b[++lb]=a[tmpw]+1;
    32. sort(b+1,b+1+lb);
    33. lb=unique(b+1,b+1+lb)-(b+1);
    34. tmpl=1,mxr=a[n]+1,mnl=-1;
    35. for(tmpr=lb;tmpr;tmpr--) if(b[tmpr]==a[n]) break;
    36. while(tmpr>=1&&b[tmpr]==mxr-1) mxr--,tmpr--;
    37. cout<0,mxr-1)<<endl;
    38. }
    39. int main()
    40. {
    41. t=read();
    42. while(t--) work();
    43. return 0;
    44. }

    F

    倒着做,用平衡树或者set维护比bi小剩余最大的值

    code:
    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define C getchar()-48
    5. inline ll read()
    6. {
    7. ll s=0,r=1;
    8. char c=C;
    9. for(;c<0||c>9;c=C) if(c==-3) r=-1;
    10. for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    11. return s*r;
    12. }
    13. const int N=2e5+10;
    14. int t;
    15. int n,topt,rt;
    16. int a[N],map[N],vis[N];
    17. int ans[N],topq,askans;
    18. struct xin{
    19. int l,r,v;
    20. double key;
    21. }tr[N<<2];
    22. inline int crt(int v)
    23. {
    24. tr[++topt].v=v;
    25. tr[topt].l=tr[topt].r=0;
    26. tr[topt].key=rand();
    27. return topt;
    28. }
    29. inline void spilt(int x,int v,int &rtl,int &rtr)
    30. {
    31. if(!x){rtl=rtr=0;return;}
    32. if(tr[x].v<=v)
    33. {
    34. rtl=x;
    35. spilt(tr[x].r,v,tr[x].r,rtr);
    36. }
    37. else
    38. {
    39. rtr=x;
    40. spilt(tr[x].l,v,rtl,tr[x].l);
    41. }
    42. }
    43. inline int merge(int x,int y)
    44. {
    45. if(!x||!y) return x|y;
    46. if(tr[x].key<=tr[y].key)
    47. {
    48. tr[x].r=merge(tr[x].r,y);
    49. return x;
    50. }
    51. else
    52. {
    53. tr[y].l=merge(x,tr[y].l);
    54. return y;
    55. }
    56. }
    57. inline void add(int v)
    58. {
    59. int x,y,z;
    60. z=crt(v);
    61. spilt(rt,v,x,y);
    62. rt=merge(merge(x,z),y);
    63. }
    64. inline void del(int v)
    65. {
    66. int x,y,z;
    67. spilt(rt,v,x,y);
    68. spilt(x,v-1,x,z);
    69. z=merge(tr[z].l,tr[z].r);
    70. rt=merge(merge(x,z),y);
    71. }
    72. inline void ask(int x,int v)
    73. {
    74. if(!x) return;
    75. if(tr[x].v<=v)
    76. {
    77. askans=max(askans,tr[x].v);
    78. ask(tr[x].r,v);
    79. }
    80. else ask(tr[x].l,v);
    81. }
    82. inline void work()
    83. {
    84. topt=0;rt=0;tr[rt].l=tr[rt].r=0;
    85. for(int i=1,edi=n/2;i<=edi;i++) vis[a[i]]=0;
    86. n=read();
    87. for(int i=1,edi=n/2;i<=edi;i++) a[i]=read(),vis[a[i]]++;
    88. for(int i=1,edi=n/2;i<=edi;i++) if(vis[a[i]]>1){puts("-1");return;}
    89. for(int i=1;i<=n;i++) add(i);
    90. for(int i=1;i<=n/2;i++) del(a[i]);
    91. for(int i=n/2;i>=1;i--)
    92. {
    93. askans=0;ask(rt,a[i]);
    94. if(!askans){puts("-1");return;}
    95. ans[i*2]=a[i];
    96. ans[i*2-1]=askans;
    97. del(askans);
    98. }
    99. for(int i=1;i<=n;i++) cout<" ";puts("");
    100. }
    101. int main()
    102. {
    103. srand(time(0));
    104. t=read();
    105. while(t--) work();
    106. return 0;
    107. }
  • 相关阅读:
    FlashMeeting(基于FFmpeg+openCV)视频语音通讯系统
    做期权卖方一般会怎么选择合约?
    openSuSE 下面配置 java环境变量
    shell脚本学习笔记
    .NET 设计模式—适配器模式(Adapter Pattern)
    Ubuntu20.04安装docker
    WSL 与真实 linux 环境区别有多大?
    微信小程序上架,AI类目审核(AI问答、AI绘画、AI换脸)
    TRITC-透明质酸,TRITC-hyaluronic acid,四甲基罗丹明标记透明质酸
    【GPU】Nvidia CUDA 编程中级教程——数据复制与计算的重叠
  • 原文地址:https://blog.csdn.net/lianhaoming/article/details/128028596