BZOJ4297 : [PA2015]Rozstaw szyn】的更多相关文章

每个点的最优取值范围是一个区间,将叶子一层层剥去,得到一棵有根树,父亲的取值范围由儿子推得,时间复杂度$O(n\log n)$. #include<cstdio> #include<algorithm> #define N 500010 int n,m,i,j,x,y,c,g[N],v[N<<1],nxt[N<<1],ed,d[N],l[N],r[N]; int del[N],G[N],V[N],NXT[N],h,t,q[N],f[N],a[N<<…
[BZOJ4297][PA2015]Rozstaw szyn Description 给定一棵有n个点,m个叶子节点的树,其中m个叶子节点分别为1到m号点,每个叶子节点有一个权值r[i].你需要给剩下n-m个点各指定一个权值,使得树上相邻两个点的权值差的绝对值之和最小. Input 第一行包含两个正整数n,m(2<=n<=500000,1<=m<=n),分别表示点数和叶子数.接下来n-1行,每行两个正整数u,v(1<=u,v<=n),表示u与v之间有一条边.接下来m行,…
[PA2015]Rozstaw szyn 题目大意: 一棵\(n(n\le5\times10^5)\)个点的树,其中有\(m\)个结点是叶子结点.叶子结点权值已知,你可以自己决定其余结点的权值,定义整棵树的代价为相邻结点权值差之和,求最小总代价. 思路: 贪心,对于每个结点可以维护其取值范围的上界和下界.将子结点的上界下界一并排序,取其中间两个数,即为父结点上界和下界.计算总代价时,令结点权值为其权值下界,可以证明不会影响答案. 时间复杂度\(\mathcal O(n\log n)\). 源代码…
从叶子往上先拓扑一下,建立虚拟root,从root开始dfs.注意到每个点的最优取值一定是一个区间(中位数区间),从儿子区间推出父亲区间即可 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=500005; int n,m,l[N],r[N],h[N],cnt,q[N],tot,d[N],fa[N…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
4291: [PA2015]Kieszonkowe Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=4291 Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和. Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=1000).…
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘米. Byteasar一共会进行m次收割,其中第i次收割在第d[i]天,并把所有高度大于等于b[i]的部分全部割去.Byteasar想知道,每次收割得到的草的高度总和是多少,你能帮帮他吗? 输入 Input 第一行包含两个正整数n,m(1<=n,m<=500000),分别表示亩数和收割次数. 第二…
[BZOJ4295][PA2015]Hazard Description 有n个人在轮流玩赌博机,一开始编号为i的人有a[i]元钱.赌博机可以抽象为一个长度为m的仅包含1和-1的序列,若抽到1,那么你将得到1块钱:若抽到-1,你将输掉1块钱.第1局,第1个人会抽到序列中的第1项:第2局,第2个人会抽到序列中的第2项:第3局,第3个人会抽到序列中的第3项......即:第i个人抽完后轮到第i+1个人去抽,特别地,第n个人抽完后轮到第1个人去抽.序列第i项被抽到之后,下一个被抽到的将会是第i+1项,…
BZOJ4292 PA2015 Równanie Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数. Input 第一行包含三个正整数k,a,b(1<=k,a,b<=10^18,a<=b). Output 输出一个整数,即满足条件的n的个数. Sample Input 51 5000 10000 Sample Output 3 HINT 满足的3个n分别为…
[PA2015]Hazard Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 69  Solved: 19[Submit][Status][Discuss] Description 有n个人在轮流玩赌博机,一开始编号为i的人有a[i]元钱.赌博机可以抽象为一个长度为m的仅包含1和-1的序列,若抽到1,那么你将得到1块钱:若抽到-1,你将输掉1块钱.第1局,第1个人会抽到序列中的第1项:第2局,第2个人会抽到序列中的第2项:第3局,第3个人会抽到序列…
[BZOJ4296][PA2015]Mistrzostwa Description 给定一张n个点m条边的无向图,请找到一个点数最多的点集S,满足:1.对于点集中任何一个点,它至少与d个点集中的点相邻.2.仅保留点集中的点后,剩下的图连通. Input 第一行包含三个正整数n,m,d(2<=n<=200000,1<=m<=200000,1<=d<n),分别表示点数,边数以及度数限制.接下来m行,每行包含两个正整数a,b(1<=a,b<=n,a不等于b),表示…
[BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘米. Byteasar一共会进行m次收割,其中第i次收割在第d[i]天,并把所有高度大于等于b[i]的部分全部割去.Byteasar想知道,每次收割得到的草的高度总和是多少,你能帮帮他吗? Input 第一行包含两个正整数n,m(1<=n,m<=500000),分别表示亩数和收割次数…
Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘米. Byteasar一共会进行m次收割,其中第i次收割在第d[i]天,并把所有高度大于等于b[i]的部分全部割去.Byteasar想知道,每次收割得到的草的高度总和是多少,你能帮帮他吗?   Input 第一行包含两个正整数n,m(1<=n,m<=500000),分别表示亩数和收割次数. 第二行包含n个正整数,其中第i个数为a[…
显然做完操作$2$后再做操作$1$. 建立一个$26$个点的有向图,每个点只有一条出边,$i$->$j$表示$i$最终变成了$j$,边权为一开始是$i$,最后不是$j$的位置个数,如果$i\neq j$,则代价还要增加$c$. 对于每个点贪心选取最小的出边,如果没有环,那么此时就是最优解. 否则,对于一个连通块,如果它是环,那么需要多付出$c$点代价,而且如果所有连通块都是环或者孤立点,则不可能构造出这种图. 考虑重新决定每个点的出边,如果出现了原来贪心构造出的图中不存在的环,那么一定有一个点的…
传送门 这Seg确实不好写,不过因为它与ai的相对顺序无关,所以,我们在对ai排序之后,就可做了.维护一个区间最大值,维护一个和,维护一个区间赋值的懒标记,再维护一个时间变化的标记就可以了. 因为不论怎样在排序过后的序列里面右边的一定不小于左边的,所以我们可以在线段树里面二分来找到每一次操作的开始位置,然后就可以区间修改了. #include<cstdio> #include<algorithm> using namespace std; #define MAXN 500005 #…
先不断将度数小于D的点都删去,再找到剩下的图里最大的连通块即可. #include<cstdio> #include<algorithm> #define N 200010 int n,m,D,x,y,i,g[N],v[N<<1],nxt[N<<1],ed,d[N],h,t,q[N],del[N],ans,fin[N]; inline void read(int&a){char c;while(!(((c=getchar())>='0')&am…
斐波那契数列模$10^m$的循环节为$6\times10^m$,于是从低位到高位dfs即可. #include<cstdio> #include<cstring> #define N 20 typedef long long ll; typedef unsigned long long ull; int n,i,flag;char a[N];ll mo[N],b[N];ull ans; inline ull mul(ull a,ull b,ull P){ull t=0;for(;b…
第i轮,a[i%n]+=b[i%m]. 枚举i,计算它变为0的次数,假设为t,那么有t=i+kn. 对于所有的i和k,(i+kn)%m形成了若干个总长度为m的环. 对于每个a[i],先在环中求出一轮最多可以减少多少,以及一轮的增量是多少,由此可以求出在几轮后变为0. 再在前缀后缀分类讨论一下即可求出具体是在哪一局变为0. 时间复杂度$O(n+m)$. #include<cstdio> #define N 1000010 typedef long long ll; const ll inf=20…
Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数. Input 第一行包含三个正整数k,a,b(1<=k,a,b<=10^18,a<=b). Output 输出一个整数,即满足条件的n的个数. Sample Input 51 5000 10000 Sample Output 3 HINT 满足的3个n分别为7293,7854和7905. Source By…
Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和.  Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=1000). Output 输出一个正整数,即最大的总和,若无解则输出NIESTETY. Sample Input 5 2 4 3 3 3 Sample Output 12 HINT Source By Claris Solution 如果总和为偶数,那么…
题目链接 我按AC排序后做的 4291 傻逼题不多说 4292 f(n)最大也很小,暴力枚举就好了 4293 这是个线段树的题,说到这应该会了 4294 Claris:斐波那契数列模\(10^m\)的循环节为\(6×10^m\),于是从低位到高位dfs即可. 4296 挨个删去度数小于d的点,把边一块删去,(其实第二个就是让留下的联通)那么找最大联通块好了 4297 会发现如果只考虑子树几个的话可以取中位数然后计算,这样每个点的可取的值是个区间,然后就dp好了 4607 其实可以构成\(26^2…
题目链接 \(Description\) 有一片n亩的土地,要在这上面种草. 在每一亩土地上都种植了一种独一无二的草,其中,第\(i\)亩土地的草每天会长高\(a[i]\)厘米. 一共会进行\(m\)次收割,其中第\(i\)次收割在第\(d[i]\)天,并把所有高度大于等于\(b[i]\)的部分全部割去.求每次收割得到的草的高度总和是多少. /* 无论怎么收割,长得快的草一定是不矮于长得慢的:而询问与下标无关 所以按生长速度排序,某一时刻的高度一定是递增的,这样就可以二分了 注意很多longlo…
题解 \(f(n)\)的取值范围最多\(9^2 * 18\) 直接枚举判断就好 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define pdi pair<db,int> #define mp make_pair #define pb push_back #define enter putchar('\n') #define space…
[题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解]按照生长速度a[]排序后,容易发现数列永远单调. 在线段树上的区间维护以下值: 1.最后一棵草的高度a 2.上次收割日期b 3.总的草高和c 4.总的生长速度和d 5.收割标记D和B 上传的时候注意右区间收割晚于左区间时强制合并. 下传的时候注意标记D和B直接覆盖. 线段树上二分: 1.判断当前区间是否符合(…
如题,首先可以考虑相对大小是不变的. 那么先sort,之后每次在线段树上二分即可. #include<bits/stdc++.h> typedef long long ll; using namespace std; ; int n,m; ll a[N],d[N],b[N]; struct Segment_Tree{ #define lson (o<<1) #define rson (o<<1|1) ll addv[N<<],sumv[N<<],…
Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数.   Input 第一行包含三个正整数k,a,b(1<=k,a,b<=10^18,a<=b).   Output 输出一个整数,即满足条件的n的个数.   Sample Input 51 5000 10000 Sample Output 3 HINT 满足的3个n分别为7293,7854和7905. 解题:…
Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和.   Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=1000).   Output 输出一个正整数,即最大的总和,若无解则输出NIESTETY.   Sample Input 5 2 4 3 3 3 Sample Output 12   解题:唔,总和减去最小的奇数   #include<iostr…
貌似应该是找出n后,带回去看看是不是对的. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #define ll long long using namespace std; typedef long long LL; **; ll k,a,b; ll solve(ll u) { ll n,sum,ret=; ;i&…
题目描述 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数. 输入 第一行包含三个正整数k,a,b(1<=k,a,b<=10^18,a<=b). 输出 输出一个整数,即满足条件的n的个数. 样例输入 51 5000 10000 样例输出 3 题解 暴力 考虑一个$\le 10^{18}$的正整数,它的$f$值最大只有$f(999999999999999999)=9*9*18=14…
由于某人找了个单调栈的题解但是没研究透所以让我们来研究............ 首先先来考虑下面一种情况,假设第\(k\)次切割时,天数为\(d_k\),高度为\(b_k\),第\(k+1\)次切割时,天数为\(d_{k+1}\),高度为\(b_{k+1}\),那么我们定义一个切割速度,令\(v=\frac{b_{k+1}-b_k}{d_{k+1}-d_k}\),这个切割速度有什么含义呢,如果在\(d_k\)天时所有的草都是\(b_k\)高,那么生长速度\(>v\)的草都要割掉,注意这里的\(v…