A:水题,先排序,有相连的输出2,否则输出1.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pii pair<int,int>
  4. #define mkp make_pair
  5. #define pb push_back
  6. #define fi first
  7. #define se second
  8. typedef long long ll;
  9. const int INF=0x3f3f3f3f;
  10. int q,n;
  11. const int maxn=;
  12. int a[maxn];
  13.  
  14. int main()
  15. {
  16. scanf("%d",&q);
  17. while(q--)
  18. {
  19. scanf("%d",&n);
  20. for(int i=;i<=n;++i) scanf("%d",a+i);
  21. sort(a+,a++n);
  22. int cnt=;
  23. for(int i=;i<=n;++i)
  24. {
  25. if(a[i]-a[i-]==) {cnt=;break;}
  26. }
  27. printf("%d\n",cnt);
  28. }
  29.  
  30. return ;
  31. }

B1和B2: 水题:同一个循环里面的步数一样,O(N)跑一遍即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pii pair<int,int>
  4. #define mkp make_pair
  5. #define pb push_back
  6. #define fi first
  7. #define se second
  8. typedef long long ll;
  9. const int INF=0x3f3f3f3f;
  10. int q,n;
  11. const int maxn=2e5+;
  12. int p[maxn],cnt[maxn],vis[maxn];
  13.  
  14. int main()
  15. {
  16. scanf("%d",&q);
  17. while(q--)
  18. {
  19. scanf("%d",&n);
  20. for(int i=;i<=n;++i) scanf("%d",p+i),cnt[i]=vis[i]=;
  21. for(int i=;i<=n;++i)
  22. {
  23. if(vis[i]) continue;
  24. int ans=,num=p[i];vis[i]=i;
  25. while(num!=i)
  26. {
  27. num=p[num];
  28. vis[num]=i;
  29. ans++;
  30. }
  31. cnt[i]=ans;
  32. }
  33. for(int i=;i<=n;++i)
  34. printf("%d%c",cnt[vis[i]],i==n?'\n':' ');
  35. }
  36.  
  37. return ;
  38. }

C1和C2: 水题:很显然>=n的最大的只要把n里面所有的3的幂去除,然后把剩下未选中的挑一个最小的且比去除之后的n大的加入答案就行。注意到样例里面给的最大的那个是3^38.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll a[];
  5. void prework()
  6. {
  7. a[]=;
  8. for(int i=;i<=;++i) a[i]=a[i-]*;
  9. }
  10.  
  11. int q;
  12. ll n,cn;
  13.  
  14. int main()
  15. {
  16. prework();
  17. scanf("%d",&q);
  18. while(q--)
  19. {
  20. scanf("%lld",&n);
  21. ll ans=; cn=n;
  22. int flag=-,tmp=-,tt=;
  23. for(int i=;i>=;--i)
  24. {
  25. if(n==a[i]){ans=a[i];tt=;break;}
  26. if(a[i]<n){tmp=i+;break;}
  27. }
  28. if(tt){printf("%lld\n",ans);continue;}
  29.  
  30. for(int i=tmp-;i>=;--i)
  31. {
  32. if(n==a[i]){ans+=a[i];tt=;break;}
  33. if(n>a[i]) {n-=a[i];ans+=a[i];}
  34. else flag=i;
  35. }
  36. if(tt){printf("%lld\n",ans);continue;}
  37.  
  38. if(flag!=-)
  39. {
  40. for(int i=;i<flag;++i) ans-=a[i];
  41. ans+=a[flag];
  42. }
  43. else ans=a[tmp];
  44.  
  45. printf("%lld\n",ans);
  46. }
  47.  
  48. return ;
  49. }

D1和D2:

D1可以暴力:set维护答案。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pii pair<int,int>
  4. #define mkp make_pair
  5. #define pb push_back
  6. #define fi first
  7. #define se second
  8. typedef long long ll;
  9. const int INF=0x3f3f3f3f;
  10.  
  11. const int maxn=;
  12. int k,n,cnt[maxn],vis[maxn];
  13. struct Node{
  14. int l,r,id;
  15. }p[maxn];
  16. bool cmp(Node &a,Node &b){return a.r<b.r;}
  17. vector<Node> v[maxn];
  18. set<int> st;
  19.  
  20. int main()
  21. {
  22. scanf("%d%d",&n,&k);
  23. for(int i=;i<=n;++i)
  24. {
  25. scanf("%d%d",&p[i].l,&p[i].r);p[i].id=i;
  26. for(int j=p[i].l;j<=p[i].r;++j)
  27. v[j].push_back(Node{p[i].l,p[i].r,i}),cnt[j]++;
  28. }
  29. //for(int i=1;i<=200;++i) cout<<cnt[i]<<endl;
  30. for(int i=;i<=;++i)
  31. sort(v[i].begin(),v[i].end(),cmp);
  32. for(int i=;i<=;++i)
  33. {
  34. if(cnt[i]>k)
  35. {
  36. int nn=cnt[i]-k;
  37. for(int j=v[i].size()-;j>=&&nn;--j)
  38. {
  39. if(vis[v[i][j].id]) continue;
  40. st.insert(v[i][j].id),nn--;
  41. vis[v[i][j].id]=;
  42. for(int k=v[i][j].l;k<=v[i][j].r;++k)
  43. cnt[k]--;
  44. }
  45. }
  46. }
  47. int len=st.size();
  48. printf("%d\n",len);
  49. set<int>::iterator it;
  50. for(it=st.begin();it!=st.end();++it)
  51. printf("%d ",(*it));
  52. puts("");
  53.  
  54. return ;
  55. }

