LINK:Spiders Evil Plan

非常巧妙的题目。

选出k条边使得这k条边的路径覆盖x且覆盖的边的边权和最大。

类似于桥那道题还是选择2k个点 覆盖x那么以x为根做长链剖分即可。

不过这样过不了。

还是考虑树的直径 可以发现覆盖x的那些点一定有一个是树的直径的两端之一。

所以我们直接对两条直径分别做这个东西然后想办法覆盖x.

如果y条边x还没被覆盖。

可以发现此时调整只有两种情况。

  1. 去掉长度最小的链然后把x所在的最长链加上去。

  2. 可以把x向上的被加入的链的下半部分去掉换成x.

由于边权不为1 所以无法直接跳长链。

考虑倍增即可。

const int MAXN=100010;
int n,len,Q;
int Log[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],e[MAXN<<1];
inline void add(int x,int y,int z)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
e[len]=z;
}
struct wy
{
int d[MAXN],dis[MAXN],son[MAXN],mx[MAXN],ans[MAXN],c[MAXN];
int f[MAXN][20],cnt,rt,maxx;;
pii s[MAXN];
inline void dfs(int x,int fa,int op)
{
if(op)
{
f[x][0]=fa;mx[x]=dis[x];
d[x]=d[fa]+1;
rep(1,Log[d[x]],i)f[x][i]=f[f[x][i-1]][i-1];
}
if(!op&&dis[x]>dis[rt]){rt=x;}
go(x)
{
if(tn==fa)continue;
dis[tn]=dis[x]+e[i];
dfs(tn,x,op);
if(op&&mx[tn]>mx[x])
{
mx[x]=mx[tn];
son[x]=tn;
}
}
}
inline void dp(int x,int fa)
{
if(x==fa){s[++cnt]=mk(mx[x]-dis[f[x][0]],x);}
if(son[x])dp(son[x],fa);
go(x)if(tn!=f[x][0]&&tn!=son[x])dp(tn,tn);
}
inline void init(int x)
{
dfs(x,0,0);dis[rt]=0;
dfs(rt,0,1);dp(rt,rt);
sort(s+1,s+cnt+1);
for(int i=1,j=cnt;i<=cnt;++i,--j)
{
ans[i]=ans[i-1]+s[j].F;
for(int k=s[j].S;k;k=son[k])c[k]=i;
}
}
inline int calc1(int x,int y)//x所在长链替换y-1条长链
{
--y;
int w=x;
fep(Log[d[w]],0,i)if(c[f[w][i]]>y)w=f[w][i];
w=f[w][0];return ans[y]+mx[x]-dis[w];
}
inline int calc2(int x,int y)//向上的第一个长链的下半部分被替换掉.
{
int w=x;
fep(Log[d[x]],0,i)if(c[f[w][i]]>y)w=f[w][i];
w=f[w][0];return ans[y]+mx[x]-mx[w];
}
inline int query(int x,int y)
{
y=y*2-1;
if(y>=cnt)return ans[cnt];
if(c[x]<=y)return ans[y];
return max(calc1(x,y),calc2(x,y));
} }t[2];
int main()
{
freopen("1.in","r",stdin);
get(n);get(Q);
rep(2,n,i)
{
int get(x),get(y),get(z);
add(x,y,z);add(y,x,z);
Log[i]=Log[i>>1]+1;
}
t[0].init(1);t[1].init(t[0].rt);
int ans=0;
rep(1,Q,i)
{
int x,y;
get(x);get(y);
x=(x+ans-1)%n+1;
y=(y+ans-1)%n+1;
ans=max(t[0].query(x,y),t[1].query(x,y));
put(ans);
}
return 0;
}

