应该是比较套路的,但是要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 ;
}

[CTSC2016]时空旅行(线段树+凸包)的更多相关文章

  1. Luogu P5416 [CTSC2016]时空旅行

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

  2. BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )

    s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/ ...

  3. 【BZOJ2402】陶陶的难题II 分数规划+树链剖分+线段树+凸包

    题解: 首先分数规划是很明显的 然后在于我们如何要快速要求yi-mid*xi的最值 这个是看了题解之后才知道的 这个是斜率的一个基本方法 我们设y=mid*x+z 那么显然我们可以把(x,y)插入到一 ...

  4. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  5. [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]

    题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...

  6. BZOJ3533 [Sdoi2014]向量集 【线段树 + 凸包 + 三分】

    题目链接 BZOJ3533 题解 我们设询问的向量为\((x_0,y_0)\),参与乘积的向量为\((x,y)\) 则有 \[ \begin{aligned} ans &= x_0x + y_ ...

  7. bzoj 4311 向量 时间线建线段树+凸包+三分

    题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致 ...

  8. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

  9. BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)

    题目大意:略 一定范围内求最大值,考虑二分答案 设现在选择的答案是$mid$,$max \left \{ \frac{yi+qj}{xi+pj} \right \} \geq mid $ 展开可得,$ ...

随机推荐

  1. WIN10把照片查看器设为默认看图软件

    WIN10默认是PHOTO,没有以前WIN7的照片查看器好用,要改回来的方法如下:   在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo ...

  2. sentry

    https://docs.sentry.io/quickstart/?platform=javascript

  3. win10系统安装之GHOST还原(转+编辑)

    注意*:在以下操作中,你可能需要分区你的原来系统盘,如果是重装的话.现在我们使用SSD固态做系统盘盘,这个分区的话,点选mbr重新引导,以及对齐复选框. 如果前面过程都没问题,在安装过程中出现    ...

  4. leetcode_day03

    https://leetcode-cn.com/problems/container-with-most-water/ 题目:盛水最多的容器 给定 n 个非负整数 a1,a2,...,an,每个数代表 ...

  5. nyoj 题目49 开心的小明

    开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天 ...

  6. Javascript 基础总结

    一.预处理 console.log(global); // undefined var global = 'global'; console.log(global); // global functi ...

  7. NetScaler的cookieinsert和sourceip联合保持机制

    NetScaler的cookieinsert和sourceip联合保持机制 使用NetScaler的cookieinsert和sourceip联合进行session保持机制即主用cookieinser ...

  8. RocketMQ 源码分析 RouteInfoManager(四)

    在上一章分析了NamesrvController的构造函数时,会生成一个RouteInfoManager对象,该对象存放着整个消息集群的相关消息,所以这里单独拿出来分析.其实试想一下namesrv的功 ...

  9. POJ 3243 Clever Y | BSGS算法完全版

    题目: 给你A,B,K 求最小的x满足Ax=B (mod K) 题解: 如果A,C互质请参考上一篇博客 将 Ax≡B(mod C) 看作是Ax+Cy=B方便叙述与处理. 我们将方程一直除去A,C的最大 ...

  10. 刷题总结——Throw nails(hdu4393)

    题目: Problem Description The annual school bicycle contest started. ZL is a student in this school. H ...