D2用线段树。按照 r 从小到大排序。然后从i 1-n枚举,如果区间最大值<k,则加入该线段,否则该线段必须去掉,加入答案集合里面即可。

最后依次输出答案;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e6+;
  4. int res[maxn],ans,s[maxn],add[maxn],x,cnt,k,n,Max;
  5. struct Node{
  6. int l,r,id;
  7. bool operator<(const Node&p)const{
  8. return r^p.r?r<p.r:l<p.l;
  9. }
  10. }a[maxn];
  11. void pushdown(int l,int r,int rt)
  12. {
  13. int mid=l+r>>;
  14. add[rt<<]+=add[rt],add[rt<<|]+=add[rt];
  15. s[rt<<]+=add[rt],s[rt<<|]+=add[rt];
  16. add[rt]=;
  17. }
  18. void update(int l,int r,int rt,int u,int v)
  19. {
  20. if(l>v||r<u) return;
  21. if(l>=u&&r<=v)
  22. {
  23. s[rt]+=x,add[rt]+=x;
  24. return;
  25. }
  26. if(add[rt]) pushdown(l,r,rt);
  27. int mid=l+r>>;
  28. update(l,mid,rt<<,u,v);
  29. update(mid+,r,rt<<|,u,v);
  30. s[rt]=max(s[rt<<],s[rt<<|]);
  31. }
  32. void query(int l,int r,int rt,int u,int v)
  33. {
  34. if(l>v||r<u) return;
  35. if(l>=u&&r<=v)
  36. {
  37. ans=max(ans,s[rt]);
  38. return;
  39. }
  40. if(add[rt]) pushdown(l,r,rt);
  41. int mid=l+r>>;
  42. query(l,mid,rt<<,u,v);query(mid+,r,rt<<|,u,v);
  43. s[rt]=max(s[rt<<],s[rt<<|]);
  44. }
  45. int main()
  46. {
  47. scanf("%d%d",&n,&k);
  48. Max=cnt=;
  49. for(int i=;i<=n;++i)
  50. {
  51. scanf("%d%d",&a[i].l,&a[i].r);a[i].id=i;
  52. Max=max(Max,a[i].r);
  53. }
  54.  
  55. sort(a+,a++n);x=;
  56. for(int i=;i<=n;++i)
  57. {
  58. int u=a[i].l,v=a[i].r; ans=;
  59. query(,Max,,u,v);
  60. if(ans<k) update(,Max,,u,v);
  61. else res[++cnt]=a[i].id;
  62. }
  63. printf("%d\n",cnt);
  64. sort(res+,res++cnt);
  65. for(int i=;i<=cnt;++i)
  66. printf("%d%c",res[i],i==cnt?'\n':' ');
  67. return ;
  68. }

E:水题:DP即可。设f[i][0],f[i][1]表示选择楼梯和电梯的状态,直接按照题意模拟就行。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e6+;
  4. int a[N],b[N],f[N][],n,c;
  5. int main()
  6. {
  7. scanf("%d%d",&n,&c);--n;
  8. for(int i=;i<=n;++i) scanf("%d",a+i);
  9. for(int i=;i<=n;++i) scanf("%d",b+i);
  10. f[][]=1e9;
  11. for(int i=;i<=n;++i) f[i][]=min(f[i-][],f[i-][])+a[i],f[i][]=min(f[i-][]+c,f[i-][])+b[i];
  12. printf("0 ");for(int i=;i<=n;++i) printf("%d ",min(f[i][],f[i][])); puts("");
  13. return ;
  14. }

F题:暴力贪心。n<=200直接暴力找从深度为n开始距离k以内的点集和。

