A - Sum in the tree

就是贪心选尽量让上面的点权尽量大,那么对于偶数层的点,其到根节点的和即为所有儿子中的最大值。

#include<bits/stdc++.h>
using namespace std; char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
T f=1;ans=0;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
} typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=1000000007; int s[Maxn],to[Maxn],nxt[Maxn],first[Maxn],tot=1;
int n,x,flag;
ll ans; inline void add(int u,int v) {
to[tot]=v;
nxt[tot]=first[u];
first[u]=tot++;
} void dfs(int root) {
if(s[root]==-1) {
int temp=inf;
for(int i=first[root];i;i=nxt[i]) {
dfs(to[i]);
temp=min(temp,s[to[i]]);
}
s[root]=temp;
for(int i=first[root];i;i=nxt[i]) {
ans+=s[to[i]]-s[root];
}
}
else {
for(int i=first[root];i;i=nxt[i]) {
dfs(to[i]);
if(s[to[i]]==inf) s[to[i]]=s[root];
if(s[to[i]]<s[root]) flag=1;
ans+=s[to[i]]-s[root];
}
}
} int main() {
read(n);
for(int i=2;i<=n;i++) {
read(x);
add(x,i);
}
for(int i=1;i<=n;i++) read(s[i]);
dfs(1);ans+=s[1];
if(flag) return 0*puts("-1");
printf("%I64d",ans);
return 0;
}

B - Nice table

这个结论就是要么是对于每一行都只有两种字符或每一列都只有两种字符。至于为什么。。自己感性理解一下就好了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#include<string>
#include<iostream>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std; inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
} typedef long long ll;
const int Maxn=310000;
const int inf=0x3f3f3f3f; char t[4]={'A','T','C','G'};
string a[Maxn],b[Maxn];
int w[Maxn][4][4],w1[Maxn][4][4];
int p[4],p1[4],p2[4],n,m; inline bool check() {
return p[1]!=1||p[2]!=2||p[3]!=3||p[0]!=0;
} int calc() {
int ans=0;
for(int i=0,t=2;i<m;i++,t^=2)
ans+=min(w[i][p[0+t]][p[1+t]],w[i][p[1+t]][p[0+t]]);
return ans;
} signed main() {
// freopen("test.in","r",stdin);
read(n,m);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++)
for(int x=0;x<4;x++)
for(int y=0;y<4;y++)
for(int j=0;j<n;j++)
if(j&1) w[i][x][y]+=(t[y]!=a[j][i]);
else w[i][x][y]+=(t[x]!=a[j][i]);
int ans1=inf,ans2=inf;
for(int i=0;i<4;i++) p[i]=i;
do {
int temp=calc();
if(temp<ans1) {
ans1=temp;
memcpy(p1,p,sizeof(p));
}
}
while(next_permutation(p,p+4),check());
for(int i=0;i<m;i++) b[i].resize(n);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) b[j][i]=a[i][j];
memcpy(w1,w,sizeof(w1));
memset(w,0,sizeof(w));
swap(n,m);
for(int i=0;i<m;i++)
for(int x=0;x<4;x++)
for(int y=0;y<4;y++)
for(int j=0;j<n;j++)
if(j&1) w[i][x][y]+=(t[y]!=b[j][i]);
else w[i][x][y]+=(t[x]!=b[j][i]);
do {
int temp=calc();
if(temp<ans2) {
ans2=temp;
memcpy(p2,p,sizeof(p));
}
}
while(next_permutation(p,p+4),check());
swap(n,m);
if(ans1<ans2)
for(int i=0;i<n;i++,puts(""))
for(int j=0;j<m;j++)
if(j&1) putchar(t[p1[(w1[j][p1[0]][p1[1]]>w1[j][p1[1]][p1[0]])^(i&1)]]);
else putchar(t[p1[(w1[j][p1[2]][p1[3]]>w1[j][p1[3]][p1[2]])^(i&1)+2]]);
else
for(int i=0;i<n;i++,puts(""))
for(int j=0;j<m;j++)
if(i&1) putchar(t[p2[(w[i][p2[0]][p2[1]]>w[i][p2[1]][p2[0]])^(j&1)]]);
else putchar(t[p2[(w[i][p2[2]][p2[3]]>w[i][p2[3]][p2[2]])^(j&1)+2]]);
return 0;
}

C - Construct a tree

