BZOJ4712: 洪水(树链剖分维护Dp)
Description
Input
输入文件第一行包含一个数n,表示树的大小。
Output
对于每次询问操作,输出对应的答案,答案之间用换行隔开。
Sample Input
4 3 2 1
1 2
1 3
4 2
4
Q 1
Q 2
C 4 10
Q 1
Sample Output
1
4
解题思路:
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lll spc<<1
#define rrr spc<<1|1
typedef long long lnt;
const int N=;
struct trnt{
lnt minv;
lnt lzt;
}tr[N<<];
struct pnt{
int hd;
int fa;
int tp;
int dp;
int wgt;
int mxs;
int ind;
lnt val;
lnt f;
lnt sigf;
}p[N];
struct ent{
int twd;
int lst;
}e[N<<];
int cnt;
int n,m;
int dfn;
int plc[N];
char cmd[];
void ade(int f,int t)
{
cnt++;
e[cnt].twd=t;
e[cnt].lst=p[f].hd;
p[f].hd=cnt;
return ;
}
void Basic_dfs(int x,int f)
{
p[x].fa=f;
p[x].dp=p[f].dp+;
p[x].wgt=;
int maxs=-;
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(to==f)
continue;
Basic_dfs(to,x);
p[x].sigf+=p[to].f;
p[x].wgt+=p[to].wgt;
if(maxs<p[to].wgt)
{
maxs=p[to].wgt;
p[x].mxs=to;
}
}
if(!p[x].mxs)
p[x].sigf=0x3f3f3f3f;
p[x].f=std::min(p[x].val,p[x].sigf);
return ;
}
void Build_dfs(int x,int top)
{
if(!x)
return ;
p[x].tp=top;
p[x].ind=++dfn;
plc[dfn]=x;
Build_dfs(p[x].mxs,top);
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].ind)
continue;
Build_dfs(to,to);
}
return ;
}
void pushup(int spc)
{
tr[spc].minv=std::min(tr[lll].minv,tr[rrr].minv);
return ;
}
void add(int spc,lnt v)
{
tr[spc].lzt+=v;
tr[spc].minv-=v;
return ;
}
void pushdown(int spc)
{
if(tr[spc].lzt)
{
add(lll,tr[spc].lzt);
add(rrr,tr[spc].lzt);
tr[spc].lzt=;
}
return ;
}
void build(int l,int r,int spc)
{
if(l==r)
{
tr[spc].minv=p[plc[l]].val-p[plc[l]].sigf;
return ;
}
int mid=(l+r)>>;
build(l,mid,lll);
build(mid+,r,rrr);
pushup(spc);
return ;
}
void update(int l,int r,int pos,int spc,lnt v)
{
if(l==r)
{
add(spc,-v);
return ;
}
int mid=(l+r)>>;
pushdown(spc);
if(pos<=mid)
update(l,mid,pos,lll,v);
else
update(mid+,r,pos,rrr,v);
pushup(spc);
return ;
}
int scupdate(int l,int r,int ll,int rr,int spc,lnt v)
{
if(l>rr||ll>r)
return ;
if(l==r)
{
add(spc,v);
if(tr[spc].minv<=)
return plc[l];
return ;
}
if(ll<=l&&r<=rr&&tr[spc].minv>v)
{
add(spc,v);
return ;
}
int mid=(l+r)>>;
pushdown(spc);
int plcc=scupdate(mid+,r,ll,rr,rrr,v);
if(!plcc)
plcc=scupdate(l,mid,ll,rr,lll,v);
pushup(spc);
return plcc;
}
lnt query(int l,int r,int pos,int spc)
{
if(l==r)
return tr[spc].minv;
int mid=(l+r)>>;
pushdown(spc);
if(pos<=mid)
return query(l,mid,pos,lll);
return query(mid+,r,pos,rrr);
}
void Update(int x,lnt v)
{
if(v<=||!x)
return ;
while(x)
{
int tp=scupdate(,n,p[p[x].tp].ind,p[x].ind,,v);
if(!tp)
x=p[p[x].tp].fa;
else{
Update(p[tp].fa,query(,n,p[tp].ind,)+v);
return ;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&p[i].val);
for(int i=;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
ade(a,b);
ade(b,a);
}
Basic_dfs(,);
Build_dfs(,);
build(,n,);
scanf("%d",&m);
while(m--)
{
scanf("%s",cmd+);
if(cmd[]=='Q')
{
int x;
scanf("%d",&x);
printf("%lld\n",std::min(p[x].val,p[x].val-query(,n,p[x].ind,)));
}else{
int x,v;
scanf("%d%d",&x,&v);
if(!v)
continue;
p[x].val+=v;
update(,n,p[x].ind,,v);
lnt tmp=p[x].val-query(,n,p[x].ind,);
p[x].f=std::min(p[x].val,tmp);
Update(p[x].fa,p[x].f+v-p[x].val);
}
}
return ;
}
BZOJ4712: 洪水(树链剖分维护Dp)的更多相关文章
- [bzoj4712] 洪水 [树链剖分+线段树+dp]
题面 传送门 思路 DP方程 首先,这题如果没有修改操作就是sb题,dp方程如下 $dp[u]=max(v[u],max(dp[v]))$,其中$v$是$u$的儿子 我们令$g[u]=max(dp[v ...
- 【BZOJ4712】洪水 树链剖分优化DP+线段树
[BZOJ4712]洪水 Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为 ...
- [BZOJ4712]洪水-[树链剖分+线段树]
Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬 ...
- 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp
题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含 ...
- Codeforces 856D - Masha and Cactus(树链剖分优化 dp)
题面传送门 题意: 给你一棵 \(n\) 个顶点的树和 \(m\) 条带权值的附加边 你要选择一些附加边加入原树中使其成为一个仙人掌(每个点最多属于 \(1\) 个简单环) 求你选择的附加边权值之和的 ...
- [NOIP2018提高组] 保卫王国 (树链剖分+动态DP)
题面 题目链接-Luogu 题目链接-Loj(要加Freopen) 题解 什么是动态DP? OneInDark:你不需要知道这么多,你只需要知道是利用了广义矩阵乘法就够了! 广义矩乘 广义矩阵乘法,简 ...
- (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。
Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...
- [bzoj4712]洪水 线段树+树链剖分维护动态dp+二分
Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬 ...
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 480 Solved: 212[Submit][Status][D ...
随机推荐
- python shutil 模块 的剪切文件函数 shutil.movemove(src, dst),换用 os.rename(sourceFile, targetFile)
Google 一搜python 剪切文件,出来shutil 这模块,网上很多人也跟疯说shutil.move(src, dst)就是用来剪切文件的,结果一试,剪切毛线,文件都复制到另一个文件夹了,源文 ...
- 用Electron开发企业网盘(二)--分片下载
书接上文,背景见:https://www.cnblogs.com/shawnyung/p/10060119.html HTTP请求头 Range 请求资源的部分内容(不包括响应头的大小),单位是by ...
- CMSIS-RTOS 信号量
信号量Semaphores 和信号类似,信号量也是一种同步多个线程的方式,简单来讲,信号量就是装有一些令牌的容器.当一个线程在执行过程中,就可能遇到一个系统调用来获取信号量令牌,如果这个信号量包含多个 ...
- 【Henu ACM Round#20 D】 Devu and Partitioning of the Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 一开始所有的数字单独成一个集合. 然后用v[0]和v[1]记录集合的和为偶数和奇数的集合它们的根节点(并查集 然后先让v[0]的大小 ...
- cocos2d-x 3.1 学习(一):工具安装与配置环境
初级学习cocos2d-x 3.1开发,学习开发过程记录到博客上面来,哪写的不正确请指点. 1.工具安装 cocos2d-x 3.1rc0 最新版本号,下载后解压.下载地址:http://www.co ...
- HDU 5438 Ponds dfs模拟
2015 ACM/ICPC Asia Regional Changchun Online 题意:n个池塘,删掉度数小于2的池塘,输出池塘数为奇数的连通块的池塘容量之和. 思路:两个dfs模拟就行了 # ...
- “==”和Equals区别
相信很多朋友在面对,对象判等时经常会犹豫是用“==”还是Equals呢?有时候发现两者得到的结果相同,但有时候有不同, 究竟在什么情况下"==" 会相等,什么情况下Equals会不 ...
- Fishing Net
In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...
- 利用 urandom 生成随机密码
cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 16 |head -3 说明: fold -w 16 指定密 ...
- Felx之HTTPService
获取并显示数据 为了向我们的程序提供数据,Adobe Flex包含特别为与HTTP服务器,网络服务或者是远程对象服务(Java对象)进行交互的而设计的组件.这些组件被称之为远程过程调用(RPC)服务组 ...