贪心的取比较大的值即可。
将所有点按照深度从大到小排序,如果当前点点权a[i]大于0,则将距离为k以内的所有点减a[i]
代表取了当前点,为答案贡献a[i]
如果下面又扫到大于零的点权,说明那个点比这个大,于是取那个

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e6+;
  4. int n,k,a[maxn],t,nw,u,v,d[maxn],ans;
  5. vector<int> g[maxn];
  6. struct Edge{
  7. int v,nxt;
  8. } edge[maxn<<];
  9. int head[maxn],tot;
  10. void AddEdge(int u,int v)
  11. {
  12. edge[tot].v=v;edge[tot].nxt=head[u];head[u]=tot++;
  13. edge[tot].v=u;edge[tot].nxt=head[v];head[v]=tot++;
  14. }
  15. void dfs(int x,int fa)
  16. {
  17. g[d[x]=d[fa]+].push_back(x);
  18. for(int i=head[x],j;~i;i=edge[i].nxt)
  19. if((j=edge[i].v)!=fa) dfs(j,x);
  20. }
  21. void dfs2(int x,int fa,int dep)
  22. {
  23. a[x]-=nw;
  24. if(dep==k) return;
  25. for(int i=head[x],j;~i;i=edge[i].nxt)
  26. if((j=edge[i].v)!=fa) dfs2(j,x,dep+);
  27. }
  28. int main()
  29. {
  30. scanf("%d%d",&n,&k);
  31. for(int i=;i<=n;++i) scanf("%d",a+i),head[i]=-;
  32. for(int i=;i<n;++i) scanf("%d%d",&u,&v),AddEdge(u,v);
  33. dfs(,);
  34. for(int i=n;i;--i)
  35. for(int j=,sz=g[i].size(),x;j<sz;++j)
  36. if((x=a[g[i][j]])>) nw=x,ans+=x,dfs2(g[i][j],,);
  37. printf("%d\n",ans);
  38. return ;
  39. }

CF595 Div31249A,1249B1,1249B2,1249C1,1249C2,1249D1,1249D2,1249E,1249F)题解的更多相关文章

  1. codeforces 1249C1 + 1249C2 (贪心)

    (点击此处查看原题) 题意分析 给出一个数n,求一个数m,使得m >= n ,并且m 满足: m = ∑ 3 ^ i * x (x = 0 或者 x = 1 ),求出满足条件的最小的m 解题思路 ...

  2. codeforces 1249D1/D2 Too Many Segments (贪心)

    (点击此处查看原题) 题意说明 有n个区间,第i个区间覆盖范围[li,ri]内所有点,问删除最少哪些区间,使得所有点被区间覆盖的次数少于等于k次 解题思路 看到这个题的时候,觉得和开关(反转)问题很像 ...

  3. Books Exchange (easy version)   CodeForces - 1249B2

    The only difference between easy and hard versions is constraints. There are nn kids, each of them i ...

  4. CF-595

    题目传送门 A .Yet Another Dividing into Teams sol:原先是用比较复杂的方法来解的,后来学弟看了一眼,发现不是1就是2,当出现两个人水平相差为1就分成两组,1组全是 ...

  5. CodeForces1249B1/B2-Books Exchange-dfs-一般搜索+记忆化搜索

    一般搜索 注意:一般定义成void Books Exchange (easy version)  CodeForces - 1249B2 The only difference between eas ...

  6. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  7. PAT甲级 1001. A+B Format (20)

    题目原文: Calculate a + b and output the sum in standard format -- that is, the digits must be separated ...

  8. PAT练习题目录

    点题号就能查看题解了,另外代码也放在了开源中国码云上: 甲级:代码集合:https://git.oschina.net/firstmiki/PAT-Advanced-Level-Practise 10 ...

  9. bzoj1079--记忆化搜索

    题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...

随机推荐

  1. jquery序列帧播放(支持视频自动播放和不是全屏播放)

    jquery序列帧播放 这个弊端就是到时候需要升级下带宽 至少10MB 保证不卡.. ae导出序列真的时候 每秒10帧 就是代码每秒播放10张图片 尺寸适当的可以压小点<pre> < ...

  2. JavaScrip 基础

    JavaScript 基础 前段的三剑客之一JS,来来来,看看它是什么鬼!到底如何让网页动起来的呢,今天就搞他一下. 一.JavaScript的简单介绍 javascript是一门动态弱类型的解释型编 ...

  3. Dubbo的应用

    导语:Dubbo是阿里巴巴的一个分布式服务的开源框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000 ...

  4. (转)白话数字签名(2)——软件&设备

    然而它太慢了 非对称加密算法有一个重大缺点——加密速度慢,或者说得更拽一些,编码率比较低.例如在上一篇里我给Clark传的那个1GB的小电影,进行非对称加密足足用了66小时.那个借条小一些吧,也用了将 ...

  5. element 动态合并表格

    前言 element 官方的例子太简单了,不满足实际的需求 数据肯定是动态的,合并的行数,列数都是动态的,该如何知道每一行的合并数呢 需求 动态合并表格,数据来源于数据库 正文 一开始,我的数据源是单 ...

  6. git回退之git reset

    参考 https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86 https: ...

  7. 创建基于OData的Web API - Knowledge Builder API, Part I:Business Scenario

    在.NET Core 刚刚1.0 RC的时候,我就给OData团队创建过Issue让他们支持ASP.NET Core,然而没有任何有意义的答复. Roadmap for ASP.NET Core 1. ...

  8. tar使用笔记

    解压到指定目录 -C tar -zxvf test.tar.gz -C /opt

  9. 关闭Eslint检查

    Eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格.不过有点过于严格,通常缩减不同也会报错... 这会影响工作效率啊,最好就是在创建项目的时候不要ESlint(选择No ...

  10. Alibaba Nacos 学习(一):Nacos介绍与安装

    Alibaba Nacos 学习(一):Nacos介绍与安装 Alibaba Nacos 学习(二):Spring Cloud Nacos Config Alibaba Nacos 学习(三):Spr ...