A:签到。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  9. int read()
  10. {
  11. int x=0,f=1;char c=getchar();
  12. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  13. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. return x*f;
  15. }
  16. int n,a,b;
  17. int main()
  18. {
  19. /*freopen("a.in","r",stdin);
  20. freopen("a.out","w",stdout);*/
  21. n=read(),a=read(),b=read();
  22. cout<<min(a,b)<<' '<<max(0,a+b-n);
  23. return 0;
  24. }

  B:签到。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  9. int read()
  10. {
  11. int x=0,f=1;char c=getchar();
  12. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  13. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. return x*f;
  15. }
  16. #define N 110
  17. int n;
  18. char a[N],b[N],c[N];
  19. int main()
  20. {
  21. /*freopen("a.in","r",stdin);
  22. freopen("a.out","w",stdout);*/
  23. n=read();
  24. scanf("%s",a+1);scanf("%s",b+1);scanf("%s",c+1);
  25. int ans=0;
  26. for (int i=1;i<=n;i++)
  27. {
  28. if (a[i]==b[i]&&b[i]==c[i]) ;
  29. else if (a[i]==b[i]||a[i]==c[i]||b[i]==c[i]) ans++;
  30. else ans+=2;
  31. }
  32. cout<<ans;
  33. return 0;
  34. }

  C:考虑一种菜自己吃和对方吃的收益差,于是显然按ai+bi排序从大到小选即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  9. int read()
  10. {
  11. int x=0,f=1;char c=getchar();
  12. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  13. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. return x*f;
  15. }
  16. #define N 300010
  17. #define ll long long
  18. int n;
  19. struct data
  20. {
  21. int x,y;
  22. bool operator <(const data&a) const
  23. {
  24. return x+y<a.x+a.y;
  25. }
  26. }a[N];
  27. ll ans;
  28. int main()
  29. {
  30. /*freopen("a.in","r",stdin);
  31. freopen("a.out","w",stdout);*/
  32. n=read();
  33. for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
  34. sort(a+1,a+n+1);reverse(a+1,a+n+1);
  35. for (int i=1;i<=n;i++)
  36. if (i&1) ans+=a[i].x;
  37. else ans-=a[i].y;
  38. cout<<ans;
  39. return 0;
  40. }

  D:显然图仍是一个DAG,其中度数为0的点是原树的根。由于图中没有重边,瞎考虑一下容易发现,对于每一个点,由根到它的最长路上该点的前驱即为其在原树中的父亲。拓扑排序一下即可。开始写了个不知道啥玩意于是比E晚了10min。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  9. int read()
  10. {
  11. int x=0,f=1;char c=getchar();
  12. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  13. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. return x*f;
  15. }
  16. #define N 300010
  17. #define ll long long
  18. int n,m,p[N],fa[N],deep[N],degree[N],q[N],t,root;
  19. bool flag[N];
  20. struct data{int to,nxt;
  21. }edge[N];
  22. void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
  23. void topsort()
  24. {
  25. int head=0,tail=0;
  26. for (int i=1;i<=n;i++) if (!degree[i]) q[++tail]=i;
  27. while (tail<n)
  28. {
  29. int x=q[++head];
  30. for (int i=p[x];i;i=edge[i].nxt)
  31. {
  32. degree[edge[i].to]--;
  33. if (deep[x]+1>deep[edge[i].to])
  34. {
  35. deep[edge[i].to]=deep[x]+1;
  36. fa[edge[i].to]=x;
  37. }
  38. if (!degree[edge[i].to]) q[++tail]=edge[i].to;
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. n=read(),m=read();
  45. for (int i=1;i<n+m;i++)
  46. {
  47. int x=read(),y=read();
  48. addedge(x,y);degree[y]++;
  49. }
  50. topsort();
  51. for (int i=1;i<=n;i++) printf("%d\n",fa[i]);
  52. return 0;
  53. }

  E:显然从大到小考虑每条边是否需要删即可,但删边的过程中难以维护连通块信息。注意到只有MST的边会对最后所得图的连通性产生影响。于是求出MST,然后可以从大到小删边用LCT维护,但这样显然比较毒瘤。事实上还可以建出kruskal重构树,从大到小考虑每条边,如果其在重构树的父亲不需要被删掉,显然其也不需要被删掉;否则此时其所在连通块即为其在重构树上的子树,判断一下是否需要删掉即可。这样就得到了最后的连通信息,最后再考虑每条边是否保留即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  9. int read()
  10. {
  11. int x=0,f=1;char c=getchar();
  12. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  13. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. return x*f;
  15. }
  16. #define N 400010
  17. #define ll long long
  18. int n,m,a[N],fa[N],id[N],cnt,ans;
  19. bool isdel[N],flag[N];
  20. ll value[N<<2];
  21. struct data
  22. {
  23. int x,y,z;
  24. bool operator <(const data&a) const
  25. {
  26. return z<a.z;
  27. }
  28. }e[N];
  29. int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  30. namespace kruskal_tree
  31. {
  32. int p[N<<2],t,degree[N<<2],fa[N<<2];
  33. ll size[N<<2];
  34. struct data{int to,nxt;}edge[N<<2];
  35. void addedge(int x,int y){t++;degree[y]++;fa[y]=x;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
  36. void link(int x,int y,int i)
  37. {
  38. id[i]=++cnt;addedge(cnt,x),addedge(cnt,y);
  39. }
  40. void dfs(int k)
  41. {
  42. size[k]=a[k];
  43. for (int i=p[k];i;i=edge[i].nxt)
  44. {
  45. dfs(edge[i].to);
  46. size[k]+=size[edge[i].to];
  47. }
  48. }
  49. void build()
  50. {
  51. for (int i=1;i<=cnt;i++)
  52. if (!degree[i]) dfs(i);
  53. }
  54. void del()
  55. {
  56. isdel[0]=1;
  57. for (int i=m;i>=1;i--)
  58. if (flag[i]&&isdel[fa[id[i]]]&&e[i].z>size[id[i]]) isdel[id[i]]=1;
  59. }
  60. }
  61. void dfs(int k)
  62. {
  63. for (int i=kruskal_tree::p[k];i;i=kruskal_tree::edge[i].nxt)
  64. {
  65. dfs(kruskal_tree::edge[i].to);
  66. if (!isdel[k]) fa[find(kruskal_tree::edge[i].to)]=k;
  67. }
  68. }
  69. int main()
  70. {
  71. n=read(),m=read();
  72. for (int i=1;i<=n;i++) a[i]=read();
  73. for (int i=1;i<=m;i++) e[i].x=read(),e[i].y=read(),e[i].z=read();
  74. sort(e+1,e+m+1);
  75. for (int i=1;i<=4*n;i++) fa[i]=i;cnt=n;
  76. for (int i=1;i<=m;i++)
  77. {
  78. int p=find(e[i].x),q=find(e[i].y);
  79. if (p!=q) kruskal_tree::link(p,q,i),fa[p]=fa[q]=id[i],flag[i]=1;
  80. }
  81. kruskal_tree::build();
  82. kruskal_tree::del();
  83. for (int i=1;i<=cnt;i++) fa[i]=i;
  84. for (int i=1;i<=cnt;i++)
  85. if (!kruskal_tree::degree[i]) dfs(i);
  86. for (int i=1;i<=m;i++)
  87. if (find(e[i].x)==find(e[i].y)&&kruskal_tree::size[find(e[i].x)]>=e[i].z) ans++;
  88. cout<<m-ans;
  89. return 0;
  90. }

  result:rank 132 rating +84

NIKKEI Programming Contest 2019 翻车记的更多相关文章

  1. AISing Programming Contest 2019 翻车记

    A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...

  2. [AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

    [AtCoder] NIKKEI Programming Contest 2019   本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...

  3. AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)

    题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...

  4. atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

    题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...

  5. 【AtCoder】全国統一プログラミング王決定戦予選/NIKKEI Programming Contest 2019

    感觉最近好颓,以后不能这么颓了,要省选了,争取省选之前再板刷一面ATC??? A - Subscribers 简单容斥 #include <bits/stdc++.h> #define f ...

  6. Dwango Programming Contest V 翻车记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  7. AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)

    题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...

  8. [AtCoder] Yahoo Programming Contest 2019

    [AtCoder] Yahoo Programming Contest 2019   很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...

  9. Yahoo Programming Contest 2019 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

随机推荐

  1. 任务调度工具Quartz入门笔记

    一,导包 1)官网下载:http://www.quartz-scheduler.org/downloads/ 2)Maven <dependency> <groupId>org ...

  2. zookeeper-操作与应用场景-《每日五分钟搞定大数据》

    Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...

  3. nodeJs配置

    1.  vi /etc/profile export NODE_HOME=/opt/node-v6.9.1-linux-x64export PATH=$PATH:$NODE_HOME/binexpor ...

  4. python线程中的全局变量与局部变量

    在python多线程开发中,全局变量是多个线程共享的数据,局部变量是各自线程的,非共享的. 如下几种写法都是可以的: 第一种:将列表当成参数传递给线程 from threading import Th ...

  5. InvalidDataAccessResourceUsageException:mysql保留字引发的血案

    org.springframework.dao.InvalidDataAccessResourceUsageException: could NOT EXECUTE statement; SQL [n ...

  6. Windows系统,文件和文件夹命名规则:

    不能包含:< > / \ | : * ? windows中,文件名(包括扩展名)可高达 个字符.文件名可以包含除 ? “ ”/ \ < > * | : 之外的大多数字符:保留文 ...

  7. 【转】linux if 判断

    UNIX Shell 里面比较字符写法: -eq   等于-ne    不等于-gt    大于-lt    小于-le    小于等于-ge   大于等于-z 空串=    两个字符相等!=    ...

  8. 利用php查看某个服务的进程数

    查看进程就是使用ps命令而已,只不顾ps的参数太多了. 使用php查询的话,必须要开启几个函数(可以执行外部程序的函数),参考官网:http://php.net/manual/zh/book.exec ...

  9. java list 去重

    Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/6895 ...

  10. asp.net Json序列化

    Json作为一种数据传输格式与标准被广泛的使用在项目开发中,可以说简直离不开它.那么怎么来生成JSON格式的数据就成了我们首先需要解决的问题这里我们使用.net. 首先是获取数据 public ban ...