bzoj 2799 [Poi2012]Salaries 性质+二分】的更多相关文章

题目大意 给出一棵n个结点的有根树,结点用正整数1~n编号. 每个结点有一个1~n的正整数权值,不同结点的权值不相同, 并且一个结点的权值一定比它父结点的权值小(根结点的权值最大,一定是n). 现在有些结点的权值是已知的,并且如果一个结点的权值已知,它父结点的权值也一定已知. 问还有哪些结点的权值能够唯一确定. 最后输出每个点的全值,不知道输出0 n<=1,000,000 分析 我们求出每个点最大可以是什么权值 如果i点权值<=d,而<=d中的权值已经确定了d-1个,那么i的权值也可以确…
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1000005; int n,a[N],b[N]; long long m,f[N],s[N]; int ok(int w) { long long ans=0; for(int i=1;i<=n;i++) b[i]=a[i]; for(int i=2;i<=n;i++) if(b[…
2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Status][Discuss] Description 给出一棵n个结点的有根树,结点用正整数1~n编号.每个结点有一个1~n的正整数权值,不同结点的权值不相同,并且一个结点的权值一定比它父结点的权值大(根结点的权值最大,一定是n).现在有些结点的权值是已知的,并且如果一个结点的权值已知,它父结点的权值也一…
题解:POI2012 Salaries Description The Byteotian Software Corporation (BSC) has \(n\) employees. In BSC's strict hierarchy, each employee has a direct supervisor, except the CEO, to whom all other BSC employees answer, directly or not. Each employee has…
[BZOJ2799][Poi2012]Salaries Description 给出一棵n个结点的有根树,结点用正整数1~n编号.每个结点有一个1~n的正整数权值,不同结点的权值不相同,并且一个结点的权值一定比它父结点的权值大(根结点的权值最大,一定是n).现在有些结点的权值是已知的,并且如果一个结点的权值已知,它父结点的权值也一定已知.问还有哪些结点的权值能够唯一确定. Input 第一行一个正整数n (n<=1,000,000),表示树的结点数.下面共n行,第i行描述编号为i的结点,每行两个…
题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满足下面条件的最大的L: \(L\le \frac n 2\) S的L前缀和S的L后缀是循环相同的. \(n\le 1,000,000\) 分析 题意相当于找一段前缀=后缀(1) 删掉这两段后再找一段前缀=后缀(2) 长度和就是答案了 其中(1)部分随便搞\(O(n)\) \(hsh\)扫过去就好了…
题目大意:给定一个非负整数序列A.每次操作能够选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max{Ai−Ai+1}最小,输出这个最小值以及此时最小的k 二分答案,然后验证的时候首先让相邻的都不超过x.然后枚举哪个点应该改成0 假设某个点须要改成0,那么须要进行操作的位置是一段区间.左右端点都单调,扫两遍即可了 #include <cstdio> #include <cstring> #include <iostream> #include <…
题目大意 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足Xk=0,并且z=max{|Xi - Xi+1|}最小. 输出最小的z和此时最小的k. 第一行两个正整数n, m (1<=n<=1,000,000, 1<=m<=10^18).第二行n个正整数X1,X2,...Xn (Xi<=10^9). 分析 我们考虑简单点的问题 我们要最小化z,考虑二分 对于没有要求变成0的问题 我们会尽可能使每个数操作…
题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因为,当使用的joker小于等于 x 时,才可以通过合适地安排顺序使得每组牌中至多有一张 joker . 代码 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio>…
题目 似乎很久没写题解了... 这题是校里胡策的时候的题,比赛因为评测机有点慢+自己代码常数大没快读...被卡t了,但是bzoj上还是A了的...,因为bzoj时限比较宽可以不卡常. 题解: 首先可以发现答案与操作顺序是无关的,也就是说,可以钦定答案就是x次操作,然后让先手的x次先全换了,然后再考虑我要怎么换,才能在最少次数内换成升序. 于是就可以直接枚举答案x,然后判一下x是否可行. 考虑如何判断,问题会变成,给定一个a序列,每次可以交换两个数,问最少交换多少次可以换成升序,也就是变成a[i]…