[SDOI2011]消耗战

思路;

  建虚树走树形dp;

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 1e17
#define maxn 250005
#define ll long long
#define maxm (maxn<<1)
struct LandType {
ll id,key;
bool operator<(const LandType pos)const
{
return key<pos.key;
}
};
struct LandType ai[maxn];
ll n,head[maxn],E[maxm],V[maxm],W[maxm],cnt;
ll size[maxn],top[maxn],f[maxn],deep[maxn];
ll lar[maxn],m,id[maxn],dis[maxn],li[maxn];
ll ri[maxn],sta[maxn];
bool if_[maxn];
inline void in(ll &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'')Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
inline void edge_add(ll u,ll v,ll w)
{
E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;
}
inline void edge_add(ll u,ll v)
{
// printf("%d %d\n",u,v);
E[++cnt]=head[u],V[cnt]=v,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,head[v]=cnt;
}
void dfs1(ll now,ll fa,ll pi)
{
deep[now]=deep[fa]+,f[now]=fa;
dis[now]=pi,size[now]=;
for(ll i=head[now];i;i=E[i])
{
if(V[i]==fa) continue;
dfs1(V[i],now,min(pi,W[i]));
size[now]+=size[V[i]];
if(size[V[i]]>size[lar[now]])lar[now]=V[i];
}
}
void dfs2(ll now,ll chain)
{
top[now]=chain,id[now]=++cnt,li[now]=cnt;
if(lar[now])
{
dfs2(lar[now],chain);
for(ll i=head[now];i;i=E[i])
{
if(V[i]==f[now]||V[i]==lar[now]) continue;
dfs2(V[i],V[i]);
}
}
ri[now]=cnt;
}
inline ll find(ll x,ll y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=f[top[x]];
}
return deep[x]<deep[y]?x:y;
}
ll dp(ll now,ll fa)
{
bool flag=false;
ll pos=;
for(ll i=head[now];i;i=E[i])
{
if(V[i]==fa) continue;
pos+=dp(V[i],now),flag=true;
}
bool myj=if_[now];head[now]=;if_[now]=false;
if(flag&&!myj) return min(pos,dis[now]);
else return dis[now];
}
int main()
{
in(n);ll u,v,w,ki;
for(ll i=;i<n;i++)in(u),in(v),in(w),edge_add(u,v,w);
cnt=,dfs1(,,INF),dfs2(,),in(m);
memset(if_,,sizeof(if_));memset(head,,sizeof(head));
while(m--)
{
in(ki),cnt=;
for(ll i=;i<=ki;i++) in(ai[i].id),ai[i].key=id[ai[i].id],if_[ai[i].id]=true;
sort(ai+,ai+ki+);ll p=;sta[p]=;
for(ll i=;i<=ki;i++)
{
ll now=ai[i].id,pos=sta[p],pos_=sta[p-];
if(id[now]>li[pos]&&id[now]<=ri[pos]) sta[++p]=now;
else
{
if(id[now]>li[pos_]&&id[now]<=ri[pos_])
{
ll lca=find(now,pos);
if(pos!=lca) edge_add(pos,lca);
p--;
if(lca!=pos_) sta[++p]=lca;
sta[++p]=now;
}
else
{
while((id[now]<li[pos_]||id[now]>ri[pos_])&&p>)
{
edge_add(pos_,pos),p--;
pos=sta[p],pos_=sta[p-];
}
ll lca=find(now,pos);
edge_add(lca,pos),p--;
if(pos_!=lca) sta[++p]=lca;
sta[++p]=now;
}
}
}
while(p>)
edge_add(sta[p],sta[p-]),p--;
printf("%lld\n",dp(,));
}
return ;
}

AC日记——[SDOI2011]消耗战 洛谷 P2495的更多相关文章

  1. AC日记——[SDOI2011]染色 洛谷 P2486

    题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...

  2. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  3. AC日记——铺地毯 洛谷 P1003(水水水水水~)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  4. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  5. AC日记——[SDOI2017]相关分析 洛谷 P3707

    [SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  6. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  7. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  8. AC日记——挤牛奶 洛谷 P1204

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  9. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

随机推荐

  1. 背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能

    背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料.本文将更加详细的介 ...

  2. All you need to know about sorting in Postgres

    按:之前看pg的执行计划,多次看到不同的排序方式,但不知何意.偶遇此篇讲解pg执行计划三种排序方式,备忘一下. Sorting Sorting is one of the most fundament ...

  3. CopyOnWrite容器?

    CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后, ...

  4. HDU2688 树状数组(逆序数)

    Rotate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. 手脱ACProtect V1.4X(有Stolen Code)之补区段

    首先需要说的是,这个壳是ximo大神视频教程里的 0041F000 > pushad ; //程序入口点 0041F001 E8 call NgaMy.0041F007 0041F006 E8 ...

  6. win下删除oracle

    关掉oralce服务. 具体方式有两种: 1.命令行下使用命令关闭服务:net stop OracleServiceORCL ,ORCL是我的实例名字,换成你的) 2.运行services.msc到系 ...

  7. [LeetCode] 3. Longest Substring Without Repeating Characters ☆☆☆

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  8. Android 百度定位SDKv4.2及6.0_百度定位实例_安卓定位实例

    介绍 由于项目需要.前几天一直在研究百度定位的功能.通过不断的实践终于有结果了.不愿意独享 现在我把我的研究成果和大家分享一下.其实百度的 API 已经相当不错了 这之所以要写出来.一是自己做一个笔记 ...

  9. [SDOI2011] 染色(Luogu 2486)

    题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...

  10. Spring cookie 实战(山东数漫江湖)

    Cookie是什么 简单来说,cookie就是浏览器储存在用户电脑上的一小段文本文件.cookie 是纯文本格式,不包含任何可执行的代码.一个web页面或服务器告知浏览器按照一定规范来储存这些信息,并 ...