解题: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 ...
随机推荐
- 20155222卢梓杰 实验一 逆向及Bof基础
实验一 逆向及Bof基础 1.实验对象为32位可执行文件pwn1,这个程序主要有main.foo.getshell这三个函数,其中foo函数功能为输出输入的字符串,getshell函数功能为打开一个s ...
- .NetCore实践爬虫系统(二)自定义规则
回顾 上篇文章NetCore实践爬虫系统(一)解析网页内容 我们讲了利用HtmlAgilityPack,输入XPath路径,识别网页节点,获取我们需要的内容.评论中也得到了大家的一些支持与建议.下面继 ...
- 并发编程(Concurrent programming)
并发编程(Concurrent programming) 1.并发编程概述 2.委托(delegate) 3.事件(event) 4.线程(thread) 5.线程池(threadPool) 6.任务 ...
- 命令行启用IIS Express
我们在调试WEB程序的时候可以把本地web程序挂载到本地IIS,然后访问程序,通过附加进程的方式(w3wp)来调试程序(个人非常喜欢的一种调试方式),还有一种比较传统的方式就是通过VS自带的F5来执行 ...
- dokuwiki 配置 sendmail 邮件发送
dokuwiki 发送邮件有2种方式: 一是直接使用 PHP 自带发送功能,需要配置 PHP.ini 文件, 我没试过,可参考官网 https://www.dokuwiki.org/tips:mail ...
- linux之awk基础
第一章 1.awk 简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel).处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取 ...
- jenkins pipeline 部署
一.git 版本控制结合jenkins 发布 sh-4.2$ git branch sh-4.2$ git chekout master sh-4.2$ git tag v1.1 sh-4.2$ gi ...
- Dive查看docker镜像层信息
1.主要采用docker运行dive的方式,不然宿主机还要安装go那些挺麻烦的.具体用法可查看官方: https://github.com/wagoodman/dive 2.拉取dive镜像 dock ...
- OpenCV调整彩色图像的饱和度和亮度
问题 如何调整彩色图像的饱和度和亮度 解决思路 详细步骤: 将RGB图像值归一化到[0, 1] 然后使用函数cvtColor进行色彩空间的转换 接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换 ...
- Unity之日志管理
1. 目录结构 1. Plugins --> 存放Log4Net动态库文件 2. Scripts --> 存放写日志的脚本 3. StreamingAssets -->存放Log4N ...