链接

http://uoj.ac/problem/198

题解

首先要发现答案要我们求这个式子:

\[ans=min\bigl((x_i-x)^2+c_i\bigr)
\]

显而易见的是这种时空嫁接的关系会形成一棵树。但是我们并不能像\(NOI2014\)购票那样直接在树上维护一条链的栈,因为每个点代表的既有可能是加入一个点,又有可能是删除一个点。

考虑每个点的存在时间都是一些连续区间,所以就可以在欧拉序或者\(dfs\)序上分治了。

至于询问的方式,我们可以先把线段树上的每个节点把凸包维护出来,然后用标记永久化的思想进行查询。

如果空间利用的不当会\(MLE\),可以考虑先用栈做凸包,然后再扔进\(vector\)里做查询用,这样可以省空间。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ls tr[cnt].l
  7. #define rs tr[cnt].r
  8. #define N 500009
  9. #define inf 1e16
  10. using namespace std;
  11. typedef long long ll;
  12. int tot,head[N],num,val[N],n,sta[N<<1],root,dfn[N],_tag[N],m,totp;
  13. ll ans;
  14. ll c[N];
  15. int pos[N];
  16. struct edge{int n,to;}e[N];
  17. inline void add(int u,int v){e[++tot].n=head[u];e[tot].to=v;head[u]=tot;}
  18. struct seg{int l,r;}tr[N<<1];
  19. struct node{
  20. int x;ll y;
  21. inline node operator +(const node &b)const{return node{1ll*x+b.x,y+b.y};}
  22. inline node operator -(const node &b)const{return node{1ll*x-b.x,y-b.y};}
  23. inline ll operator *(const node &b)const{return 1ll*x*b.y-y*b.x;}
  24. inline bool operator <(const node &b)const{if(x!=b.x)return x<b.x;else return y<b.y;}
  25. }st[N];
  26. vector<node>vec[N<<1];
  27. inline ll rd(){
  28. ll x=0;char c=getchar();bool f=0;
  29. while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
  30. while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
  31. return f?-x:x;
  32. }
  33. inline double getk(node x,node y){return (double)(y.y-x.y)/(y.x-x.x);}
  34. void build(int &cnt,int l,int r){
  35. cnt=++totp;
  36. if(l==r)return;
  37. int mid=(l+r)>>1;
  38. build(ls,l,mid);build(rs,mid+1,r);
  39. }
  40. inline void _query(int cnt,ll x){
  41. if(vec[cnt].empty())return;
  42. int l=0,r=vec[cnt].size()-2,now=r+1;
  43. while(l<=r){
  44. int mid=(l+r)>>1;
  45. if(getk(vec[cnt][mid+1],vec[cnt][mid])>=x)now=mid,r=mid-1;
  46. else l=mid+1;
  47. }
  48. ans=min(ans,vec[cnt][now].y-1ll*vec[cnt][now].x*x+x*x);
  49. }
  50. void upd(int cnt,int l,int r,int L,int R,int x){
  51. // if(cnt==1)cout<<x<<" "<<L<<" "<<R<<endl;
  52. if(l>=L&&r<=R){vec[cnt].push_back(node{1ll*pos[x]*2,1ll*pos[x]*pos[x]+c[x]});return;}
  53. int mid=(l+r)>>1;
  54. if(mid>=L)upd(ls,l,mid,L,R,x);
  55. if(mid<R)upd(rs,mid+1,r,L,R,x);
  56. }
  57. void solve(int cnt,int l,int r){
  58. sort(vec[cnt].begin(),vec[cnt].end());
  59. int tp=0;
  60. for(int i=0;i<vec[cnt].size();++i){
  61. node xx=vec[cnt][i];
  62. if(tp&&xx.x==st[tp].x)continue;
  63. while(tp>1&&(xx-st[tp-1])*(st[tp]-st[tp-1])>=0)tp--;
  64. st[++tp]=xx;
  65. }
  66. vec[cnt].clear();
  67. for(int i=1;i<=tp;++i)vec[cnt].push_back(st[i]);
  68. if(l==r)return;
  69. int mid=(l+r)>>1;
  70. solve(tr[cnt].l,l,mid);solve(tr[cnt].r,mid+1,r);
  71. }
  72. void query(int cnt,int l,int r,int x,int y){
  73. _query(cnt,y);
  74. if(l==r)return;
  75. int mid=(l+r)>>1;
  76. if(x<=mid)query(ls,l,mid,x,y);
  77. else query(rs,mid+1,r,x,y);
  78. }
  79. void work(int tim,int now,int tag){
  80. if(tag==1){
  81. if(val[now]>=0)sta[val[now]]=tim;
  82. else upd(root,1,n,sta[-val[now]],tim-1,-val[now]),sta[-val[now]]=0;
  83. }
  84. else{
  85. if(val[now]<0)sta[-val[now]]=tim+1;
  86. else upd(root,1,n,sta[val[now]],tim,val[now]),sta[val[now]]=0;
  87. }
  88. }
  89. void dfs(int u){
  90. dfn[u]=++dfn[0];
  91. work(dfn[0],u,1);
  92. _tag[u]=dfn[0];
  93. for(int i=head[u];i;i=e[i].n)dfs(e[i].to);
  94. work(dfn[0],u,-1);
  95. }
  96. int main(){
  97. //freopen("1.in","r",stdin);
  98. n=rd();m=rd();c[0]=rd();
  99. ll opt,f,id,x,y,z;
  100. for(int i=1;i<n;++i){
  101. opt=rd();f=rd();id=rd();add(f,i);
  102. if(!opt){
  103. pos[id]=rd();y=rd();z=rd();c[id]=rd();
  104. val[i]=id;
  105. }
  106. else val[i]=-id;
  107. }
  108. build(root,1,n);
  109. dfs(0);
  110. for(int i=0;i<=n;++i)
  111. if(sta[i])upd(root,1,n,sta[i],n,i);
  112. solve(root,1,n);
  113. int s;
  114. for(int i=1;i<=m;++i){
  115. s=rd();x=rd();ans=inf;
  116. query(root,1,n,_tag[s],x);
  117. printf("%lld\n",ans);
  118. }
  119. return 0;
  120. }

