题目
简化题意:你需要维护\(n\)个集合,集合元素为二元组\((x,v)\)。集合\(i\)的产生方式是以某个原有集合\(p_i\)为样本,扩展或删除一个元素后得到新集合。有\(q\)次询问,每次给出\(y\)并指定一个集合\(i\),要求从集合\(i\)中找出一个元素,最小化\((x−y)^2+v\)。
先拆式子\((x-y)^2+v=x^2-2xy+y^2+v\),令其等于\(k\)即\(x^2+y^2-2xy+v=k\)。
移项得\(2yx+k=y^2+x^2+v\),可以看作是\((x,x^2+y^2+v)\)这一决策点,\(2y\)为斜率,\(k\)就为\(y\)轴截距。所以这个可以维护凸壳来解决。
我们知道每一个元素在\(dfs\)序中会以一段一段区间的形式出现。
每个点不管加入还是删除元素都会造成一个新的区间,所以区间总数是\(O(n)\)的。
将元素按照\(x\)升序排序后插入线段树,每个节点维护一个凸壳。
询问按\(y\)升序排序,可以使得每次操作可是直接取上一次凸壳最前面的值。

#include<bits/stdc++.h>
#define LL long long
#define db double
#define pb push_back
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
#define INF 1e18
using namespace std;
const int N=500007;
int L[N<<2],R[N<<2],t[N],dfn[N],T[N],n,m,Time;
LL C[N],ans[N],val[N];
vector<int>G[N],al[N],ar[N],w[N<<2];
struct node{LL x,val,id;}a[N];
int cmp(int a,int b){return val[a]<val[b];}
int operator<(node a,node b){return a.val<b.val;}
LL min(LL a,LL b){return a<b? a:b;}
db K(int x ,int y){return (val[x]*val[x]+C[x]-val[y]*val[y]-C[y])/(db)(val[x]-val[y]);}
void dfs(int u,int fa)
{dfn[u]=++Time;if(T[u]>0) al[T[u]].pb(Time);if(T[u]<0) ar[-T[u]].pb(Time-1);for(int i=G[u].size()-1,v;~i;--i) if((v=G[u][i])^fa) dfs(v,u);if(T[u]>0) ar[T[u]].pb(Time);if(T[u]<0) al[-T[u]].pb(Time+1);
}
void build(int p,int l,int r)
{L[p]=0,R[p]=-1;if(l==r) return ;build(ls,l,mid),build(rs,mid+1,r);
}
void update(int p,int l,int r,int ql,int qr,int P)
{if(ql==l&&r==qr){while(w[p].size()<=R[p]+5) w[p].pb(0);if(L[p]<=R[p]&&val[w[p][R[p]]]==val[P]){if(C[w[p][R[p]]]<=C[P]) return ;--R[p];}while(L[p]<R[p]&&K(w[p][R[p]],P)<K(w[p][R[p]],w[p][R[p]-1])) --R[p];w[p][++R[p]]=P;return ;}if(qr<=mid) update(ls,l,mid,ql,qr,P);else if(ql>mid) update(rs,mid+1,r,ql,qr,P);else update(ls,l,mid,ql,mid,P),update(rs,mid+1,r,mid+1,qr,P);
}
LL query(int p,int l,int r,int x,LL t,LL sum)
{LL ans=INF;while(L[p]<R[p]&&K(w[p][L[p]],w[p][L[p]+1])<=2.0*t) ++L[p];if(L[p]<=R[p]&&w[p].size()>0) ans=(t-val[w[p][L[p]]])*(t-val[w[p][L[p]]])+C[w[p][L[p]]];ans=min(ans,sum);if(l==r) return ans;return x<=mid? query(ls,l,mid,x,t,ans):query(rs,mid+1,r,x,t,ans);
}
int main()
{int i,j,k,u,x,opt,l,r;scanf("%d%d%lld",&n,&m,&C[0]);for(i=1;i<n;++i) scanf("%d%d%d",&opt,&u,&x),G[u].pb(i),(opt? (T[i]=-x):(T[i]=x,scanf("%lld%d%d%lld",&val[x],&u,&u,&C[x])));dfs(0,0),build(1,1,n);for(i=1;i<=n;++i) t[i]=i;sort(t+1,t+n+1,cmp),update(1,1,n,1,n,0);for(i=1;i<=n;++i) for(k=t[i],j=0;j<al[k].size();++j) if((l=al[k][j])<=(r=ar[k][j])) update(1,1,n,l,r,k);for(i=1;i<=m;++i) scanf("%lld%lld",&a[i].x,&a[i].val),a[i].id=i;sort(a+1,a+m+1);for(i=1;i<=m;++i) ans[a[i].id]=query(1,1,n,dfn[a[i].x],a[i].val,INF);for(i=1;i<=m;++i) printf("%lld\n",ans[i]);
}

转载于:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11519553.html

