传送门

我现在还是不明白为什么NOIPd2t3会是一道动态dp……

首先关于动态dp可以看这里

然后这里就是把把矩阵给改一改,改成这个形式$$\left[dp_{i-1,0},dp_{i-1,1}\right]\times \left[\begin{matrix}\infty&ldp_{i,1}\ldp_{i,0}&ldp_{i,1}\end{matrix}\right]$$

然后就是改成\(longlong\),以及改一改取最小。关于强制取或不取,只要让值加上一个极大值或减去极大值就可以了

于是这么想着并交上去的我就调了一天

这里最主要的问题是,因为矩乘之后,第二行的两个数才是\(dp_{i,0}\)和\(dp_{i,1}\),然后没发现这点,于是就没有于是了……

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define mx 1e10
#define inf 1e12
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
inline void getstr(){char ch;while((ch=getc())<'A'||ch>'Z');while((ch=getc())>='A'&&ch<='Z');}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5;
inline ll min(R ll x,R ll y){return x<y?x:y;}
inline ll max(R ll x,R ll y){return x>y?x:y;}
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int sz[N],lsz[N],val[N],son[N],fat[N],n,m;
void dfs(int u,int fa){
sz[u]=1;go(u)if(v!=fa){
fat[v]=u,dfs(v,u),sz[u]+=sz[v];
if(sz[v]>sz[son[u]])son[u]=v;
}lsz[u]=sz[u]-sz[son[u]];
}
struct Matrix{
ll a[2][2];
Matrix(){a[0][0]=a[0][1]=a[1][0]=a[1][1]=inf;}
Matrix(R int x){a[0][0]=a[1][1]=0,a[0][1]=a[1][0]=inf;}
inline ll mn(){return min(min(a[0][0],a[0][1]),min(a[1][0],a[1][1]));}
inline ll* operator [](const int &x){return a[x];}
Matrix operator *(Matrix b){
Matrix res;
res[0][0]=min(a[0][0]+b[0][0],a[0][1]+b[1][0]);
res[0][1]=min(a[0][0]+b[0][1],a[0][1]+b[1][1]);
res[1][0]=min(a[1][0]+b[0][0],a[1][1]+b[1][0]);
res[1][1]=min(a[1][0]+b[0][1],a[1][1]+b[1][1]);
return res;
}
}mul[N],w[N];int ch[N][2],fa[N],st[N],top,rt;bool vis[N];
inline void upd(R int u){mul[u]=mul[ch[u][0]]*w[u]*mul[ch[u][1]];}
inline void pd(R int u,R int v){
w[u][0][1]+=mul[v].mn(),w[u][1][1]=w[u][0][1],w[u][1][0]+=mul[v][1][1],fa[v]=u;
}
inline bool is(R int u){return ch[fa[u]][0]!=u&&ch[fa[u]][1]!=u;}
inline void init(){fp(i,1,n)w[i][0][1]=w[i][1][1]=val[i],w[i][1][0]=0,mul[i]=w[i];}
int sbuild(int l,int r){
if(l>r)return 0;int tot=0;fp(i,l,r)tot+=lsz[st[i]];
for(int i=l,now=lsz[st[i]];i<=r;++i,now+=lsz[st[i]])
if(now*2>=tot){
ch[st[i]][0]=sbuild(i+1,r),ch[st[i]][1]=sbuild(l,i-1);
fa[ch[st[i]][0]]=fa[ch[st[i]][1]]=st[i],upd(st[i]);
return st[i];
}
}
int build(int u){
for(int p=u;p;p=son[p])vis[p]=1;
for(int p=u;p;p=son[p])go(p)if(!vis[v])pd(p,build(v));
top=0;for(int p=u;p;p=son[p])st[++top]=p;
return sbuild(1,top);
}
void update(int u,int vva){
w[u][0][1]+=vva?-mx:mx,w[u][1][1]=w[u][0][1];
for(R int p=u;p;p=fa[p])if(is(p)&&fa[p]){
w[fa[p]][0][1]-=mul[p].mn(),w[fa[p]][1][1]=w[fa[p]][0][1];
w[fa[p]][1][0]-=mul[p][1][1],upd(p);
w[fa[p]][0][1]+=mul[p].mn(),w[fa[p]][1][1]=w[fa[p]][0][1];
w[fa[p]][1][0]+=mul[p][1][1];
}else upd(p);
}
int f[N][2];
void dp(int u,int fa){
f[u][0]=0,f[u][1]=val[u];
go(u)if(v!=fa){
dp(v,u),f[u][0]+=f[v][1],f[u][1]+=min(f[v][0],f[v][1]);
}
}
int main(){
// freopen("testdata.in","r",stdin);
w[0]=mul[0]=Matrix(1),n=read(),m=read(),getstr();
fp(i,1,n)val[i]=read();
for(R int i=1,u,v;i<n;++i)u=read(),v=read(),add(u,v),add(v,u);
dfs(1,0),init(),rt=build(1);
while(m--){
int u=read(),x=read(),v=read(),y=read();
if((u==fat[v]||v==fat[u])&&!x&&!y)print(-1);
else{
update(u,x),update(v,y);
print(mul[rt].mn()+(x+y)*mx);
update(u,x^1),update(v,y^1);
}
}return Ot(),0;
}

