[Educational Round 13][Codeforces 678F. Lena and Queries]
题目大意:要求对一个点集实现二维点对的插入,删除,以及询问\(q\):求\(max(x\cdot q+y)\)
题解:对每个点集内的点\(P(x_0,y_0)\),作过点\(P\)且斜率为\(-q\)的直线\(l\),则有\(l:y-y_0=-q(x-x_0)\),可以发现当\(x=0\)时,有\(y=q\cdot x_0+y_0\)。因此只要找到一个点,使得过此点作斜率为\(-q\)的直线在\(y\)轴上的截距最大即可。可以发现满足条件的点一定在一个上凸壳上,所以可以用三分来解决问题
但由于需要处理点的插入和删除操作,直接在线求解比较麻烦,所以考虑离线处理询问
因此我们只要记录每一个点的存在时间段,对时间建线段树,对线段树上的每一个节点暴力求出答案即可。由于每一个插入的点只会影响到\(log\ n\)个节点,所以总复杂度是\(O(nlog^2n)\)的
#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define LL long long
struct Point
{
LL x,y;
Point operator -(const Point &t)const{return{x-t.x,y-t.y};}
LL operator *(const Point &t)const{return x*t.y-y*t.x;}
bool operator <(const Point &t)const{return x==t.x?y<t.y:x<t.x;}
}st[N];
LL n,cnt,o[N],q[N],f[N],c[N],r[N],x[N],y[N];
struct Segment_Tree
{
struct rua
{
LL l,r;
set<Point>s;
}t[N<<];
void Build(LL l,LL r,LL x)
{
t[x].l=l,t[x].r=r;
if(l==r)return;
LL mid=l+r>>;
Build(l,mid,x*);
Build(mid+,r,x*+);
}
void change(LL L,LL R,Point p,LL x)
{
LL l=t[x].l,r=t[x].r;
LL mid=l+r>>;
if(L<=l && r<=R){t[x].s.insert(p);return;}
if(L<=mid)change(L,R,p,x*);
if(mid<R)change(L,R,p,x*+);
}
void ask(LL x)
{
LL l=,r=cnt;
while(l+<r)
{
LL mid1=(*l+r)/;
LL mid2=(l+*r)/;
if(q[x]*st[mid1].x+st[mid1].y<q[x]*st[mid2].x+st[mid2].y)l=mid1;
else r=mid2;
}
for(LL i=l;i<=r;i++)f[x]=max(f[x],q[x]*st[i].x+st[i].y);
}
void get(LL x)
{
if(t[x].l<t[x].r)
{
get(x*);
get(x*+);
}
cnt=;
for(auto p:t[x].s)
{
while(cnt> && (st[cnt]-st[cnt-])*(p-st[cnt])>=)cnt--;
st[++cnt]=p;
}
for(LL i=t[x].l;i<=t[x].r;i++)
if(o[i]== && c[i])ask(i);
}
}T;
int main()
{
scanf("%I64d",&n);
T.Build(,n,);
for(LL i=;i<=n;i++)
{
scanf("%I64d",&o[i]);
if(o[i]==)
{
scanf("%I64d%I64d",&x[i],&y[i]);
r[i]=n,cnt++;
}
if(o[i]==)
{
scanf("%I64d",&q[i]);
r[q[i]]=i,cnt--;
}
if(o[i]==)
{
scanf("%I64d",&q[i]),f[i]=-(5e18);
}
c[i]=cnt;
}
for(LL i=;i<=n;i++)
if(o[i]==)T.change(i,r[i],{x[i],y[i]},);
T.get();
for(LL i=;i<=n;i++)
if(o[i]==)
if(c[i])printf("%I64d\n",f[i]);
else printf("EMPTY SET\n");
}
[Educational Round 13][Codeforces 678F. Lena and Queries]的更多相关文章
- [CodeForces - 678F] Lena and Queries 线段树维护凸包
大致题意: 给出三种操作 1.往平面点集中添加一个点 2.删除第i次添加的点 3.给出一个q,询问平面点集中的q*x+y的最大值 首先对于每个询问,可将z=q*x+y转化为y=z-q*x,即过点(x, ...
- Codeforces 678F Lena and Queries
题意: 你有一个点集,有三种操作: 往集合里插入一个点\((x, y)\) 从集合中删除第\(i\)次操作插入的点 对于给出的\(q\),询问点集中\(x \cdot q + y\)的最大值 分析: ...
- [Educational Round 5][Codeforces 616F. Expensive Strings]
这题调得我心疲力竭...Educational Round 5就过一段时间再发了_(:з」∠)_ 先后找了三份AC代码对拍,结果有两份都会在某些数据上出点问题...这场的数据有点水啊_(:з」∠)_[ ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- [Educational Round 3][Codeforces 609F. Frogs and mosquitoes]
这题拖了快一周_(:з」∠)_就把这货单独拿出来溜溜吧~ 本文归属:Educational Codeforces Round 3 题目链接:609F - Frogs and mosquitoes 题目 ...
- [Educational Round 17][Codeforces 762F. Tree nesting]
题目连接:678F - Lena and Queries 题目大意:给出两个树\(S,T\),问\(S\)中有多少连通子图与\(T\)同构.\(|S|\leq 1000,|T|\leq 12\) 题解 ...
- [Educational Round 10][Codeforces 652F. Ants on a Circle]
题目连接:652F - Ants on a Circle 题目大意:\(n\)个蚂蚁在一个大小为\(m\)的圆上,每个蚂蚁有他的初始位置及初始面向,每个单位时间蚂蚁会朝着当前面向移动一个单位长度,在遇 ...
- [Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]
咸鱼了好久...出来冒个泡_(:з」∠)_ 题目连接:1107G - Vasya and Maximum Profit 题目大意:给出\(n,a\)以及长度为\(n\)的数组\(c_i\)和长度为\( ...
- Codeforces Beta Round #13 C. Sequence (DP)
题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...
随机推荐
- JVM中的方法分派
解析调用是一个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用,不会延迟到运行期再去完成.而分派调用则可能是静态的也可能是动态的,根据分派依据的宗量数 ...
- JustSoso笔记
当时想了大半天,想着到底要怎么绕过MD5呢,结果还是没做出来,即使问了学长,自己还是漏了一个步骤,file=hint.php,特此笔记,又学到了个引用变量的知识 学习自 https://www.ctf ...
- LeetCode.接雨水
题外话:LeetCode上一个测试用例总是通不过(我在文章末贴出通不过的测试用例),给的原因是超出运行时间,我拿那个测试用例试了下2.037ms运行完.我自己强行给加了这句: && m ...
- python正则表达式--match search方法
1.re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None. (1)函数语法: re.match(pattern, st ...
- JQuery插件:ScrollTo平滑滚动到页面指定位置
1.准备jQuery库和scrollTo.js插件. <script type="text/javascript" src="js/jquery.js"& ...
- php 获取用户的IP、地址、来源
js方法获取用户的 ip 和 地址 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> ...
- linux 笔记整理
1.常使用的进程管理命令 ps 显示显示主动的进程 . top 显示所用运行的进程 . 关闭进程 kill [pro Number ] . 关闭名为H的所有进程 killa ...
- bzoj 3697
题目描述:这里 发现还是点对之间的问题,于是还是上点分 只不过是怎么做的问题 首先对每条边边权给成1和-1(即把原来边权为0的边边权改为-1),那么合法的路径总权值一定为0! 还是将路径分为经过当前根 ...
- struts2-第二章-拦截器
一,回顾 (1)默认action,404问题;<default-action-ref name="action 名称"/> (2)模块化,package,struts. ...
- C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...