【CTSC2016】时空旅行的更多相关文章

  1. Luogu P5416 [CTSC2016]时空旅行

    第一次写线段树分治的题目,没想到是道这么毒的题233 首先发现题目里的\((x,y,z,c)\)就是在放屁,只有\((x,c)\)是有用的 因此我们可以把题意转化为,在某一个时间节点上,求出所有元素的 ...

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

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

  3. [CTSC2016]时空旅行

    description 题面 solution 线段树分治+斜率优化毒瘤题 题目可以简化为: 你要维护一个包含元素\((x,c)\)的集合 修改操作为从以前的一个版本更新,修改内容为添加或删除一个元素 ...

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

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

  5. CTSC2016时空旅行

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

  6. @loj - 2987@ 「CTSC2016」时空旅行

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 2045 年,人类的技术突飞猛进,已经找到了进行时空旅行的方法. ...

  7. uoj198【CTSC2016】时空旅行

    传送门:http://uoj.ac/problem/198 [题解] 首先y.z是没有用的.. 然后式子就是w = (x0-xi)^2+ci的最小值,化出来可以变成一个直线的形式. 然后我们可以用线段 ...

  8. 【UOJ #198】【CTSC 2016】时空旅行

    http://uoj.ac/problem/198 (先补一下以前的题解) 这道题5分暴力好写好调,链上部分分可以用可持久化线段树,每次旅行\(x\)值相同的可以用标记永久化线段树.我还听到某些神犇说 ...

  9. [UOJ198]时空旅行

    看懂题目就知道$y,z$是没用的,这题相当于是给一堆$(x_i,c_i)$和询问$x_q$,要求$(x_q-x_i)^2+c_i$的最大值 先把这个式子拆开:$-2x_ix_q+x_i^2+c_i+x ...

随机推荐

  1. 编程心法 之什么是MVP What is MVP development?

    Minimal Value product(feather), 比如说,如果是一个新的Photoshop,那么增加图片亮度就是一个MVP. 想要看到更多玮哥的学习笔记.考试复习资料.面试准备资料?想要 ...

  2. Java 单例(Singleton)模式

    一.什么是单例模式: 单例模式是一种确保了一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.被实例化的类称为单例类. 二.单例模式的特点: 单例类只有一个实例. 单例类必须自行创建自己唯一的 ...

  3. CSS3制作上下跳动动画箭头效果

    动画效果如下: 代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...

  4. (四) Keras Dropout和正则化的使用

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 使用drop ...

  5. HTML5 新增的 input 事件

    以往 HTML 的 input 輸入框,無法即時反映使用者的輸入內容.onkeyup.onkeydown 事件,無法即時.精確地取得使用者的輸入資料:而 onchange.onblur 事件,要等到失 ...

  6. 微信小程序推广技巧、营销方案

    小程序已经成功上线了!那么,小程序线下如何推广?线下门店如何玩转小程序呢? 1.附近的小程序,让商家曝光率更高 小 程序自带“附近的小程序”功能,利用LBS定位功能提高商家专属微信小程序的曝光度,用户 ...

  7. (办公)springboot配置全局异常

    项目用到了springboot,本来很高兴,但是项目里什么东西都没有,验证,全局异常这些都需要自己区配置.最近springboot用的还是蛮多的,我还是做事情,把经验发表一下.全局统一的异常,首先异常 ...

  8. linux安装windows启动盘

    安装gparted

  9. Java 控制结构与方法

    控制结构: 控制结构是对我们程序执行顺序的一种控制,它规定了我们语句块的执行顺序和流程. 分支结构: 关系运算符和逻辑运算符: 关系运算符:== != > >= < <=逻辑运 ...

  10. 配置SSH(GNS3)

    实验拓扑: -------------------------------------------配置IP过程不多啰嗦了 1.SSH配置过程 这里是用GSN3模拟器做的 --------------- ...