洛谷P4292:重建计划(点分治、单调队列)

解析

第一眼:Wow这么水的黑??
然后写了一发二分套线段树的3log代码上去
T到飞起,只有40…

无奈瞅了一眼标签:单调队列
对啊
于是又写了一个上去
20

好啊
然后就摆烂了
qwq
果然黑题没有一个好东西

一个关键的思想是把新加入的点当做单调队列中的元素
这样就能保证在联通块较小的时候被卡成R-L导致T飞
其实不难想,思维还是需要加强

此外,本题需要提前把点分治的树建出来
大大减小常数
而代码难度几乎没有提高

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1e5+100;
const int M=2e5+10500;
const double eps=1e-5;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,L,R,oo;
struct node{int to,nxt;double w;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y,int w){p[++cnt]=(node){y,fi[x],1.0*w};fi[x]=cnt;return;
}bool vis[N];
double dis[N],ans;
int dep[N],S,siz[N],mmx[N],rt,G[N];double mx[N];
int q[N],st,ed,tag[N],tim;
int nw[N],tot;
#define Mx(o) (tag[o]==tim?mx[o]:-2e11)int num;
void find(int x,int f){siz[x]=1;mmx[x]=0;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]||to==f) continue;find(to,x);//printf("  %d->%d siz:%d+=%d\n",x,to,siz[x],siz[to]);siz[x]+=siz[to];mmx[x]=max(mmx[x],siz[to]);}mmx[x]=max(mmx[x],S-siz[x]);if(!rt||mmx[rt]>mmx[x]) rt=x;//printf("  x=%d mx=%d (rt=%d) siz=%d\n",x,mx[x],rt,siz[x]);return;
}
void init(int x){S=siz[x];rt=0;find(x,0);x=rt;vis[rt]=1;G[++num]=x;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;init(to);}
}int jd[N];
void bfs(int x){dep[x]=1;nw[1]=x;jd[x]=tim;int st(1),ed(1);while(st<=ed){int now=nw[st++];for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]||jd[to]==tim) continue;jd[to]=tim;dep[to]=dep[now]+1;dis[to]=dis[now]+p[i].w;nw[++ed]=to;}}tot=ed;
}
int debug=0;
void solve(int x){//x=G[++num];S=siz[x];rt=0;find(x,0);x=rt;vis[x]=1;++tim;if(debug)printf("\n-----solve:rt=%d\n",x);mx[0]=0;tag[0]=tim;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;dis[to]=p[i].w;bfs(to);st=1,ed=0;int pl(0);if(debug) printf("to=%d\n",to);for(int d=min(R,dep[nw[tot]]);d>=0;d--){int li=L-d,ri=R-d;while(pl<tot&&dep[nw[pl+1]]<=ri){++pl;while(st<=ed&&dis[q[ed]]<=dis[nw[pl]]) ed--;q[++ed]=nw[pl];}while(st<=ed&&dep[q[st]]<li) st++;if(st<=ed) ans=max(ans,dis[q[st]]+Mx(d));if(debug) printf("  d=%d x=%d %.2lf %.2lf\n",d,q[st],dis[q[st]],Mx(d));if(debug) if(ans>=0){printf("!\n");exit(0);}}for(int o=1;o<=tot;o++){int now=nw[o];if(Mx(dep[now])<dis[now]){mx[dep[now]]=dis[now];tag[dep[now]]=tim;}}}for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;solve(to);}return;
}bool check(double v){for(int i=0;i<=cnt;i++) p[i].w-=v;num=0;memset(vis,0,sizeof(vis));ans=-2e11;siz[1]=n;solve(1);for(int i=0;i<=cnt;i++) p[i].w+=v;//printf("ans=%lf\n",ans);return ans>=0;
}int main(){
#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();L=read();R=read();//assert(n<=5000);int mn(1000000),mx(0);for(int i=1;i<n;i++){int x=read(),y=read(),w=read();mn=min(mn,w);mx=max(mx,w);addline(x,y,w);addline(y,x,w);}//siz[1]=n;init(1);if(debug){printf("%d\n",check(6.4));return 0;}double st=mn,ed=mx;while(ed-st>eps){double mmid=(st+ed)/2;if(check(mmid)) st=mmid;else ed=mmid;}//printf("%d\n",oo);printf("%.3lf",st);return 0;
}
/*
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

E. Colorings and Dominoes(未解决)

E. Colorings and Dominoes 题意&#xff1a; n * m的格子&#xff0c;分为黑白格子&#xff0c;白格子可以染成蓝色或者红色&#xff0c;一个1 * 2的多米诺骨牌&#xff0c;可以覆盖两个连续的水平的红色格子或者两个连续的竖着的蓝色格子&#xff0c;对于一个染色方案&…

[HNOI2016]网络(树链剖分+线段树+大根堆)

[HNOI2016]网络 problem solution 另辟蹊径&#xff0c;不把交互请求赋在新增路径上&#xff0c;反而把交互请求赋在树上除去该请求路径覆盖点的其它点上 显然&#xff0c;路径问题树剖是非常可以的、 那么一个点上的信息就表示所有不经过该点的交互请求&#xff0c;用堆…

P4557-[JSOI2018]战争【凸包,闵可夫斯基和】

正题 题目连接:https://www.luogu.com.cn/problem/P4557 题目大意 给出两个点集A,BA,BA,B&#xff0c;qqq次询问给出一个向量vvv&#xff0c;询问将BBB中所有点加上向量vvv后两个集合的凸包是否有交。 1≤n,m,q≤1051\leq n,m,q\leq 10^51≤n,m,q≤105 解题思路 闵可夫斯基和…

IdentityServer4实战 - JWT Token Issuer 详解

一.前言本文为系列补坑之作&#xff0c;拖了许久决定先把坑填完。下文演示所用代码采用的 IdentityServer4 版本为 2.3.0&#xff0c;由于时间推移可能以后的版本会有一些改动&#xff0c;请参考查看&#xff0c;文末附上Demo代码。本文所诉Token如无特殊说明皆为 JWT Token。众…

P3834 【模板】可持久化线段树 2(整体二分做法)

P3834 【模板】可持久化线段树 2&#xff08;主席树&#xff09; 我们详细讲讲这个整体二分如何求区间第k小 我们都知道二分可以求出区间里某个想要的值&#xff0c;如果有很多询问&#xff0c;我们对每个询问都进行二分&#xff0c;复杂度就是O(QNlog(1e9))铁超&#xff0c;那…

YBTOJ洛谷P3292:幸运数字(线性基、点分治/倍增)

解析 虽然使用三个log的倍增算法艹过去了 但是我们还是来聊聊正解吧 考虑点分治 对于当前的根&#xff0c;dfs求出联通块内每个点到当前根的线性基 一条路径的答案应该在路径出现上第一个成为根的点时统计到 具体来说&#xff0c;就是路径的两端点在同一个solve函数的不同子树…

AGC053E-More Peaks More Fun【计数】

正题 题目链接:https://atcoder.jp/contests/agc053/tasks/agc053_e 题目大意 给出nnn个二元组(ai,bi)(a_i,b_i)(ai​,bi​)&#xff0c;求有多少个1∼n1\sim n1∼n的排列ppp满足&#xff1a; 你可以将一些(ai,bi)(a_i,b_i)(ai​,bi​)变为(bi,ai)(b_i,a_i)(bi​,ai​)定义序…

「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri],[Lj,Rj][L_i,R_i],[L_j,R_j][Li​,Ri​],[Lj​,Rj​]能够合并成完整的健康区间的条件为Ri−Lj1≥∣Ti−Tj∣R_i-Lj1\ge |T_i-T_j|Ri​…

胡浩:人人能学的AI《从零开始机器学习》苏州.NET俱乐部课程分享

【课程名称】《从零开始机器学XI》【老师介绍】胡浩&#xff0c;微软最有价值专家&#xff08;MVP&#xff0c;十余届多方向&#xff09;&#xff0c;微软技术大会讲师。云、数据中心基础架构、全栈虚拟化、企业移动管理等领域的架构师及顾问。AI/ML等新技术的爱好者&#xff0…

整体二分例题

参考oi wiki 引入&#xff1a; 有一部分题可以使用二分的办法来解决。但是当这种题目有多次询问且每次询问我们对每个查询都直接二分&#xff0c;可能会收获一个 TLE。这时候我们就会用到整体二分。整体二分的主体思路就是把多个查询一起解决。&#xff08;所以这是一个离线算…

P8338-[AHOI2022]排列【质因数分解】

正题 题目链接:https://www.luogu.com.cn/problem/P8338 题目大意 给出一个排列pip_ipi​&#xff0c;定义ai0i,aikapik−1a_i^0i,a_i^ka_{p_i}^{k-1}ai0​i,aik​api​k−1​。 对于排列PPP&#xff0c;定义F(P)F(P)F(P)表示最小的一个正整数kkk满足Pk1PP^{k1}PPk1P。 定义…

CF1100F Ivan and Burgers(线性基)

解析 做幸运数字的时候逛题解区爬过来的 挺妙的 把所有询问离线下来&#xff0c;按右端点排序 贪心的让最高位更高的向量出现的尽可能向右 实现上可以把线性基里的向量和当前的数swap来实现 代码就非常好写了 代码 #include<bits/stdc.h> using namespace std; #defi…

[APIO2013]机器人(DP+SPFA最短路)

[APIO2013]机器人 description solution dpl,r,i,j:dp_{l,r,i,j}:dpl,r,i,j​: 在(i,j)(i,j)(i,j)位置合并编号为[l,r][l,r][l,r]区间内的所有机器人的最小花费 toi,j,k:to_{i,j,k}:toi,j,k​: 从(i,j)(i,j)(i,j)以kkk方向推机器人最终停止的位置&#xff0c;用dfs记忆化搜索…

IdentityServer4实战 - 与API单项目整合

一.前言我们在实际使用 IdentityServer4 的时候&#xff0c;可能会在使用 IdentityServer4 项目添加一些API&#xff0c;比如 找回密码、用户注册、修改用户资料等&#xff0c;这些API与IdentityServer4怎么共存在一个项目呢&#xff1f;二.整合1.首先在 Startup.cs 中添加 Ide…

P2305 [NOI2014] 购票(点分治、斜率优化)

解析 第一道完全自己做出来的黑题awa &#xff08;如果不算那道感觉完全是恶评的石油的话&#xff09; 然而连写带调整了3.5h… 容易想到链的做法 设ancxanc_xancx​表示x的祖先,disxdis_xdisx​表示x到1的距离 则有&#xff1a; dpvmin⁡disv−lv<disu,u∈ancv(dpupv(dis…

HDU1394(权值线段树)

HDU1394(权值线段树) 题意&#xff1a; 给定一个0到n-1的数字组成的序列&#xff0c;可以将序列进行左移任意次&#xff0c;求所能组成序列的逆序对的最小值 题解&#xff1a; 利用权值线段树&#xff0c;我们先求出当前序列所能组成的逆序对&#xff0c; 然后依次左移动 当…

P8339-[AHOI2022]钥匙【虚树,扫描线】

正题 题目连接:https://www.luogu.com.cn/problem/P8339 题目大意 给出nnn个点的一棵树&#xff0c;每个点有钥匙或者宝箱&#xff0c;有不同的颜色。 mmm次询问&#xff0c;从xxx走到yyy&#xff0c;走到钥匙时会拾取钥匙&#xff0c;走到宝箱时如果有同色的钥匙那么就会消耗…

[HDU 6157]The Karting(DP)

[HDU 6157]The Karting description solution 先用前缀和求出di:1→id_i:1\rightarrow idi​:1→i 的距离 前缀和满足&#xff1a;若在iii点进行方向改变&#xff0c;则iii产生的贡献是一定的&#xff0c;可以先累计贡献 也就是说真正的路径怎么走&#xff0c;我们是不关心…

.NET 开源简史

现在在微软开发开源软件是很一件正常的事情——但在 2007 年&#xff0c;当时我刚加入微软&#xff0c;那时候可不是这么一回事。微软花了好几年时间才找到正确的方向&#xff0c;让微软这艘大船顺着开源之风向前航行。现在回头远望过去那些曾经面临的挑战&#xff0c;我们一笑…

P2617 Dynamic Rankings(整体二分)

P2617 Dynamic Rankings 题意: 待修改的区间最值问题 题解&#xff1a; 整体二分天然带有修改性 整体二分做不带修改的区间最值—>看这里 现在待修改&#xff0c;我们可以将第l位修改为x&#xff0c;因为我们是用树状数组来维护的&#xff0c;所以把这个过程拆分成将第l个…