解题: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 ...
随机推荐
- 20155321 《网络攻防》 Exp8 Web基础
20155321 <网络攻防> Exp8 Web基础 基础问题回答 什么是表单? 表单是主要负责数据采集功能.主要是以下三个部分构成: 表单标签:包含处理表单数据所用的程序的URL以及数据 ...
- system表空间不可改名
SQL> startup mount;ORACLE instance started. Total System Global Area 814227456 bytesFixed Size ...
- vue.js 2.0实现的简单分页
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- Linux/centos 7 使用动态ip(dhcp)切换成静态ip后无法联网的问题
确保:子网掩码,网关,dns一致,最后修改: /etc/sysconfig/network-scripts/ifcfg-ens33 查看网关和子网掩码: route -n 查看dns
- 记录:tf.saved_model 模块的简单使用(TensorFlow 模型存储与恢复)
虽然说 TensorFlow 2.0 即将问世,但是有一些模块的内容却是不大变化的.其中就有 tf.saved_model 模块,主要用于模型的存储和恢复.为了防止学习记录文件丢失或者蠢笨的脑子直接遗 ...
- Shell 基础 -- 输入、输出重定向
一.文件描述符 文件描述符是一个非负的整数,Linux 中每个运行中的程序(进程),都有一些与之关联的文件描述符,你可以使用文件描述符来访问打开的文件或设备.在标准 I/O 库中,与文件描述符对应的是 ...
- 在Linux系统中安装caffe
学习深度学习已经很久了,但一直没有自己动手安装过caffe,因为工作需要,需要在linux系统中安装caffe,因此,在这里对安装过程进行记录. caffe配置起来比tensorflow更麻烦一些,我 ...
- wordpress 5.1 后台拿shell
闲着没事搭建了一套最新版wordpress 5.1,本身wordpress后台安全防御是比较差的,想尝试下后台是否可以拿shell. 再上传插件的地方可以直接上传php文件,并且该文件可以执行: sh ...
- PAT甲题题解-1075. PAT Judge (25)-排序
相当于是模拟OJ评测,这里注意最后输出:1.那些所有提交结果都是-1的(即均未通过编译器的),或者从没有一次提交过的用户,不需要输出.2.提交结果为-1的题目,最后输出分数是03.某个题目从没有提交过 ...
- Quartz带参数任务的创建与修改
需求背景:创建的quartz任务需要用到三个参数,根据参数去执行并将结果入库,并且参数可修改更新. 这里,有三个参数需要传入,分别是planId.target.officeId 定义Job类: pub ...