A:签到。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,a,b;
int main()
{/*freopen("a.in","r",stdin);freopen("a.out","w",stdout);*/n=read(),a=read(),b=read();cout<<min(a,b)<<' '<<max(0,a+b-n);return 0;
}

  B:签到。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 110
int n;
char a[N],b[N],c[N];
int main()
{/*freopen("a.in","r",stdin);freopen("a.out","w",stdout);*/n=read();scanf("%s",a+1);scanf("%s",b+1);scanf("%s",c+1);int ans=0;for (int i=1;i<=n;i++){if (a[i]==b[i]&&b[i]==c[i]) ;else if (a[i]==b[i]||a[i]==c[i]||b[i]==c[i]) ans++;else ans+=2;}cout<<ans;return 0;
}

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 300010
#define ll long long
int n;
struct data
{int x,y;bool operator <(const data&a) const{return x+y<a.x+a.y;}
}a[N];
ll ans;
int main()
{/*freopen("a.in","r",stdin);freopen("a.out","w",stdout);*/n=read();for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();sort(a+1,a+n+1);reverse(a+1,a+n+1);for (int i=1;i<=n;i++)if (i&1) ans+=a[i].x;else ans-=a[i].y;cout<<ans;return 0;
}

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 300010
#define ll long long
int n,m,p[N],fa[N],deep[N],degree[N],q[N],t,root;
bool flag[N];
struct data{int to,nxt;
}edge[N];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void topsort()
{int head=0,tail=0;for (int i=1;i<=n;i++) if (!degree[i]) q[++tail]=i;while (tail<n){int x=q[++head];for (int i=p[x];i;i=edge[i].nxt){degree[edge[i].to]--;if (deep[x]+1>deep[edge[i].to]){deep[edge[i].to]=deep[x]+1;fa[edge[i].to]=x;}if (!degree[edge[i].to]) q[++tail]=edge[i].to;}}
}
int main()
{n=read(),m=read();for (int i=1;i<n+m;i++){int x=read(),y=read();addedge(x,y);degree[y]++;}topsort();for (int i=1;i<=n;i++) printf("%d\n",fa[i]);return 0;
}

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 400010
#define ll long long
int n,m,a[N],fa[N],id[N],cnt,ans;
bool isdel[N],flag[N];
ll value[N<<2];
struct data
{int x,y,z;bool operator <(const data&a) const{return z<a.z;}
}e[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
namespace kruskal_tree
{int p[N<<2],t,degree[N<<2],fa[N<<2];ll size[N<<2];struct data{int to,nxt;}edge[N<<2];void addedge(int x,int y){t++;degree[y]++;fa[y]=x;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}void link(int x,int y,int i){id[i]=++cnt;addedge(cnt,x),addedge(cnt,y);}void dfs(int k){size[k]=a[k];for (int i=p[k];i;i=edge[i].nxt){dfs(edge[i].to);size[k]+=size[edge[i].to];}}void build(){for (int i=1;i<=cnt;i++)if (!degree[i]) dfs(i);}void del(){   isdel[0]=1;for (int i=m;i>=1;i--)if (flag[i]&&isdel[fa[id[i]]]&&e[i].z>size[id[i]]) isdel[id[i]]=1;}
}
void dfs(int k)
{for (int i=kruskal_tree::p[k];i;i=kruskal_tree::edge[i].nxt){dfs(kruskal_tree::edge[i].to);if (!isdel[k]) fa[find(kruskal_tree::edge[i].to)]=k;}
}
int main()
{n=read(),m=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<=m;i++) e[i].x=read(),e[i].y=read(),e[i].z=read();sort(e+1,e+m+1);for (int i=1;i<=4*n;i++) fa[i]=i;cnt=n;for (int i=1;i<=m;i++){int p=find(e[i].x),q=find(e[i].y);if (p!=q) kruskal_tree::link(p,q,i),fa[p]=fa[q]=id[i],flag[i]=1;}kruskal_tree::build();kruskal_tree::del();for (int i=1;i<=cnt;i++) fa[i]=i;for (int i=1;i<=cnt;i++)if (!kruskal_tree::degree[i]) dfs(i);for (int i=1;i<=m;i++)if (find(e[i].x)==find(e[i].y)&&kruskal_tree::size[find(e[i].x)]>=e[i].z) ans++;cout<<m-ans;return 0;
}

  result:rank 132 rating +84

转载于:https://www.cnblogs.com/Gloid/p/10328307.html

