当时看这道题AC的人数比较多,就开了这道题。

很容易发现是这是一个有关凸包的题。

然后不知道怎么维护凸包,一直在想cdq,感觉复杂度不行,于是被这玩意难住了……

幸好有亲学长yyh造福人类的题解:https://blog.csdn.net/qwsin/article/details/70884985,十分详细,而且相对容易看懂些,脑回路跟我差不多。

发现主要是我没学线段树标记永久化,所以去学了一下这个东西:https://www.cnblogs.com/Hallmeow/p/8004676.html

大概就是,为了懒得pushdown,就做一个标记,每次询问的时候,拿到这个标记,就直接更新答案……

应用到这道题上,我们发现所有询问都是单点询问,就是说会每次都会走到线段树的最底层。

这样就有个好处:我们往线段树的一段区间的凸包加一个点时,只有走到线段树上被区间完全包含的点的时候,在这里的凸包上加点,然后return

中途没被修改区间完全覆盖的线段树上的地方,就不用在凸包上加点。

然后这道题的主要特点是,用了很多排序,让凸包的优秀性质,最大得发挥。

具体参考学长yyh的题解

bz上又卡常,我是真的卡不过去,yyh的代码也要T……

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=5e5+7;
const ll INF=1e18+7;
ll n,m,c0,ans[maxn];//don't forget the earth char cc; ll ff;
template<typename T>void read(T& aa) {
aa=0;cc=getchar();ff=1;
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} int fir[maxn],nxt[maxn],to[maxn],e=0;
void add(int x,int y) {
// printf("add:%d->%d\n",x,y);
to[++e]=y;nxt[e]=fir[x];fir[x]=e;
} int dfn[maxn],end[maxn],dfn_clock=-1;
void dfs(int pos) {
dfn[pos]=++dfn_clock;
for(int y=fir[pos];y;y=nxt[y]) dfs(to[y]);
end[pos]=dfn_clock;
} struct Plt{
ll id,x,y,pos;
Plt(){}
Plt(ll id,ll x,ll y,ll pos):id(id),x(x),y(y),pos(pos){}
bool operator < (const Plt& b) const{return x==b.x? y>b.y:x<b.x;}
}plt[maxn];
vector<int>del[maxn];
bool cmp(const int a,const int b) {return dfn[a]<dfn[b];}
int totp; struct Ask{
ll qid,pos,k,x;
Ask(){}
Ask(ll qid,ll pos,ll k,ll x):qid(qid),pos(pos),k(k),x(x){}
bool operator < (const Ask& b) const{return k>b.k;}
}ask[maxn]; struct Node{
ll x,y;
Node(){}
Node(ll x,ll y):x(x),y(y){}
}o,D; struct Seg{
int p;//current pos on convex hull
vector<Node> G;
Seg(){G.clear();p=0;}
void push(Node x) {G.push_back(x);}
void pop() {G.pop_back();}
}seg[4*maxn];
ll ql,qr,qa,qb; ll get_ans(ll k,ll b,Node s) {return k*s.x+s.y+b;} void get_push(int pos) {
ll X1,Y1,X2,Y2,r=seg[pos].G.size();
while(r&&seg[pos].G[r-1].x==o.x) seg[pos].pop(),r--;
while(r>=2) {
X1=seg[pos].G[r-1].x-seg[pos].G[r-2].x;
Y1=seg[pos].G[r-1].y-seg[pos].G[r-2].y;
X2=o.x-seg[pos].G[r-2].x;
Y2=o.y-seg[pos].G[r-2].y;
if((db)Y1/X1<(db)Y2/X2) break;
seg[pos].pop(); r--;
}
seg[pos].push(o);
} void chge(int pos,int l,int r) {
if(l>=ql&&r<=qr) {
get_push(pos);
return;
}
int mid=(l+r)>>1;
if(ql<=mid) chge(pos<<1,l,mid);
if(qr>mid) chge(pos<<1|1,mid+1,r);
} void get_insert(int i) {
int x=plt[i].id,ld=dfn[plt[i].pos],rd=end[plt[i].pos];
o=Node(plt[i].x,plt[i].y);
sort(del[x].begin(),del[x].end(),cmp);
int N=del[x].size()-1;
For(i,0,N) {
if(ld<dfn[del[x][i]]) {
ql=ld; qr=min(rd,dfn[del[x][i]]-1);
chge(1,1,n);
}
ld=max(ld,end[del[x][i]]+1);
if(ld>rd) break;
}
if(ld<=rd) {ql=ld; qr=rd; chge(1,1,n);}
} #define np seg[pos].p ll ud_ans(int pos) {
if(!seg[pos].G.size()) return INF;
ll rs=get_ans(qa,qb,seg[pos].G[np]),now,N=seg[pos].G.size();
while(np+1<N) {
now=get_ans(qa,qb,seg[pos].G[np+1]);
if(now>=rs) break;
rs=now; np++;
}
return rs;
} ll q(int pos,int l,int r) {
ll rs=ud_ans(pos);
if(l==r) return rs;
int mid=(l+r)>>1;
if(ql<=mid) rs=min(rs,q(pos<<1,l,mid));
if(qr>mid) rs=min(rs,q(pos<<1|1,mid+1,r));
return rs;
} int main() {
read(n); read(m); read(c0);
D=Node(0,c0);
ll op,id,x,y,z,c,f;
For(i,1,n-1) {
read(op); read(f); read(id); add(f,i);
if(!op) {
read(x); read(y); read(z); read(c);
plt[++totp]=Plt(id,x,x*x+c,i);
}
else del[id].push_back(i);
}
dfs(0);
sort(plt+1,plt+totp+1);
For(i,1,totp) get_insert(i);
For(i,1,m) {
read(id); read(x);
ask[i]=Ask(i,dfn[id],-2*x,x*x);
ans[i]=get_ans(-2*x,x*x,D);
}
sort(ask+1,ask+m+1);
For(i,1,m) {
ql=qr=ask[i].pos; qa=ask[i].k; qb=ask[i].x;
if(ql) ans[ask[i].qid]=min(ans[ask[i].qid],q(1,1,n));
}
For(i,1,m) printf("%lld\n",ans[i]);
return 0;
}

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. @loj - 2987@ 「CTSC2016」时空旅行

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

  6. 【CTSC2016】时空旅行

    链接 http://uoj.ac/problem/198 题解 首先要发现答案要我们求这个式子: \[ ans=min\bigl((x_i-x)^2+c_i\bigr) \] 显而易见的是这种时空嫁接 ...

  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. python 中动态类的创建

    参考 collections.namedtuple 的实现 链接: https://www.cnblogs.com/BeautifulWorld/p/11647198.html

  2. Spring cloud config client获取不到配置中心的配置

    Spring cloud client在配置的时候,配置文件要用 bootstrap.properties 贴几个说明的链接.但是觉得说的依然不够详细,得空详查. 链接1 链接2 链接3 原文地址:h ...

  3. HtmlHelper1

    <div> @using(Html.BeginForm("Test","Default")) { 4 @Html.TextBox("nam ...

  4. 从0开始学习ssh之搭建环境

    ssh即struts+spring+Hibernate,从头开始学习这个框架. struts环境配置,首先在apps目录下找到struts2-blank-xxx.war这个文件,这是已经发布好的war ...

  5. Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归: class Solution { public: vector<int> res; ve ...

  6. 学习Python:StringIO与cStringIO

    StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO.一个简单的例子,让你对StringIO有一个感性的认识: f ...

  7. [编织消息框架][netty源码分析]5 EventLoopGroup 实现类NioEventLoopGroup职责与实现

    分析NioEventLoopGroup最主有两个疑问 1.next work如何分配NioEventLoop 2.boss group 与child group 是如何协作运行的 从EventLoop ...

  8. Elasticsearch系列(一)--入门

    Elasticsearch基于Lucene构建的开源搜索引擎,Java编写,提供restful API,支持横向拓展,能够完成海量数据处理. 应用场景: 1.海量数据分析引擎 2.站内搜索引擎 3.数 ...

  9. [转]iMPACT Spartan-6 FPGA - "WARNING:iMPACT:2217-Error shows in the status register, CRC Error bit is Not 0"

    AR# 45304 iMPACT Spartan-6 FPGA - "WARNING:iMPACT:2217-Error shows in the status register, CRC ...

  10. 最全的CSS hack没有之一

    1.何为HACK? 简单的说,HACK就是只有特定浏览器才能识别这段hack代码.Hack也可以说是让前端最为头疼的问题,因为要写N多种兼容代码.当然,IE是最让人蛋疼的. 一般来说,CSS HACK ...