题面

最小支配集=全集-最大独立集

所以先把点权改成正无穷/负无穷来保证强制选/不选某个点到独立集里,然后变成了洛谷的动态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 保卫王国的更多相关文章

  1. NOIP 2018 普及组 解题报告

    目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...

  2. noip2018 d2t3 保卫王国 解题报告

    保卫王国 电脑卡懒得把题面挪过来了. 朴素 \[ dp_{i,0}=\sum dp_{s,1}\\ dp_{i,1}=\sum \min(dp_{s,0},dp_{s,1})+p_i \] 然后直接动 ...

  3. 「NOIP2018」保卫王国

    「NOIP2018保卫王国」 题目描述 有一棵 \(n\) 个点, 点有点权 \(a_i\),\(m\) 组询问, 每次求钦点两个节点必须选或者必须不选后的树上最小点覆盖. \(1 \leq n, m ...

  4. [OI]Noip 2018总结(普及)

    考砸了,还有原谅我代码十分有限的可读性. 一个人的真正伟大之处就在于他能够认识到自己的渺小.——保罗 从一年前初一九月到现在18年10月接触OI已经有一年了.几次模拟赛也自我感觉良好,都过了一等的线, ...

  5. noip 2018 D1T3 赛道修建

    noip 2018 D1T3 赛道修建 首先考虑二分答案,这时需要的就是对于一个长度求出能在树中选出来的最多的路径条数.考虑到一条路径是由一条向上的路径与一条向下的路径构成,或者仅仅是向上或向下的路径 ...

  6. LG5024 保卫王国

    题意 题目描述 Z 国有\(n\)座城市,\(n - 1\)条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻扎军队.驻扎军队需要 ...

  7. Uoj 441 保卫王国

    Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...

  8. 竞赛题解 - NOIP2018 保卫王国

    \(\mathcal{NOIP2018}\) 保卫王国 - 竞赛题解 按某一个炒鸡dalao名曰 taotao 的话说: \(\ \ \ \ \ \ \ \ \ "一道sb倍增题" ...

  9. [NOIP2018TG]保卫王国

    [NOIP2018TG]保卫王国 BZOJ luogu 当动态dp模板题写的,(全集-最大点权独立集)不能放军队的+inf,必须放军队-inf即可 注意矩阵乘法的顺序问题 #define ll lon ...

随机推荐

  1. 网络对抗技术 2017-2018-2 20152515 Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 1 知识要求 2 直接修改程序机器指令,改变程序执行流程 3 通过构造输入参数,造成BOF攻击,改变程序执行流 4 注入Shellcode并执行 1 知识要求 掌握 ...

  2. ajax传参data里面的键是一个变量的解决方法

    直接用这种方式来传参,比如bean中有字段 username password,则是 data[username] = "用户名"; data[password] = " ...

  3. 全面掌握IO(输入/输出流)

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  4. 转 ssh-keygen 的 详解

    为了让两个linux机器之间使用ssh不需要用户名和密码.所以采用了数字签名RSA或者DSA来完成这个操作. 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.6 ...

  5. Ajax引擎:ajax请求步骤详细代码

    说起AJAX,可能是很多同学在很多地方都看到过,各大招聘网站上对于WEB前端和PHP程序员的技能要求清单中也是必不可少的一项.但是,ajax请求步骤详细代码以及说明却比较少见到 什么是AJAX引擎? ...

  6. centos crontab 计划任务 设置与查看

    centos 上 crontab 计划任务 ,这个版本解释的比较清晰 林涛 发表于:2017-4-27 11:11 分类:26点 标签:crontab,Linux,计划任务 36次 这个版本的cron ...

  7. LeetCode 504. Base 7 (C++)

    题目: Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "2 ...

  8. (第十二周)Bug修正报告

    根据Debug周各组找出的Bug,现做出如下说明: Bug: 一.天天向上团队 看到的现象:当食物链长度很长时,最长链显示不全.如下图: 期待的现象:当食物链过长时,食物链可以自动换行. 二者的差异: ...

  9. OpenState安装及 Port Knocking 实验

    OpenState安装及 Port Knocking 实验 目录 OpenState安装 Port Knocking 实验 OpenState安装及 Port Knocking 实验 OpenStat ...

  10. 2013 C#单元测试

    首先安装Unit Test Generator. 点击拓展和更新——>联机搜索Unit Test Generator 新建项目 新建一个测试类  add函数 选定test 类名 ——>右键 ...