【A】浇花

题意:

一个线段上每个整点都有花,有的点有自动浇花的喷水器,有问几秒能浇完所有的花。

题解:

大模拟

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. #define F2(i,a,b) for(int i=(a);i<(b);++i)
  6. #define dF(i,a,b) for(int i=(a);i>=(b);--i)
  7. #define dF2(i,a,b) for(int i=(a);i>(b);--i)
  8. #include<cmath>
  9. #include<iostream>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. #include<set>
  14. #include<map>
  15. #define ll long long
  16. #define eF(i,u) for(int i=h[u];i;i=nxt[i])
  17. using namespace std;
  18. const int INF=0x3f3f3f3f;
  19. inline int Abs(int X){return X<?-X:X;}
  20. inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
  21. inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
  22. inline int Max(int X,int Y){return X<Y?Y:X;}
  23. inline int Min(int X,int Y){return X<Y?X:Y;}
  24. inline ll Max(ll X,ll Y){return X<Y?Y:X;}
  25. inline ll Min(ll X,ll Y){return X<Y?X:Y;}
  26. inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
  27. inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
  28. int n,q,Ans;
  29. int a[],b[];
  30. int main(){
  31. int T;
  32. scanf("%d",&T);
  33. while(T--){
  34. Ans=;
  35. scanf("%d%d",&n,&q);
  36. F(i,,q) scanf("%d",a+i);
  37. F(i,,n){
  38. int k=;
  39. F(j,,q){
  40. k=Min(k,Abs(i-a[j]));
  41. }
  42. Ans=Max(Ans,k);
  43. }
  44. printf("%d\n",Ans+);
  45. }
  46. return ;
  47. }

【B】排队喝茶

题意:

有\(n\)个人排队喝茶,第\(i\)个人\(l_i\)时刻来排队,如果\(r_i\)时刻还没有排到他,他就走了,问每个人喝到茶的时间或者他没有喝到茶。

题解:

大模拟,每个人是否走了可以到他了再判断。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. #define F2(i,a,b) for(int i=(a);i<(b);++i)
  6. #define dF(i,a,b) for(int i=(a);i>=(b);--i)
  7. #define dF2(i,a,b) for(int i=(a);i>(b);--i)
  8. #include<cmath>
  9. #include<iostream>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. #include<set>
  14. #include<map>
  15. #define ll long long
  16. #define eF(i,u) for(int i=h[u];i;i=nxt[i])
  17. using namespace std;
  18. const int INF=0x3f3f3f3f;
  19. inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
  20. inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
  21. inline int Max(int X,int Y){return X<Y?Y:X;}
  22. inline int Min(int X,int Y){return X<Y?X:Y;}
  23. inline ll Max(ll X,ll Y){return X<Y?Y:X;}
  24. inline ll Min(ll X,ll Y){return X<Y?X:Y;}
  25. inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
  26. inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
  27. int n,q;
  28. int l[],r[],Ans[];
  29. int que[],L,R;
  30. int main(){
  31. int T;
  32. scanf("%d",&T);
  33. while(T--){
  34. L=, R=;
  35. scanf("%d",&n);
  36. memset(Ans,,sizeof Ans);
  37. F(i,,n) scanf("%d%d",l+i,r+i);
  38. int i=;
  39. F(t,,){
  40. while(l[i]==t) que[++R]=i, ++i;
  41. while(L<=R&&r[que[L]]<t) ++L;
  42. if(L<=R) Ans[que[L++]]=t;
  43. }
  44. F(j,,n) printf("%d ",Ans[j]); puts("");
  45. }
  46. return ;
  47. }

【C】交换相邻元素

题意:

一个1到n的排列,你可以交换某些相邻位置的值,问能否交换成上升序列。

题解:

连续的一串可以交换的,就表示这一串可以直接排序,那么我们把所有连续的一段都各自排序,看最终的数组是否升序即可。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. #define F2(i,a,b) for(int i=(a);i<(b);++i)
  6. #define dF(i,a,b) for(int i=(a);i>=(b);--i)
  7. #define dF2(i,a,b) for(int i=(a);i>(b);--i)
  8. #include<cmath>
  9. #include<iostream>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. #include<set>
  14. #include<map>
  15. #define ll long long
  16. #define eF(i,u) for(int i=h[u];i;i=nxt[i])
  17. using namespace std;
  18. const int INF=0x3f3f3f3f;
  19. inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
  20. inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
  21. inline int Max(int X,int Y){return X<Y?Y:X;}
  22. inline int Min(int X,int Y){return X<Y?X:Y;}
  23. inline ll Max(ll X,ll Y){return X<Y?Y:X;}
  24. inline ll Min(ll X,ll Y){return X<Y?X:Y;}
  25. inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
  26. inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
  27. int n,q;
  28. int a[],b[];
  29. int main(){
  30. scanf("%d",&n);
  31. F(i,,n) scanf("%d",a+i);
  32. char ch;
  33. F2(i,,n) if((ch=getchar())!=''&&ch!='') --i; else b[i]=ch-'';
  34. int lst=;
  35. F(i,,n){
  36. if(!b[i]) sort(a+lst,a+i+), lst=i+;
  37. } sort(a+lst,a+n+);
  38. F(i,,n) if(a[i]!=i) {puts("NO"); return ;}
  39. puts("YES");
  40. return ;
  41. }

