保卫王国

电脑卡懒得把题面挪过来了。


朴素

\[dp_{i,0}=\sum dp_{s,1}\\
dp_{i,1}=\sum \min(dp_{s,0},dp_{s,1})+p_i
\]

然后直接动态dp就行了

我发现lct是最好写的,反正比树剖好写,还比她快

没倍增快,但是看起来倍增挺难写的...


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
const ll inf=1ll<<45;
const int N=1e5+10;
int ch[N][2],par[N];
struct matrix{ll a,b,c,d;}dat[N],sum[N],ret;
int head[N],to[N<<1],Next[N<<1],cnt;
ll dp[N][2],p[N];
int n,m;char str[233];
using std::min;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
void dfs(int now)
{
dp[now][1]=p[now];
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=par[now])
{
par[v]=now,dfs(v);
dp[now][0]+=dp[v][1];
dp[now][1]+=min(dp[v][0],dp[v][1]);
}
dat[now]=sum[now]=(matrix){inf,dp[now][0],dp[now][1],dp[now][1]};
}
matrix operator ^(matrix a,matrix b)
{
ret.a=min(a.a+b.a,a.b+b.c);
ret.b=min(a.a+b.b,a.b+b.d);
ret.c=min(a.c+b.a,a.d+b.c);
ret.d=min(a.c+b.b,a.d+b.d);
return ret;
}
#define ls ch[now][0]
#define rs ch[now][1]
#define fa par[now]
void updata(int now)
{
sum[now]=ls?sum[ls]^dat[now]:dat[now];
sum[now]=rs?sum[now]^sum[rs]:sum[now];
}
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void Rotate(int now)
{
int p=fa,typ=identity(now);
connect(p,ch[now][typ^1],typ);
if(isroot(p)) connect(par[p],now,identity(p));
else fa=par[p];
connect(now,p,typ^1);
updata(p),updata(now);
}
void splay(int now)
{
for(;isroot(now);Rotate(now))
if(isroot(fa))
Rotate(identity(now)^identity(fa)?now:fa);
}
void access(int now)
{
for(int las=0;now;las=now,now=fa)
{
splay(now);
if(las)
{
dat[now].b-=sum[las].d;
dat[now].c-=min(sum[las].b,sum[las].d);
}
if(rs)
{
dat[now].b+=sum[rs].d;
dat[now].c+=min(sum[rs].b,sum[rs].d);
}
dat[now].d=dat[now].c;
rs=las;
updata(now);
}
}
void modify(int now,ll w)
{
access(now),splay(now);
dat[now].c+=w-p[now],p[now]=w;
dat[now].d=dat[now].c;
updata(now);
}
int main()
{
scanf("%d%d%s",&n,&m,str);
for(int i=1;i<=n;i++) scanf("%lld",p+i);
for(int u,v,i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(1);
for(int a,x,b,y,i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&x,&b,&y);
ll ans=0,t1=p[a],t2=p[b];
if(x&&y)
{
modify(a,-inf),modify(b,-inf);
ans=(inf<<1)+t1+t2;
}
else if(x&&!y)
{
modify(a,-inf),modify(b,inf<<1);
ans=inf+t1;
}
else if(!x&&y)
{
modify(a,inf<<1),modify(b,-inf);
ans=inf+t2;
}
else
modify(a,inf<<1),modify(b,inf<<1);
ans+=min(sum[b].b,sum[b].d);
if(ans>=inf) puts("-1");
else printf("%lld\n",ans);
modify(a,t1),modify(b,t2);
}
return 0;
}

2019.1.4

noip2018 d2t3 保卫王国 解题报告的更多相关文章

  1. @NOIP2018 - D2T3@ 保卫王国

    目录 @题目描述@ @题解@ @代码@ @题目描述@ Z 国有n座城市,n−1 条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻 ...

  2. 「NOIP2018」保卫王国

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

  3. NOIP2018提高组Day2 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). \(Day2\)的题目和\(Day1\)比起来,真的是难了很多啊. \(T1\):旅行(点此看 ...

  4. 洛谷 P4475 巧克力王国 解题报告

    P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...

  5. NOIP2018提高组Day1 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...

  6. NOIP2018普及组初赛解题报告

    本蒟蒻参加了今年的NOIP2018普及组的初赛 感觉要凉 总而言之,今年的题要说完全没有难度倒也不至于,还有不少拼RP的题,比如第一次问题求解考逻辑推理,第一次完善程序考双链表等 下面我就和大家一起看 ...

  7. 【NOIP2018】保卫王国 动态dp

    此题场上打了一个正确的$44pts$,接着看错题疯狂$rush$“正确”的$44pts$,后来没$rush$完没将之前的代码$copy$回去,直接变零分了..... 这一题我们显然有一种$O(nm)$ ...

  8. loj 2955 「NOIP2018」保卫王国 - 树链剖分 - 动态规划

    题目传送门 传送门 想抄一个短一点ddp板子.然后照着Jode抄,莫名其妙多了90行和1.3k. Code /** * loj * Problem#2955 * Accepted * Time: 26 ...

  9. NOIP2018 Day2T3 保卫王国

    首先不考虑强制要求的话是一个经典问题,令 \(f_{i, 0 / 1}\) 为 \(i\) 选或不选时以 \(i\) 为根的子树的最优答案.那么就有转移 \(f_{u, 0} = \sum f_{v, ...

随机推荐

  1. 福慧双修&探险 BZOJ4398&BZOJ2407

    分析: 双倍经验(数据范围不同). 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案.那么我们考虑预处理出pre[i]表示从1走到 ...

  2. R 语言-基础

    R语言 1997年成为GNU项目 开源免费 R官方网址 www.r-project.org R是数据分析领域的语言小巧灵活,通过扩展包来增强功能绘图功能代码简单 开发环境R + RStudio 1.数 ...

  3. [Deep-Learning-with-Python]基于Kears的Reuters新闻分类

    Reuters数据集下载速度慢,可以在我的repo库中找到下载,下载后放到~/.keras/datasets/目录下,即可正常运行. 构建神经网络将路透社新闻分类,一共有46个类别.因为有多个类别,属 ...

  4. P2371 [国家集训队]墨墨的等式

    膜意义下最短路. 把最小的\(a\)抠出来,作为模数\(mod\),然后建点编号为\(0\)到\(mod-1\),对每个数\(a\)连边\((i,(a+i)\mod mod)\)点\(i\)的最短路就 ...

  5. ECMAScript6——Set数据结构

    /** * 数据结构 Set */ // ----------------------------------------------------- /** * 集合的基本概念:集合是由一组无序且唯一 ...

  6. 移动端H5页面上传图片或多张图片

    传统PC网页上传文件,大家都已经熟悉,这里不做介绍. 本文简单介绍移动端常用上传图片功能.灵活使用轮询或长连接可实现PC与移动端数据同步,即PC端需要上传的图片是移动拍照下来或移动端硬盘储存的,不需要 ...

  7. 关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)

    关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位) 起因:在进行bootstrap的.navbar-brand内文字设置垂直居中时采用li ...

  8. symfon2 配置文件使用 + HttpRequest使用 + Global多语言解决方案

    1. 在 app/conig中建立一个自命名的文件: abc.yml 2. 在 app/config/config.yml中导入abc.yml 文件头部: imports:- { resource: ...

  9. @Param注解的用法解析

    实例一 @Param注解单一属性 dao层示例 Public User selectUser(@param(“userName”) String name,@param(“userpassword”) ...

  10. mybatis mapper使用记录

    insert://插入一条数据//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)//优先使用传入的参数值,参数值空时,才会使用序列.UUID,自动增长int i ...