应该是比较套路的,但是要A掉仍然不容易。

下面理一下思路,思路清楚了也就不难写出来了。

0.显然y,z坐标是搞笑的,忽略即可。

1.如果x不变,那么直接set即可解决。

2.考虑一个空间和询问x0,通过化式子发现实际上就是:把每个星球看成一个一次函数,其实是在询问这个空间内的所有一次函数在x0处的最小值。

3.这个显然是一个凸包,所以我们需要对每个空间维护一个凸包,由空间整体呈树状,可以想到用DFS序+线段树维护区间。

4.预处理出每个星球的存在范围,在线段树上永久化标记。查询时依次递归求最小值。

5.关于线段树上如何存凸包,可以先扫一遍预留出空间,也可以直接像http://www.cnblogs.com/HocRiser/p/8549456.html一样用vector存,后者可能会慢一点,开了读入外挂就过了。

 #include<cstdio>
#include<vector>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
const ll inf=1000000000000000000ll;
int n,m,cnt,x,y,c,tim,op,fr,d,id[N],L[N],R[N],X[N],K[N];
int h[N],nxt[N],pos[N],to[N],st[N<<],ed[N<<],q[N];
ll a[N],b[N],ans[N];
vector<int>T[N<<],V[N]; ll rd(){
ll x=; bool t=; char ch=getchar();
while (ch<'' || ch>'') t|=(ch=='-'),ch=getchar();
while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
if (t) return -x; else return x;
} bool cmp0(int x,int y){ return L[x]<L[y]; }
bool cmp1(int x,int y){ return a[x]>a[y] || (a[x]==a[y] && b[x]>b[y]); }
bool cmp2(int a,int b){ return X[a]<X[b]; }
bool Cmp(int x,int y,int z){ return ((b[y]-b[x])*(a[y]-a[z])>=(b[z]-b[y])*(a[x]-a[y])); } void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void dfs(int x){ L[x]=++tim; for (int i=h[x]; i; i=nxt[i]) dfs(to[i]); R[x]=tim; } void build(int x,int L,int R){
ed[x]=-;
if (L==R) { pos[L]=x; return; }
int mid=(L+R)>>; build(lson); build(rson);
} void ins(int x,int L,int R,int l,int r,int k){
if (L==l && r==R){
int &j=ed[x];
for (; st[x]<j && Cmp(T[x][j-],T[x][j],k); j--,T[x].pop_back());
j++; T[x].push_back(k);
return;
}
int mid=(L+R)>>;
if (r<=mid) ins(lson,l,r,k);
else if (l>mid) ins(rson,l,r,k);
else ins(lson,l,mid,k),ins(rson,mid+,r,k);
} ll que(int k,int x){
ll ans=inf;
for (int i=pos[k]; i; i>>=){
int &j=st[i];
for (; j<ed[i] && (a[T[i][j]]-a[T[i][j+]])*x>=b[T[i][j+]]-b[T[i][j]]; j++);
if (j<=ed[i]) ans=min(ans,a[T[i][j]]*x+b[T[i][j]]);
}
return ans;
} int main(){
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
n=rd(); m=rd(); b[]=rd(); id[]=;
rep(i,,n){
op=rd(); fr=rd()+; d=rd()+; add(fr,i);
if (op) V[d].push_back(i);
else id[d]=i,x=rd(),rd(),rd(),c=rd(),a[d]=-2ll*x,b[d]=1ll*x*x+c;
}
dfs(); build(,,n);
rep(i,,n) q[i]=i; sort(q+,q+n+,cmp1);
rep(l,,n) if (id[q[l]]){
int i=q[l];
sort(V[i].begin(),V[i].end(),cmp0); int k=L[id[i]];
for (vector<int>::iterator it=V[i].begin(); it!=V[i].end(); k=R[*it]+,it++)
if (k<L[*it]) ins(,,n,k,L[*it]-,i);
if (k<=R[id[i]]) ins(,,n,k,R[id[i]],i);
}
rep(i,,m) q[i]=i,x=rd(),y=rd(),K[i]=L[x+],X[i]=y;
sort(q+,q+m+,cmp2);
rep(i,,m) ans[q[i]]=que(K[q[i]],X[q[i]])+1ll*X[q[i]]*X[q[i]];
rep(i,,m) printf("%lld\n",ans[i]);
return ;
}

最新文章

  1. iOS: 为画板App增加 Undo/Redo(撤销/重做)操作
  2. MyBatis学习教程
  3. Day24_多线程第一天
  4. roundup配置
  5. Qt 5.7 版本+2013VS环境配置
  6. javaWeb开发模式
  7. Select的深入应用(2)
  8. #include &lt;hash_set&gt;
  9. java里程碑之泛型--使用泛型
  10. vs2010 sp1 安装Silverlight5 语言版本不匹配的问题
  11. vue 在safari动态多级面包屑导航样式不刷新的bug
  12. Beta(1/7)
  13. kubenetes master重启以后,服务异常排查
  14. python学习日记(python2/3区别补充,is / id/ encode str,bytes)
  15. CUDA ---- Warp解析
  16. 解题(StringJiaMi--字符串加密)
  17. [原创]SpotLight性能监控工具使用介绍
  18. 用Redis实现分布式锁 与 实现任务队列【转载】
  19. tikz中谐振子(弹簧)的绘制,以及声子色散关系的绘制
  20. Python之路【第四篇】: 函数、递归、内置函数

热门文章

  1. python 学习分享-实战篇类 Fabric 主机管理程序开发
  2. ehcache + spring 整合以及配置说明 ,附带整合问题 (已解决)
  3. win10下乌龟git安装和使用
  4. 电信学院第一届新生程序设计竞赛题解及std
  5. 二分查找树按照key值划分
  6. HTTP 返回状态代码详细解释
  7. 使用Unity 实现ASP.NET Web API 依赖注入
  8. 发现JDK的3个bug
  9. 如何设置两个AD域控制器
  10. 《R语言实战》读书笔记--第五章 高级数据管理