Codeforces Round #530 (Div. 1)
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)的更多相关文章
- Codeforces Round #530 (Div. 2) F (树形dp+线段树)
F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...
- Codeforces Round #530 (Div. 2) A,B,C,D
A. Snowball 链接:http://codeforces.com/contest/1099/problem/A 思路:模拟 代码: #include<bits/stdc++.h> ...
- 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号结 ...
- Codeforces Round #530 (Div. 2) F 线段树 + 树形dp(自下往上)
https://codeforces.com/contest/1099/problem/F 题意 一颗n个节点的树上,每个点都有\(x[i]\)个饼干,然后在i节点上吃一个饼干的时间是\(t[i]\) ...
- Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)
题:https://codeforces.com/contest/1099/problem/F 题意:给定一个树,每个节点有俩个信息x和t,分别表示这个节点上的饼干个数和先手吃掉这个节点上一个饼干的的 ...
- Codeforces Round #530 (Div. 2) C D
C: *可以保留删除或者增加 ? 保留或者删除 #include<bits/stdc++.h> using namespace std; int main(){ string s; int ...
- Codeforces Round #530 (Div. 2)
RANK :2252 题数 :3 补题: D - Sum in the tree 思路:贪心 把权值放在祖先节点上 ,预处理 每个节点保存 他与他儿子中 权值最小值即可. 最后会有一些叶子节点依旧为 ...
- Codeforces Round #530 Div. 1 自闭记
A:显然应该让未确定的大小尽量大.不知道写了啥就wa了一发. #include<iostream> #include<cstdio> #include<cmath> ...
- Codeforces Round #530 (Div. 2) F - Cookies
F - Cookies 思路:我们先考虑如何算出在每个节点结束最多能吃多少饼干, 这个dfs的时候用线段树维护一下就好了, 然后有个这个信息之后树上小dp一下就好啦. #include<bits ...
随机推荐
- Python之Pandas使用教程(转)
https://blog.csdn.net/XiaoYi_Eric/article/details/79506660
- 【Python】如何切换浏览器的tap页?
当点击浏览器当前页面中的某个链接后自动弹出一个新的浏览器的tap页面时,浏览器正常都会在当前操作的tap页面右1位置打开新弹出的tap页. 当前selenium还不具备自动切换页面后窗口切换功能.需要 ...
- 【剑指offer】从上往下打印二叉树
一.题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 二.思路: 用队列,用根节点初始化队列,然后依次从队列中取出节点,先把当前节点输出,并把左右子树分别放入队列,直到队列为空.欧了. ...
- 系列解读Dropout
本文主要介绍Dropout及延伸下来的一些方法,以便更深入的理解. 想要提高CNN的表达或分类能力,最直接的方法就是采用更深的网络和更多的神经元,即deeper and wider.但是,复杂的网络也 ...
- ubuntu 安装ftp nginx tomcat,mysql
tomcat sudo apt-get install tomcat 访问方式,http://loclahost:8080 进入sbin目录下 sudo ./startup.sh开启 sudo ./s ...
- SQL CASE 多条件用法
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN ...
- Ghost硬盘对拷
Ghost硬盘对拷 优点:全盘完全100%对拷,包括原有操作系统也可使用.新硬盘对拷结束后,可直接插上电脑使用.消耗时间最短. 困难:对于第一次操作Ghost对拷的新人来说,需要严格对照图片步骤教程. ...
- html03
快速开发指南:1.新建页面之后,编写外部样式表文件,引入到HTML页面中2.用浏览器打开页面->F12->sources->打开css文件 右边编写样式,左边查看效果3.样式编写完成 ...
- http协议基础(八)请求首部字段
请求首部字段 定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息.客户端信息以及对响应内容相关的优先级等内容 1.Accept 通知服务器用户代理可处理的媒体类型及媒体 ...
- time使用方法