【D】水缸

题意:

有一些容量无限的水缸,初始时每个水缸中各自有一些水,你有一个容积为k的勺子,问你能否通过用勺子舀水让一个水缸中的水变成要求的V体积?

题解:

考虑把所有的水缸的水和要求的V体积都对勺子容积k取模。

那么如果有一些水缸中的水相加,再对k取模,等于V对k取模的结果,我们就确定最终的V体积的水来自这些水缸。

那么用\(f[i][j]\)表示前\(i\)个水缸中能否相加达到\(j\)容积(\(j\)对\(k\)取模)。

特别地,\(f[i][j]=1\)表示这一个水缸不需要选,\(f[i][j]=2\)表示这一个水缸可以选。

那么最终确定结果时可以反推回来,确定选取哪些水缸。

之后的事情主要是分类讨论,注意输出格式。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. #define F2(i,a,b) for(int i=(a);i<(b);++i)
  6. #define dF(i,a,b) for(int i=(a);i>=(b);--i)
  7. #define dF2(i,a,b) for(int i=(a);i>(b);--i)
  8. #include<cmath>
  9. #include<iostream>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. #include<set>
  14. #include<map>
  15. #define ll long long
  16. #define eF(i,u) for(int i=h[u];i;i=nxt[i])
  17. using namespace std;
  18. const int INF=0x3f3f3f3f;
  19. inline int Gcd(int X,int Y){return Y?Gcd(Y,X%Y):X;}
  20. inline ll Gcd(ll X,ll Y){return Y?Gcd(Y,X%Y):X;}
  21. inline int Max(int X,int Y){return X<Y?Y:X;}
  22. inline int Min(int X,int Y){return X<Y?X:Y;}
  23. inline ll Max(ll X,ll Y){return X<Y?Y:X;}
  24. inline ll Min(ll X,ll Y){return X<Y?X:Y;}
  25. inline int Pow(int base,ll exp,int _mod){int _ans=;for(;exp;exp>>=,base=(ll)base*base%_mod)exp&?_ans=(ll)_ans*base%_mod:;return _ans;}
  26. inline ll Pow(ll base,ll exp,ll _mod){ll _ans=;for(;exp;exp>>=,base=base*base%_mod)exp&?_ans=_ans*base%_mod:;return _ans;}
  27. int n,k,v;
  28. int a[],b[],sum,s2;
  29. int f[][];
  30. int Ans[];
  31. int main(){
  32. scanf("%d%d%d",&n,&k,&v);
  33. F(i,,n) scanf("%d",a+i), sum+=a[i], b[i]=a[i], a[i]%=k;
  34. // F(i,1,n) printf("%d ",a[i]); puts("");
  35. if(sum<v) {puts("NO"); return ;}
  36. f[][]=;
  37. F(i,,n){
  38. F2(j,,k){
  39. if(f[i-][j]){
  40. f[i][j]=;
  41. if(j+a[i]<k) f[i][j+a[i]]=;
  42. else f[i][j+a[i]-k]=;
  43. }
  44. }
  45. }
  46. // F(i,1,n){
  47. // F2(j,0,k){
  48. // printf("%d ",f[i][j]);
  49. // }
  50. // puts("");
  51. // }
  52. if(f[n][v%k]==) puts("NO");
  53. else{
  54. puts("YES");
  55. int now=v%k;
  56. int u=-, unu=-;
  57. dF(i,n,){
  58. if(f[i][now]==) Ans[i]=, now=(now-a[i]+k)%k;
  59. }
  60. // printf("ans:"); F(i,1,n) printf("%d ",Ans[i]); puts("");
  61. F(i,,n) if(!Ans[i]) unu=i; else u=i;
  62. // printf("u : %d, unu : %d\n",u,unu);
  63. if(u==-){
  64. F(i,,n) if(b[i]>) printf("%d %d 1\n",(b[i]-)/k+,i);
  65. if(v>) printf("%d 1 2\n",v/k);
  66. }
  67. else if(unu==-){
  68. F(i,,n) if(b[i]>) printf("%d %d 1\n",(b[i]-)/k+,i);
  69. if(sum-v>) printf("%d 1 2\n",(sum-v)/k);
  70. }
  71. else{
  72. int s1=b[u],s2=b[unu];
  73. F(i,,n){
  74. if(Ans[i]==&&i!=u&&b[i]>) printf("%d %d %d\n",(b[i]-)/k+,i,u), s1+=b[i];
  75. if(Ans[i]==&&i!=unu&&b[i]>) printf("%d %d %d\n",(b[i]-)/k+,i,unu), s2+=b[i];
  76. }
  77. if(s2>=k) printf("%d %d %d\n",s2/k,unu,u); s1+=s2/k*k;
  78. if(s1-v>=k) printf("%d %d %d\n",(s1-v)/k,u,unu);
  79. }
  80. }
  81. return ;
  82. }

 【E】连通分量?