NIKKEI Programming Contest 2019 翻车记相关推荐

  1. Yahoo Programming Contest 2019 自闭记

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

  2. Yahoo Programming Contest 2019 F - Pass

    传送门 题目大意 给定一个只包含012序列,0表示这个人有2个红球,1表示一个红球一个蓝球,2表示两个蓝球.进行n*2次游戏,每次游戏所有有球的人选择一个球递给前一个人,第一个人把球放到一个序列中,' ...

  3. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() {n=read();k=read();puts(k<=(n+1)/2?"YES":"NO&quo ...

  4. The 10th Shandong Provincial Collegiate Programming Contest 2019山东省赛游记+解题报告

    比赛结束了几天...这篇博客其实比完就想写了...但是想等补完可做题顺便po上题解... 5.10晚的动车到了济南,没带外套有点凉.酒店还不错. 5.11早上去报道,济南大学好大啊...感觉走了一个世 ...

  5. Yahoo Programming Contest 2019 E - Odd Subrectangles

    E - Odd Subrectangles 链接 题意: n*m的01矩阵,选出一些行和一些列,计算多少个选的方式,使得相交的点的权值和,是奇数,n,m<=300. 分析: 考虑选出了行,有多少 ...

  6. HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019

    赛后总结: T:今天下午参加了答辩比赛,没有给予队友很大的帮助.远程做题的时候发现队友在H上遇到了挫折,然后我就和她们说我看H吧,她们就开始做了另外两道题.今天一人一道题.最后我们在研究一道dp的时候 ...

  7. HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019

    今日这场比赛我们准备的题比较全面,二分+数论+最短路+计算几何+dp+思维+签到题等.有较难的防AK题,也有简单的签到题.为大家准备了一份题解和AC代码. A - Meeting with Alien ...

  8. Yahoo Programming Contest 2019 D - Ears

    D - Ears 思路: s:起点           t:终点           l:左端点           r:右端点 以上称为关键点 dp[i][j]表示到位置 i 为止,已经经过前 j ...

  9. Yahoo Programming Contest 2019 D-Ears

    传送门 题目大意 分析 我们不难整个线段可以被划分为5段 我们设路径到达的最左的地方是L,最右的地方是R 则这五段分别是0~L,L+1~S,S+1~T,T+1~R,R+1~N 最外面的两端不经过,所以 ...

最新文章

  1. 何恺明时隔2年再发一作论文:为视觉大模型开路,“CVPR 2022最佳论文候选预定”...
  2. 【笔记】springboot使用Spring-data-jpa
  3. python怎么处理文字_使用python进行简单的文本处理
  4. 配置zentaophp
  5. 缓存在大型网站架构中的应用
  6. 手动构建磁贴服务器(16.04.2 LTS)
  7. android设置存储,在android应用程序中存储用户设置的最合适方法是什么?
  8. linux es数据库 head,centos7安装Elasticsearch及Es-head插件详细教程(图文)
  9. [转]mysql免安装版配置
  10. 数据结构(一):并查集
  11. Halcon软件和license下载
  12. windows注册表文件损坏了,导致windows无法启动,解决办法!
  13. 苹果 macOS 系统键盘快捷键列表大全整理
  14. UG塑胶模具设计培训,、胶模具成型工艺培训
  15. 计算机网上邻居的网络密码是什么,网上邻居打开时需访问密码是怎么回事
  16. java 图片画框并读取成base64数据
  17. 多商户JAVA扫码点餐小程序源码SaaS模式
  18. OpenCV中文文档4.0.0学习笔记(更新中……)
  19. 认识System Center之一
  20. 喊你来学习:这些技术微信号你关注了吗?

热门文章

  1. lombok slfj 中_lombok @Slf4j注解
  2. cmd 将文件夹下文件剪切到另外一个文件_手把手教你运行第一个 Java 程序,看不懂你来骂我!...
  3. 借书卡程序设计java_java图书馆借书编程求解
  4. 基于多分类支持向量机和KNN分类器的大豆叶片病害检测与严重程度测量
  5. java实现ip能访问_Java过滤ip,只允许配置的ip能够被访问
  6. LSTM模型实战案例:TensorFlow实现预测3位彩票号码
  7. c fun函数求n个整数的平均值_Python语法示例——函数
  8. 计算机应用理论题计算机系统,计算机应用理论题.doc
  9. 电脑上怎么做pdf文件_怎么合并PDF文件?PDF合并软件哪个好?
  10. Apache HttpServer与Tomcat7集群Linux版