P5024 保卫王国的更多相关文章

  1. [倍增][换根DP]luogu P5024 保卫王国

    题面 https://www.luogu.com.cn/problem/P5024 分析 可以对有限制的点对之间的链进行在倍增上的DP数组合并. 需要通过一次正向树形DP和一次换根DP得到g[0][i ...

  2. P5024 保卫王国[倍增+dp]

    窝当然不会ddp啦,要写这题当然是考虑优化裸dp啦,但是这题非常麻烦,于是变成了黑题. 首先,这个是没有上司的舞会模型,求图的带权最大独立集. 不考虑国王的限制条件,有 \[ dp[x][0]+=dp ...

  3. 【洛谷】P5024 保卫王国 (倍增)

    前言 传送门 很多人写了题解了,我就懒得写了,推荐一篇博客 那就分享一下我的理解吧(说得好像有人看一样 对于每个点都只有选与不选两种情况,所以直接用倍增预处理出来两种情况的子树之内,子树之外的最值,最 ...

  4. P5024 保卫王国(动态dp/整体dp/倍增dp)

    做法(倍增) 最好写的一种 以下0为不选,1为选 \(f_{i,0/1}\)为\(i\)子树的最小值,\(g_{i,0/1}\)为除i子树外的最小值 \(fh_{i,j,0/1,0/1}\)为确定\( ...

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

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

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

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

  7. LG5024 保卫王国

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

  8. 「NOIP2018」保卫王国

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

  9. Uoj 441 保卫王国

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

随机推荐

  1. Yii Criteria常用方法(select,join,where,日期,)

    $criteria = new CDbCriteria;  //select $criteria->select = '*';//默认* $criteria->select = 'id,n ...

  2. 11892 - ENimEN(博弈)

    UVA 11892 - ENimEN 题目链接 题意:给定n堆石头.两人轮流取,每次仅仅能取1堆的1到多个.假设上一个人取了一堆没取完.那么下一个人必须继续取这堆.取到最后一个石头的赢,问谁赢 思路: ...

  3. 【dotnet跨平台】&quot;dotnet restore&quot;和&quot;dotnet run&quot;都做了些什么?

    [dotnet跨平台]"dotnet restore"和"dotnet run"都做了些什么? 前言: 关于dotnet跨平台的相关内容.能够參考:跨平台.NE ...

  4. 给大二学生——能够再坚持一年的ACM

    [来信] 我是大二学生,就读于一所非常普通的大学.学校ACM基本零起步,去年才開始搞,我大一大二花了非常多时间搞acm,如今不太想放弃.但学校基本没人愿意搞这个. 非常快就要大三了,我一直在纠结要不要 ...

  5. 【iOS系列】-自定义Modar动画

    [iOS系列]-自定义Modar动画.md 我们需要做的最终的modar动画的效果是这样的, 就是点击cell,cell发生位移,慢慢的到第二个界面上的.为了做出这样的动画效果,我们需要以下的知识. ...

  6. MongoDB经常使用命令

    首先我们先安装这个数据库.你能够使用windows或者linux,但推荐使用的是linux,我使用的是ubuntu12.04.在下方的网址中共能够下载,基本都是64位的系统. 假设位linux系统也能 ...

  7. android控件之间事件传递

    public boolean dispatchTouchEvent(MotionEvent ev){} 用于事件的分发.Android中全部的事件都必须经过这种方法的分发.然后决定是自身消费当前事件还 ...

  8. 修复Xcode升级错误 — PCH File Error

    http://www.rockia.net/2013/03/fix-xcode-update-pch-file-error Error:PCH File Built From A Different ...

  9. springCloud和docker笔记(1)——微服务架构概述

    1.微服务设计原则 1)单一职责原则:只关注整个系统中单独.有界限的一部分(SOLID原则之一) 2)服务自治原则:具备独立的业务能力和运行环境,可独立开发.测试.构建.部署 3)轻量级通信机制:体量 ...

  10. String池与iterator对集合的迭代

    一.静态导入 1.       导入类的静态属性 import static java.lang.System.out; out.println("haha"); 2.       ...