解题:NOIP 2018 保卫王国
最小支配集=全集-最大独立集
所以先把点权改成正无穷/负无穷来保证强制选/不选某个点到独立集里,然后变成了洛谷的动态DP模板
GTMDNOIP2018ZTY
#include<stack>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,inf=1e9;
int siz[N],far[N],imp[N],top[N],lst[N];
int p[N],noww[M],goal[M],val[N],dfn[N];
int n,m,t1,t2,t3,t4,t5,t6,cnt,tot;
char typ[]; long long sum;
struct a
{
long long mat[][];
void Clean()
{
memset(mat,,sizeof mat);
}
}seg[*N],tre[N];
a Matime(a x,a y)
{
a ret; ret.Clean();
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
ret.mat[i][j]=max(ret.mat[i][j],x.mat[i][k]+y.mat[k][j]);
return ret;
}
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
noww[++cnt]=p[t];
goal[cnt]=f,p[t]=cnt;
}
void DFS(int nde,int fth)
{
int tmp=;
siz[nde]=,far[nde]=fth;
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
{
DFS(goal[i],nde);
siz[nde]+=siz[goal[i]];
if(siz[goal[i]]>tmp)
tmp=siz[goal[i]],imp[nde]=goal[i];
}
}
void Mark(int nde,int tpp)
{
dfn[nde]=++tot,top[nde]=tpp;
if(imp[nde])
{
Mark(imp[nde],tpp);
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=imp[nde]&&goal[i]!=far[nde])
Mark(goal[i],goal[i]);
}
lst[nde]=imp[nde]?lst[imp[nde]]:nde;
}
a Query(int nde,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)
return seg[nde];
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
if(mid>=ll&&mid<rr)
return Matime(Query(rs,mid+,r,ll,rr),Query(ls,l,mid,ll,rr));
if(mid>=rr) return Query(ls,l,mid,ll,rr);
if(mid<ll) return Query(rs,mid+,r,ll,rr);
}
}
void Modify(int nde,int l,int r,int pos,a tsk)
{
if(l==r) seg[nde]=tsk;
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
if(pos<=mid) Modify(ls,l,mid,pos,tsk);
else Modify(rs,mid+,r,pos,tsk);
seg[nde]=Matime(seg[rs],seg[ls]);
}
}
void Prework(int nde)
{
stack<int> st;
for(int i=nde;i;i=imp[i]) st.push(i);
while(!st.empty())
{
int tn=st.top(); st.pop();
long long x=,y=val[tn];
for(int i=p[tn];i;i=noww[i])
if(goal[i]!=imp[tn]&&goal[i]!=far[tn])
{
Prework(goal[i]); a mtr=tre[goal[i]];
x+=max(mtr.mat[][],mtr.mat[][]),y+=mtr.mat[][];
}
a tmp; tmp.mat[][]=tmp.mat[][]=x,tmp.mat[][]=y,tmp.mat[][]=-inf;
Modify(,,n,dfn[tn],tmp);
}
tre[nde]=Query(,,n,dfn[nde],dfn[lst[nde]]);
}
void Change(int nde,long long tsk)
{
a tmp=Query(,,n,dfn[nde],dfn[nde]);
tmp.mat[][]+=tsk-val[nde];
Modify(,,n,dfn[nde],tmp),val[nde]=tsk;
for(int i=top[nde];i!=;i=top[i])
{
int fa=far[i];
a tmp=Query(,,n,dfn[fa],dfn[fa]),tep=Query(,,n,dfn[i],dfn[lst[i]]);
tmp.mat[][]+=max(tep.mat[][],tep.mat[][])-max(tre[i].mat[][],tre[i].mat[][]);
tmp.mat[][]+=tep.mat[][]-tre[i].mat[][],tmp.mat[][]=tmp.mat[][];
Modify(,,n,dfn[fa],tmp),tre[i]=tep,i=fa;
}
}
int main()
{
scanf("%d%d%s",&n,&m,typ);
for(int i=;i<=n;i++)
scanf("%d",&val[i]),sum+=val[i];
for(int i=;i<n;i++)
scanf("%d%d",&t1,&t2),Link(t1,t2);
DFS(,),Mark(,),Prework();
while(m--)
{
scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
if(!t2&&!t4&&(far[t1]==t3||far[t3]==t1))
printf("-1\n");
else
{
t5=val[t1],t6=val[t3];
Change(t1,t2?-inf:inf);
Change(t3,t4?-inf:inf);
a qry=Query(,,n,,dfn[lst[]]);
long long ans=sum-max(qry.mat[][],qry.mat[][]);
printf("%lld\n",ans+(inf-t5)*(t2^)+(inf-t6)*(t4^));
Change(t1,t5),Change(t3,t6);
}
}
return ;
}
解题:NOIP 2018 保卫王国的更多相关文章
- NOIP 2018 普及组 解题报告
目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...
- noip2018 d2t3 保卫王国 解题报告
保卫王国 电脑卡懒得把题面挪过来了. 朴素 \[ dp_{i,0}=\sum dp_{s,1}\\ dp_{i,1}=\sum \min(dp_{s,0},dp_{s,1})+p_i \] 然后直接动 ...
- 「NOIP2018」保卫王国
「NOIP2018保卫王国」 题目描述 有一棵 \(n\) 个点, 点有点权 \(a_i\),\(m\) 组询问, 每次求钦点两个节点必须选或者必须不选后的树上最小点覆盖. \(1 \leq n, m ...
- [OI]Noip 2018总结(普及)
考砸了,还有原谅我代码十分有限的可读性. 一个人的真正伟大之处就在于他能够认识到自己的渺小.——保罗 从一年前初一九月到现在18年10月接触OI已经有一年了.几次模拟赛也自我感觉良好,都过了一等的线, ...
- noip 2018 D1T3 赛道修建
noip 2018 D1T3 赛道修建 首先考虑二分答案,这时需要的就是对于一个长度求出能在树中选出来的最多的路径条数.考虑到一条路径是由一条向上的路径与一条向下的路径构成,或者仅仅是向上或向下的路径 ...
- LG5024 保卫王国
题意 题目描述 Z 国有\(n\)座城市,\(n - 1\)条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻扎军队.驻扎军队需要 ...
- Uoj 441 保卫王国
Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...
- 竞赛题解 - NOIP2018 保卫王国
\(\mathcal{NOIP2018}\) 保卫王国 - 竞赛题解 按某一个炒鸡dalao名曰 taotao 的话说: \(\ \ \ \ \ \ \ \ \ "一道sb倍增题" ...
- [NOIP2018TG]保卫王国
[NOIP2018TG]保卫王国 BZOJ luogu 当动态dp模板题写的,(全集-最大点权独立集)不能放军队的+inf,必须放军队-inf即可 注意矩阵乘法的顺序问题 #define ll lon ...
随机推荐
- java 锁白话
一.锁 1.可见性: 定义:数据对所有线程可见 原因:cpu操作数据时会把数据读取到内存中去,可以理解为值做了备份,但是备份数据和原始数据在后续操作中不一定一致 实现:java使用volite关键字来 ...
- mfc CSpinButton
知识点: CSliderCtrl(滑块)控件 CSliderCtrl常用属性 CSliderCtrl类常用成员函数 CSliderCtrl运用示例 一.CSliderCtr常用属性 Orientati ...
- OpenCV实战:人脸关键点检测(FaceMark)
Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Date: 2018-03-20 ...
- Grid布局20行代码快速生成瀑布流
网格布局 Grid 布局,好用又简单,至少比 Flex 要人性化一点,美中不足就是浏览器支持度差点. DOM结构 中间夹层为了后续拓展. CSS .grid { display: grid; grid ...
- dokuwiki工具栏添加换行回车快捷键与按钮
需求 dokuwiki的语法要求以 \\ 为换行符(\\后面必须有1个空格).编辑器有快捷键.快捷键说明如下.https://www.dokuwiki.org/start?id=zh-tw:acces ...
- CentOS7安装OpenStack(Rocky版)-01.控制节点的系统环境准备
分享一下Rocky版本的OpenStack安装管理经验: OpenStack每半年左右更新一版,目前是版本是201808月发布的版本-R版(Rocky),目前版本安装方法优化较好,不过依然是比较复杂 ...
- 四则运算 SPEC 20160911
本文档随时可能修改,并且没有另行通知. 请确保每一次在开始修改你的代码前,读标题中的日期,如果晚于你上次阅读, 请重读一次. 教师节你去探望初中数学老师,她感叹你当年真是个优秀学生啊,从来不报怨作 业 ...
- 20135220谈愈敏Blog4_系统调用(上)
系统调用(上) 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 用户态 ...
- Linux内核分析 笔记二 操作系统是如何工作的 ——by王玥
一.知识要点 1.计算机是如何工作的?(总结)——三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算 ...
- 关于 error C2039: “create”: 不是“cocos2d::GLView”的成员的解决方法
问题: 跑一个demo,因为是涉及3.x版本的引擎,不是很熟悉,在VS2013上运行,报错 error C2039: “create”: 不是“cocos2d::GLView”的成员 解决: 通过查阅 ...