解题: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 ...
随机推荐
- 20155302《网络对抗》Exp9 Web安全基础
20155302<网络对抗>Exp9 Web安全基础 实验内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 1.webgoat的安装启动 使用自己 ...
- Linux随笔---tar命令
一.解压 语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项:c:create:v:verbose: ...
- PowerBI开发 第八篇:查询参数
在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),参数的功能是为了实现PowerBI的参数化编程,使得Data Source的属性.替换值和过滤数据 ...
- Flutter - 创建底部导航栏
之前写过的一篇文章介绍了 Flutter - 创建横跨所有页面的侧滑菜单, 这次就一起来学习一下底部导航栏. 底部导航栏在ios平台上非常常见,app store就是这样的风格.还有就是大家最常用的微 ...
- javascript source map 的使用
之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大意 ...
- 一个web应用的诞生(3)--美化一下
经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...
- nginx location 正则匹配
nginx 统计语句1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l2.统计访问URL统计PV awk '{print $7 ...
- Tortoisegit生成SSH密钥一次性输入密码
一.找到Tortoisegit 的安装目录,进入bin目录下,找到puttygen.exe并打开,点击Generate按钮,会看到上面出现绿色滚动条,此时要不停移动鼠标,进度会比较快,完成后,就会看到 ...
- 《Linux内核分析》 第六周
<Linux内核分析> 第6周 一.进程的描述 1.进程控制块PCB 2.linux下的进程转化图 TASK_RUNNING可以是就绪态或者执行态,具体取决于系统调用 TASK_ZOMBI ...
- java实验报告二
一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...