CF Contest 526 G. Spiders Evil Plan 长链剖分维护贪心的更多相关文章

  1. 【BZOJ3252】攻略(长链剖分,贪心)

    [BZOJ3252]攻略(长链剖分,贪心) 题面 BZOJ 给定一棵树,每个点有点权,选定\(k\)个叶子,满足根到\(k\)个叶子的所有路径所覆盖的点权和最大. 题解 一个假装是对的贪心: 每次选择 ...

  2. bzoj 3252 攻略 长链剖分思想+贪心

    攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 889  Solved: 423[Submit][Status][Discuss] Descrip ...

  3. 7.28 NOI模拟赛 H2O 笛卡尔树 并查集 贪心 长链剖分

    LINK:H2O 这场比赛打的稀烂 爆蛋. 只会暴力.感觉暴力细节比较多不想写. 其实这道题的难点就在于 采取什么样的策略放海绵猫. 知道了这一点才能确定每次放完海绵猫后的答案. 暴力枚举是不行的.而 ...

  4. 【CF1009F】Dominant Indices(长链剖分)

    [CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的 ...

  5. Codeforces 526G - Spiders Evil Plan(长链剖分+直径+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 %%%%% 这题也太神了吧 storz 57072 %%%%% 首先容易注意到我们选择的这 \(y\) 条路径的端点一定是叶子节点,否则我 ...

  6. 【CF526G】Spiders Evil Plan(贪心)

    [CF526G]Spiders Evil Plan(贪心) 题面 洛谷 CodeForces 给定一棵树,要求选择\(y\)条链,满足被链覆盖的所有点在树上联通,且\(x\)必定在联通块中. 对于每次 ...

  7. [CF526G]Spiders Evil Plan

    题目大意: 给出一个$n(n\leq 10^5)$个结点的带边权的树,$q(q\leq 10^5)$个询问,每次询问用$y$条路径覆盖整棵树且覆盖$x$至少一次,最多能覆盖的道路长度是多少? 强制在线 ...

  8. Codeforces 526G Spiders Evil Plan

    由于做的时候看的是中文题面,第一遍写就被卡题意了:还以为每一条都要过x,那么就是一道动态树根选择2y个叶子的奇怪题目 交完0分gg,才发现题目看错了╮(╯▽╰)╭ the node containin ...

  9. 【Cf Edu #47 F】Dominant Indices(长链剖分)

    要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故 ...

随机推荐

  1. web页面弹出遮罩层,通过js或css禁止蒙层底部页面跟随滚动

    场景概述 弹窗是一种常见的交互方式,而蒙层是弹窗必不可少的元素,用于隔断页面与弹窗区块,暂时阻断页面的交互.但是,在蒙层元素中滑动的时候,滑到内容的尽头时,再继续滑动,蒙层底部的页面会开始滚动,显然这 ...

  2. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  3. day18 装饰器(下)+迭代器+生成器

    目录 一.有参装饰器 1 前提 2 如何使用有参装饰器 3 有参装饰器模板 4 修正装饰器 二.迭代器 1 什么是迭代器 2 为什么要有迭代器 3 如何用迭代器 3.1 可迭代对象 3.2 可迭代对象 ...

  4. Django中的request到底有啥属性

    Django中的request到底有啥属性呢 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函 ...

  5. 据说比Spring快44倍的web开发框架,不妨试试

    该框架称为:**light-4j **.官方网站简介:A fast, lightweight and more productive microservices framework.很简单,翻译过来就 ...

  6. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary lo的解决办法

    创建存储过程时,出错信息: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA ...

  7. Email正则表达式验证

    在做邮箱验证的时候,进行简单的整理: string emailStr = @"/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3 ...

  8. LGV定理

    LGV定理用于解决路径不相交问题. 定理 有 \(n\) 个起点 \(1, 2, 3, ..., n\),它们 分别对应 要到 \(n\) 个终点 \(A, B, C, ..., X\),并且要求路径 ...

  9. 题解 洛谷 P3210 【[HNOI2010]取石头游戏】

    考虑到先手和后手都使用最优策略,所以可以像对抗搜索一样,设 \(val\) 为先手收益减去后手收益的值.那么先手想让 \(val\) 尽可能大,后手想让 \(val\) 尽可能小. 继续分析题目性质, ...

  10. Nginx配置多个域名指向不同的端口

    一.前言 很多时候我们都会在同一个服务器上部署多个项目,我们有多个域名的情况下,怎么样使不同的域名都通过80端口来访问呢?打个比方说,现在有2个域名,分别是:tessai.cn 和 admin.tes ...