首先就是分叉数越大,其对应的所有子树的大小和越小。那么依次枚举判断,如果合法构造即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std; inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
} typedef long long ll;
const int Maxn=110000;
const int inf=0x3f3f3f3f; int n,a[Maxn],p[Maxn];
ll s; ll check(int x) {
ll res=n,temp=1,ans=0;
for(int i=1;res;i++) {
qmin(temp,res);
ans+=temp*i;
res-=temp;
temp*=x;
}
return ans;
} void work(int x) {
a[1]=1;s--;
ll res=n-1,temp=x,t=2;
for(;res;t++) {
qmin(temp,res);
s-=temp*t;
a[t]=temp;
res-=temp;
temp*=x;
}
for(int i=t-1;s;i--) {
while(a[i]>1) {
a[i]--;
s+=i;
if(s>t) {
s-=t;
a[t++]++;
}
else {
a[s]++;
s=0;
break;
}
}
}
int sum=0,tempp=1;
for(int i=1;i<t;i++) {
int temp=sum+1;
sum=tempp;
for(int j=temp;j<=sum;j++)
for(int k=min(a[i+1],x);k;k--) {
p[++tempp]=j;
a[i+1]--;
}
}
for(int i=2;i<=n;i++) printf("%d ",p[i]);
} signed main() {
// freopen("test.in","r",stdin);
read(n,s);
if(1ll*n*(n+1)/2==s) {
puts("Yes");
for(int i=2;i<=n;i++) printf("%d ",i-1);
return 0;
}
if(1ll*n*(n+1)/2<s||2*n-1>s) {
puts("No");
return 0;
}
for(int i=2;i<=n;i++) if(check(i)<=s) {
puts("Yes");
work(i);
return 0;
}
return 0;
}

Codeforces Round #530 (Div. 1)的更多相关文章

  1. Codeforces Round #530 (Div. 2) F (树形dp+线段树)

    F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...

  2. Codeforces Round #530 (Div. 2) A,B,C,D

    A. Snowball 链接:http://codeforces.com/contest/1099/problem/A 思路:模拟 代码: #include<bits/stdc++.h> ...

  3. Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)

    D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...

  4. Codeforces Round #530 (Div. 2) F 线段树 + 树形dp(自下往上)

    https://codeforces.com/contest/1099/problem/F 题意 一颗n个节点的树上,每个点都有\(x[i]\)个饼干,然后在i节点上吃一个饼干的时间是\(t[i]\) ...

  5. Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)

    题:https://codeforces.com/contest/1099/problem/F 题意:给定一个树,每个节点有俩个信息x和t,分别表示这个节点上的饼干个数和先手吃掉这个节点上一个饼干的的 ...

  6. Codeforces Round #530 (Div. 2) C D

    C: *可以保留删除或者增加 ? 保留或者删除 #include<bits/stdc++.h> using namespace std; int main(){ string s; int ...

  7. Codeforces Round #530 (Div. 2)

    RANK :2252 题数 :3 补题: D - Sum in the tree 思路:贪心 把权值放在祖先节点上 ,预处理 每个节点保存 他与他儿子中 权值最小值即可. 最后会有一些叶子节点依旧为 ...

  8. Codeforces Round #530 Div. 1 自闭记

    A:显然应该让未确定的大小尽量大.不知道写了啥就wa了一发. #include<iostream> #include<cstdio> #include<cmath> ...

  9. Codeforces Round #530 (Div. 2) F - Cookies

    F - Cookies 思路:我们先考虑如何算出在每个节点结束最多能吃多少饼干, 这个dfs的时候用线段树维护一下就好了, 然后有个这个信息之后树上小dp一下就好啦. #include<bits ...

随机推荐

  1. Frame报文

    链路层帧常用的帧格式有两种:Ethernet II   与   IEEE802.3 Ethernet II 格式多用于终端设备的通信 IEEE802.3  格式多用于网络设备的通信 如何区分这两种报文 ...

  2. OC导航栏自定义返回按钮

    [iOS]让我们一次性解决导航栏的所有问题 在默认情况下,导航栏返回按钮长这个样子   导航栏默认返回按钮 导航栏左上角的返回按钮,其文本默认为上一个ViewController的标题,如果上一个Vi ...

  3. (c++) int 转 string,char*,const char*和string的相互转换

    一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...

  4. Linux Packages Search

    网站 : https://www.pkgs.org/ https://centos.pkgs.org/

  5. Sqoop导入HBase,并借助Coprocessor协处理器同步索引到ES

    1.环境 Mysql 5.6 Sqoop 1.4.6 Hadoop 2.5.2 HBase 0.98 Elasticsearch 2.3.5 2.安装(略过) 3.HBase Coprocessor实 ...

  6. TileMap地图

    参考资料: http://8287044.blog.51cto.com/5179921/1045274 TileMap编辑器使用   1.认识TileMap     TileMap是一款开源的地图编辑 ...

  7. Redis 十分钟快速入门

    本教程是一个快速入门教程,所以Redis的命令只是简单介绍了几个常用的,如果有其他需求请求官网查看API 使用. 1. Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的ke ...

  8. c语言的字符串拷贝函数的精简

    #include <stdio.h>#include <string.h>void str_cpy(char * to, char *from){    while ((*to ...

  9. 20154312 曾林 Exp3 免杀原理与实践

    20154312 曾林 0.写在前面 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找到,也就是 ...

  10. 20154312《网络对抗》Exp2 后门原理与实践

    常见问题快速链接 Handler failed to bind to xxx.xxx.xx.xxx:xxxx 使用Webcam_snap命令提示1411错误,无法正常拍照 常用后门工具实践 Windo ...