Luogu P5416 [CTSC2016]时空旅行相关推荐

  1. UOJ#198 [CTSC2016]时空旅行

    题目 UOJ#198 [CTSC2016]时空旅行 题解 QAQ允许我做一个悲伤的表情.这题题解真少.我要做一个造福人类的人. 首先呢可以看出,如果把每个时空当做一个节点,这是棵树,每个节点有一个添加 ...

  2. bzoj5077: [Ctsc2016]时空旅行【线段树+凸包】

    Description 2045年,人类的技术突飞猛进,已经找到了进行时空旅行的方法.小R得到了一台时空旅行仪,他想用它调查不同 时空中人类的发展状况.根据平行时空理论,宇宙中存在着很多独立的时空,每 ...

  3. [CTSC2016]时空旅行(斜率优化+线段树分治)

    洛谷题目传送门 解题思路 首先发现只有xxx和ccc是有用的 这些时空构成了一棵树,我们实际上要找一个点iii,满足对于给出的XXX min((X−xi)2+ci)min((X-x_i)^2+c_i) ...

  4. [CTSC2016]时空旅行

    一.题目 点此看题 二.解法 可以看出这些平行时空呈树形结构,每个星球都会出现在一段连续的dfndfndfn序中,而我们正是要对每个时空的星球中找最小值,那么可以把星球打在dfndfndfn的线段树上 ...

  5. BZOJ5077: [Ctsc2016]时空旅行(线段树+凸包)

    传送门 题解: 首先答案为min(x−xi)2+cimin(x−xi)2+ci\min {(x-x_i)^2+c_i},移项得x2−2xix+x2i+cx2−2xix+xi2+cx^2 -2x_ix+ ...

  6. [CTSC2016]时空旅行 (线段树分治)

    前言 昨天学习了线段树分治,算法比较抽象,没有学得太具体,今天做一道例题练练手 --自闭前 题面上洛谷 题意 维护若干个集合,每个集合都是由一个编号比它小的集合加入一个二元组(x,c)(x,c)(x, ...

  7. CTSC2016时空旅行

    当时看这道题AC的人数比较多,就开了这道题. 很容易发现是这是一个有关凸包的题. 然后不知道怎么维护凸包,一直在想cdq,感觉复杂度不行,于是被这玩意难住了-- 幸好有亲学长yyh造福人类的题解:ht ...

  8. [UOJ198][CTSC2016]时空旅行

    uoj description 你要维护若干个集合,每个集合都是有一个编号比他小的集合扩展而来,扩展内容为加入一个新的元素\((x,c)\)或者删除一个已有元素.集合的扩展关系之间构成一个树形结构. ...

  9. [CTSC2016]时空旅行(线段树+凸包)

    应该是比较套路的,但是要A掉仍然不容易. 下面理一下思路,思路清楚了也就不难写出来了. 0.显然y,z坐标是搞笑的,忽略即可. 1.如果x不变,那么直接set即可解决. 2.考虑一个空间和询问x0,通 ...

最新文章

  1. ElasticSearch+ElasticGeo+Geoserver发布ES地理数据
  2. Java HttpSession 详解
  3. Java 编程的动态性,第 8 部分: 用代码生成取代反射--转载
  4. 操作系统实验报告6:进程间通信—共享内存
  5. django学习资料网址汇总
  6. 如何诊断ORA-125XX连接问题
  7. 从一本书看经济危机中创业者的机会
  8. 对计算机财务管理的理解,计算机财务管理
  9. 学习索引结构的一些案例——Jeff Dean在SystemML会议上发布的论文(中)
  10. jupyter notebook中创建环境、安装使用pytorch
  11. vue中supermap iserver绘制使用的插件安装
  12. 如何在Mac OS X 10.6.4上卸载Python 2.7?
  13. 牛逼!B 站 up 主开源视频字幕自动翻译神器!
  14. 用PPT给证件换背景或衣服,so easy~
  15. 【爬虫】网页抓包工具--Fiddler--Request和Response
  16. 浏览器-解决火狐浏览器总是提示Adobe Flash更新的问题
  17. 麻雀虽小五脏俱全----ZC评价系统
  18. 华三交换机开机dhcp snooping
  19. redis指定配置文件启动不生效_Windows Redis默认配置文件,Redis配置不生效解决方案...
  20. C# winform 生成APP

热门文章

  1. 最新尚硅谷2018SpringBoot教学视频(内含Docker)
  2. STM8驱动0.96寸OLED(12864液晶屏)
  3. 中英文混合拼音排序(从首字母开始,相同则往下比较)
  4. 非常好的运算放大器基础
  5. NTP的层次stratum
  6. echarts 柱状图数值为0时 显示柱体
  7. OpenCV——图像处理入门:膨胀与腐蚀、图像模糊、边缘检测
  8. 盘点 | CES2023落幕!新能源车、显示技术、AI/元宇宙、芯片…百花齐放百家争鸣中……
  9. [渝粤教育] 重庆城市管理职业学院 脑洞大开背后的创新思维 参考 资料
  10. Python基于YOLOv7和CRNN的车牌分割&识别系统(源码&教程)