NIKKEI Programming Contest 2019 翻车记
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
NIKKEI Programming Contest 2019 翻车记的更多相关文章
- AISing Programming Contest 2019 翻车记
A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...
- [AtCoder] NIKKEI Programming Contest 2019 (暂缺F)
[AtCoder] NIKKEI Programming Contest 2019 本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...
- AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)
题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...
- atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges
题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...
- 【AtCoder】全国統一プログラミング王決定戦予選/NIKKEI Programming Contest 2019
感觉最近好颓,以后不能这么颓了,要省选了,争取省选之前再板刷一面ATC??? A - Subscribers 简单容斥 #include <bits/stdc++.h> #define f ...
- Dwango Programming Contest V 翻车记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)
题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...
- [AtCoder] Yahoo Programming Contest 2019
[AtCoder] Yahoo Programming Contest 2019 很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...
- Yahoo Programming Contest 2019 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
随机推荐
- H5 32-百度首页
32-百度首页 新 闻 网 页 贴 吧 知 道 音 乐 图 片 视 频 地 图 百科 文库 hao123 | 更多>> 百度地图带你吃喝玩乐,全心全意为人民服务 把百度设为主页 安装百度卫 ...
- H5 后代选择器
12-后代选择器 我是段落 我是段落 我是段落 我是段落 我是段落 我是段落 <!DOCTYPE html> <html lang="en"> <he ...
- Codeforces Round #534 (Div. 2)D. Game with modulo-1104-D(交互+二分+构造)
D. Game with modulo time limit per test 1 second memory limit per test 256 megabytes input standard ...
- mybatis配置文件配错
UG] 2017-10-04 20:04:30,582(137226) --> [http-bio-8082-exec-9] org.springframework.web.servlet.ha ...
- redis的应用场景 为什么用redis
一.不是万能的菲关系系数据库redis 在面试的时候,常被问比较下Redis与Memcache的优缺点,个人觉得这二者并不适合一起比较,redis:是非关系型数据库不仅可以做缓存还能干其它事情,Mem ...
- 【学习总结】 小白CS成长之路
2017-9-3:入坑. 理想:敲着代码唱着歌. 现实:骨感. Step 1: 认识CS: CS大体可以分成以下几个大领域:硬件.系统.软件.网络.计算理论.计算方法. 硬 件 ---- 数字电路.集 ...
- 2019省赛训练组队赛3.26周二---FJUT 2016
A.Minimum’s Revenge There is a graph of n vertices which are indexed from 1 to n. For any pair of di ...
- rem移动端适配方案
一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素 ...
- IdentityServer4【Topic】之授权类型
Grant Types 授权类型 授权类型指出了一个客户端如何与IdentityServer进行交互.OpenID Conect和OAuth2.0定义了如下的授权类型: Implicit Author ...
- 如何让pl/sql developer记住密码,实现快速登录
前两天,有同事使用plsql的时候,切换数据库的时候需要不断的重复输入密码,这样太麻烦了. 下面,我这里说下如何的实现plsql不需要输入密码就能快速登录的方法: 1.一开始登录,首先像往常那样输入密 ...