[NOIP2018TG]保卫王国
[NOIP2018TG]保卫王国
BZOJ
luogu
当动态dp模板题写的,(全集-最大点权独立集)不能放军队的+inf,必须放军队-inf即可
注意矩阵乘法的顺序问题
#define ll long long
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
#include<bits/stdc++.h>
using namespace std;
const int _=1e5+5,inf=1e9;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int n,m,cnt,ts;
int h[_],p[_],fa[_],sz[_],son[_],top[_],dfn[_],id[_],ed[_];
ll sum,Ans,f[2][_];
string type;
struct edge{int to,next,w;}e[_<<1];
struct Mx{
ll g[2][2];
Mx(){memset(g,0,sizeof(g));}
}t[_<<2],val[_];
Mx operator *(Mx x,Mx y){
Mx z;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
z.g[i][j]=max(z.g[i][j],x.g[i][k]+y.g[k][j]);
return z;
}
void link(int u,int v){
e[++cnt]=(edge){v,h[u]};h[u]=cnt;
e[++cnt]=(edge){u,h[v]};h[v]=cnt;
}
void dfs(int u){
sz[u]=1;
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa[u])continue;
fa[v]=u;dfs(v);sz[u]+=sz[v];
if(sz[v]>sz[son[u]])son[u]=v;
}
}
void dfs(int u,int tp){
top[u]=tp;id[dfn[u]=++ts]=u;
if(son[u])dfs(son[u],tp);
else ed[top[u]]=ts;
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v^fa[u]&&v^son[u])dfs(v,v);
}
}
void dp(int u){
f[1][u]=p[u];
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa[u])continue;
dp(v);
f[0][u]+=max(f[1][v],f[0][v]);
f[1][u]+=f[0][v];
}
}
void pu(int x){t[x]=t[x<<1]*t[x<<1|1];}
void bu(int x,int l,int r){
if(l==r){
t[x].g[0][0]=t[x].g[0][1]=f[0][id[l]]-max(f[0][son[id[l]]],f[1][son[id[l]]]);
t[x].g[1][0]=f[1][id[l]]-f[0][son[id[l]]];t[x].g[1][1]=-inf;val[l]=t[x];return;
}
int mid=(l+r)>>1;bu(ls);bu(rs);pu(x);
}
void upd(int x,int l,int r,int k){
if(l==r){t[x]=val[k];return;}
int mid=(l+r)>>1;
if(k<=mid)upd(ls,k);else upd(rs,k);pu(x);
}
Mx query(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return t[x];
int mid=(l+r)>>1;
if(qr<=mid)return query(ls,ql,qr);
if(ql>mid)return query(rs,ql,qr);
return query(ls,ql,qr)*query(rs,ql,qr);
}
void modify(int u,int v){
val[dfn[u]].g[1][0]+=v;
Mx od,nw;
while(u){
od=query(1,1,n,dfn[top[u]],ed[top[u]]);
upd(1,1,n,dfn[u]);
nw=query(1,1,n,dfn[top[u]],ed[top[u]]);
u=fa[top[u]];
val[dfn[u]].g[0][0]+=max(nw.g[0][0],nw.g[1][0])-max(od.g[0][0],od.g[1][0]);
val[dfn[u]].g[0][1]=val[dfn[u]].g[0][0];
val[dfn[u]].g[1][0]+=nw.g[0][0]-od.g[0][0];
}
}
int main(){
n=re(),m=re();cin>>type;
for(int i=1;i<=n;i++)p[i]=re(),sum+=p[i];
for(int i=1,u,v;i<n;i++){
u=re(),v=re();link(u,v);
}
dfs(1);dfs(1,1);dp(1);bu(1,1,n);
while(m--){
int a=re(),x=re(),b=re(),y=re();
if(!x&&!y&&(fa[a]==b||fa[b]==a)){puts("-1");continue;}
if(x)modify(a,-inf);
else modify(a,inf),sum+=inf;
if(y)modify(b,-inf);
else modify(b,inf),sum+=inf;
Mx ans=query(1,1,n,dfn[1],ed[1]);
Ans=sum-max(ans.g[1][0],ans.g[0][0]);
printf("%lld\n",Ans);
if(x)modify(a,inf);
else modify(a,-inf),sum-=inf;
if(y)modify(b,inf);
else modify(b,-inf),sum-=inf;
}
return 0;
}
[NOIP2018TG]保卫王国的更多相关文章
- noip2018 d2t3 保卫王国 解题报告
保卫王国 电脑卡懒得把题面挪过来了. 朴素 \[ dp_{i,0}=\sum dp_{s,1}\\ dp_{i,1}=\sum \min(dp_{s,0},dp_{s,1})+p_i \] 然后直接动 ...
- LG5024 保卫王国
题意 题目描述 Z 国有\(n\)座城市,\(n - 1\)条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻扎军队.驻扎军队需要 ...
- 「NOIP2018」保卫王国
「NOIP2018保卫王国」 题目描述 有一棵 \(n\) 个点, 点有点权 \(a_i\),\(m\) 组询问, 每次求钦点两个节点必须选或者必须不选后的树上最小点覆盖. \(1 \leq n, m ...
- Uoj 441 保卫王国
Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...
- 竞赛题解 - NOIP2018 保卫王国
\(\mathcal{NOIP2018}\) 保卫王国 - 竞赛题解 按某一个炒鸡dalao名曰 taotao 的话说: \(\ \ \ \ \ \ \ \ \ "一道sb倍增题" ...
- 『保卫王国 树上倍增dp』
保卫王国 Description Z 国有n座城市,n - 1条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻扎军队.驻扎军队需 ...
- 【比赛】NOIP2018 保卫王国
DDP模板题 #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double ...
- luogu5024 [NOIp2018]保卫王国 (动态dp)
可以直接套动态dp,但因为它询问之间相互独立,所以可以直接倍增记x转移到fa[x]的矩阵 #include<bits/stdc++.h> #define CLR(a,x) memset(a ...
- NOIP2018保卫王国
题目大意:给一颗有点权的树,每次规定两个点选还是不选,求这棵树的最小权点覆盖. 题解 ZZ码农题. 要用动态dp做,这题就是板子,然鹅并不会,留坑代填. 因为没有修改,所以可以静态倍增. 我们先做一遍 ...
随机推荐
- 推荐一个不错的plist拆解工具,untp
需要安装python以及pip 中文说明 A command line tool to split TexturePacker published files. install pip install ...
- redis命令_ZRANGE
ZRANGE key start stop [WITHSCORES] 返回有序集 key 中,指定区间内的成员. 其中成员的位置按 score 值递增(从小到大)来排序. 具有相同 score 值的成 ...
- Javascript网页截屏的方法
最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...
- 0044 spring框架的applicationContext.xml的命名空间
Spring框架中,创建bean,装配bean,事务控制等,可以用xml配置或者注解扫描的方法实现.如果用注解扫描,在xml配置中得加上 <context:component-scan base ...
- 大数据处理-Trie树
大数据处理--Trie树 1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被 ...
- 谈谈对MVC、MVP和MVVM的理解
刚出来工作的时候维护过一个老系统,该系统是用微软的ASP(Active Server Pages 动态服务器页面)写的.每一个页面都是一个ASP文件,每一个一个ASP文件中又同时包含了HTML.CSS ...
- Class.forName(String className)这个方法的作用
Class.forName(String className)这个方法的作用 解答:通过类的全名获得该类的类对象
- mysql delimiter 存储过程
命令行登录mysql cd /d D:\database\mysql1\bin mysql.exe -P 3306 -h 127.0.0.1 -u root -p USE tbschedule del ...
- Img src用base64数据
<img src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgG ...
- 《C++程序设计》朝花夕拾
(以后再也不用破Markdown写东西了,直到它有一个统一的标准,不然太乱了--) 函数签名 int f (int a, int b) ↑ ↑ ↑ ↑ 返回类型 函数名 形 式 参 数 其中,函数 ...