题意:

从一个\(n\)个点的无向完全图中删去\(m\)条边,问现在图中连通分量个数和每个连通分量大小。

题解:

看了别人的博才发现这题其实非常简单暴力。

就是暴力BFS,不过下一个点要从还没到过的点的集合中枚举,就这么简单。

为什么不会TLE?我们算一下时间复杂度:

每个点都只会经过一次,也只会遍历一次。那么遍历当前点时,要花多少时间呢?

在剩下的点中枚举,就是枚举到没有删除的边就会把这个点加入队列吧,每个点只要加入了队列它就不会被再搜到,所以枚举点的复杂度是\(O(log\;n)\)的,因为我使用了STL的set容器。

但是如果搜到了被删除的边呢?这样的边可以保证只会被搜到最多2m次,从一条边的两端点出发。

那么最终复杂度是\(O(n(log\;n+log\;m))\),非常巧妙。

  1. #include<cstdio>
  2. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  3. #include<set>
  4. using namespace std;
  5. inline int Max(int X,int Y){return X<Y?Y:X;}
  6. inline int Min(int X,int Y){return X<Y?X:Y;}
  7. int n,m;
  8. set<int> vv;
  9. set<pair<int,int> > st;
  10. bool vis[200001];
  11. int que[200001],l,r;
  12. int Ans[200001],ans;
  13. int main(){
  14. scanf("%d%d",&n,&m);
  15. int x,y; F(i,1,m) scanf("%d%d",&x,&y), st.insert(make_pair(Min(x,y),Max(x,y)));
  16. F(i,1,n) vv.insert(i);
  17. F(i,1,n){
  18. if(!vis[i]){
  19. vis[i]=1; vv.erase(i);
  20. que[l=r=1]=i;
  21. while(l<=r){
  22. int u=que[l++];
  23. for(set<int>::iterator j=vv.begin();j!=vv.end();){
  24. if(!st.count(make_pair(Min(u,*j),Max(u,*j))))
  25. que[++r]=*j, vis[*j]=1, vv.erase(j++);
  26. else ++j;
  27. }
  28. }
  29. ++Ans[r]; ++ans;
  30. }
  31. }
  32. printf("%d\n",ans);
  33. F(i,1,n) while(Ans[i]--) printf("%d ",i);
  34. return 0;
  35. }

【codeforces】【比赛题解】#920 Educational CF Round 37的更多相关文章

  1. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  2. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

  3. 【codeforces】【比赛题解】#869 CF Round #439 (Div.2)

    良心赛,虽然我迟了半小时233333. 比赛链接:#869. 呃,CF的比赛都是有背景的……上次是<哈利波特>,这次是<物语>…… [A]巧妙的替换 题意: Karen发现了石 ...

  4. 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

    cf的比赛越来越有难度了……至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...

  5. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)

    剧毒比赛,至少涨了分对吧.: ( [A]Left-handers, Right-handers and Ambidexters 题意: 有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用 ...

  6. 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)

    因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...

  7. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...

  8. 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)

    这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...

  9. 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

    cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...

随机推荐

  1. Python教程:丛入门到实践

    一.特殊用法的函数 name = "python very good" print(name.title()) 方法是python可对数据执行的操作.每个方法后面都跟着一对括号. ...

  2. 【BZOJ4869】【SHOI2017】相逢是问候

    Description BZOJ传送门 Solution 这题涉及到指数嵌套堆叠,可能可以用欧拉函数解决. 试想一个数\(a_i\)经过\(k\)次操作后会变成什么? \[ k个c\;\; \begi ...

  3. 洛谷 P1436 棋盘分割 解题报告

    P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...

  4. 【bzoj4013】 HNOI2015—实验比较

    http://www.lydsy.com/JudgeOnline/problem.php?id=4013 (题目链接) 题意 给出$n$个数的$m$个大小关系,问它们之间可以形成的单调不降的序列有多少 ...

  5. 使用mshta.exe绕过应用程序白名单(多种方法)

      0x00 简介 很长一段时间以来,HTA文件一直被web攻击或在野恶意软件下载程序用作恶意程序的一部分.HTA文件在网络安全领域内广为人知,从红队和蓝队的角度来看,它是绕过应用程序白名单有价值的“ ...

  6. UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)

    UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...

  7. IntelliJ IDEA详细配置和使用教程-字体、编码和基本设置

    IDEA使用--字体.编码和基本设置 https://blog.csdn.net/frankcheng5143/article/details/50779149 IntelliJ IDEA详细配置和使 ...

  8. 移动端图片轮播—swipe滑动插件

    swipe是一个轻量级的移动滑动组件,它可以支持精确的触滑移动操作,能解决移动端对滑动的需求. swipe插件的使用主要有四大块: 一.html <div id='slider' class=' ...

  9. codeforces div1 & div2 参与人员分数统计

    Analysis helps to see the nature of things.

  10. 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)

    Data: /*33 2 1#11 4 7 10 13 16 19 22 25 2831 33 35 37 39 41 43 45 47 4951 53 55 57 59 61 63 65 67 69 ...