一个空集,有 n(≤30w) n(≤30w)个操作:
1)集合加入对 (a,b)(−109≤a,b≤109) (a,b)(-10^9≤a,b≤10^9)
2)移除 ith i_{th}操作加入的对
3)给出 q(−109≤q≤109) q(-10^9≤q≤10^9),对于集合中所有的(x,y),求x·q+y的最大值。
PS:这里的集合应该允许同一元素出现多次,或者加入时间也包含在元素的信息中。
分治+凸壳
PS:有对 HDU 5390 tree 的线段树的一点改进。

#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <bitset>
#include <cassert>
#include <cstring>
#include <complex>
#include <iostream>
#include <algorithm>
#define pi acos(-1)
#define inf (1<<30)
#define INF (1ll<<62)
#define y1 bflaisfnmasf
#define y2 fsafgmalg
#define tm afnsjkf
#define j1 sfakf
#define j2 fasndfkas
#define fi first
#define se second
#define CLR(x,f) memset(x,f,sizeof(x))
#define CPY(x,y) memcpy(x,y,sizeof(x))
#define prt(x) cout<<#x<<":"<<x<<" "
#define prtn(x) cout<<#x<<":"<<x<<endl
#define huh(x) printf("--------case(%d)--------\n",x)
#define travel(x) for(Edge *e=h[x];e;e=e->n)
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int M=3e5+4;template<class T>
void Max(T &x,T y){if(x<y)x=y;
}//nice!typedef long long ll;
typedef double doub;
struct Point{ll x,y;bool operator<(const Point &a)const{return x==a.x?y<a.y:x<a.x;}Point operator-(const Point &a)const{return (Point){x-a.x,y-a.y};}ll operator*(const Point &a)const{return x*a.x+a.y*y;}ll operator^(const Point &a)const{return x*a.y-a.x*y;}//cross(a,b)?
}po[M],s[M],g[M];
struct Pt{int l,r;Point p;
}p[M];
struct Qr{int t;ll x;
}q[M];
int conpoly(int n){int w=0;sort(s+1,s+n+1);for(int i=1;i<=n;i++){while(w>1&&(s[w]-s[w-1]^s[i]-s[w-1])>=0)w--;s[++w]=s[i];}return w;
}//仅保留凸包
void calc(int n){for(int i=1;i<n;i++){g[i]=s[i+1]-s[i];g[i].y=-g[i].y;}
}
bool cmp(Point a,Point b){return a.y*b.x<b.y*a.x;
}
ll query(ll x,int n){if(n==1)return x*s[1].x+s[1].y;int p=lower_bound(g+1,g+n,(Point){1,x},cmp)-g;ll res=-INF;for(int i=-1;i<=1;i++)if(p+i>0&&p+i<=n)Max(res,x*s[p+i].x+s[p+i].y);//nice!//  ll tmp=-INF;
//  for(int i=1;i<=n;i++)
//      Max(tmp,x*s[i].x+s[i].y);
//  assert(tmp==res);return res;
}
ll ans[M];
void solve(int n,int m,int l,int r){if(!n||!m||l>r)return;int w=0;for(int i=0;i<n;i++)if(p[i].l<=l&&r<=p[i].r)s[++w]=p[i].p;if(w>0){w=conpoly(w);calc(w);for(int i=0;i<m;i++)Max(ans[q[i].t],query(q[i].x,w));}if(l==r)return;int mid=l+r>>1,w0,w1;w0=w1=0;for(int i=0;i<n;i++)if(p[i].l<=mid&&!(p[i].l<=l&&r<=p[i].r))swap(p[w0++],p[i]);for(int i=0;i<m;i++)if(q[i].t<=mid)swap(q[w1++],q[i]);solve(w0,w1,l,mid);w0=w1=0;for(int i=0;i<n;i++)if(p[i].r>mid&&!(p[i].l<=l&&r<=p[i].r))swap(p[w0++],p[i]);for(int i=0;i<m;i++)if(q[i].t>mid)swap(q[w1++],q[i]);solve(w0,w1,mid+1,r);
}
int en[M],type[M];
int main(){int n;scanf("%d",&n);int w1,w2;w1=w2=0;for(int u,v,i=0;i<n;i++){scanf("%d",&type[i]);//1)Add a pair (a,b) to the set.//2)Remove a pair added in the query number i. All queries are numbered with integers from 1 to n.//3)For a given integer q find the maximal value x·q?+?y over all pairs (x,y) from the set.switch(type[i]){case 1:scanf("%d%d",&u,&v);po[i]=(Point){u,v};en[i]=n-1;break;case 2:scanf("%d",&u);en[u-1]=i;break;case 3:scanf("%d",&u);q[w2++]=(Qr){i,u};ans[i]=-INF;break;default:break;//}}for(int i=0;i<n;i++)if(type[i]==1)p[w1++]=(Pt){i,en[i],po[i]};solve(w1,w2,0,n-1);for(int i=0;i<n;i++){if(type[i]==3){if(ans[i]==-INF)puts("EMPTY SET");else printf("%I64d\n",ans[i]);}}return 0;
}

CF 678F Lena and Queries相关推荐

  1. CF 375D. Tree and Queries加强版!!!【dfs序分块 大小分类讨论】

    传送门 题意: 一棵树,询问一个子树内出现次数$\ge k$的颜色有几种,Candy?这个沙茶自带强制在线 吐槽: 本来一道可以离散的莫队我非要强制在线用分块做:上午就开始写了然后发现思路错了...: ...

  2. 2016区域赛前冲刺训练

    UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...

  3. Cassandra客户端连接的说明---PHP版

    这次一起来看看基于PHP的一些连接Cassandra的实现(higher level libaries) 目前已知的有: 1) phpcassa https://github.com/thobbs/p ...

  4. cf Educational Codeforces Round 134 E. Prefix Function Queries

    原题: You are given a string s, consisting of lowercase Latin letters. You are asked q queries about i ...

  5. CF - 797E. Array Queries - dp+有选择地暴力

    题目描述: E. Array Queries time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. 主席树 ---- CF 1422F. Boring Queries(由离线推出在线如何求的 ,求解多次询问的区间LCM)

    题目链接 题目大意: 给你nnn个数, 每次往第iii个数里面里面乘aaa,问你这nnn个数的LCM\text{LCM}LCM是多少? 解题思路: 多个数的lcm不是所有数的乘积除以所有数的gcd,如 ...

  7. CF Educational Round 23 F.MEX Queries

    写了3小时 = =.这两天堕落了,昨天也刷了一晚上hihocoder比赛,还爆了零.之后得节制点了,好好准备考研.. 首先很容易想到 压缩数据 + 线段树 然后对于Pushdown真很难写..需要牵涉 ...

  8. CF 1093G Multidimensional Queries——线段树(消去绝对值符号)

    题目:http://codeforces.com/contest/1093/problem/G 只好看看题解:https://codeforces.com/blog/entry/63877 主要是把绝 ...

  9. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

最新文章

  1. 阿里p7程序员哀叹:35岁,被通知合同不再续签,输出社会,怎么办?
  2. 设置计算机在睡眠状态下能共享,使用wifi共享精灵的过程中电脑会自动休眠锁屏的解决方法...
  3. jq 直接调用php文件_js调用php和php调用js的方法举例
  4. C语言返回文件大小的功能(fseek和ftell的使用)
  5. openjudge 二叉树 2756
  6. Java 动态代理 Demo
  7. 【刷题】BZOJ 4503 两个串
  8. CH341A BIOS编程器 预安装成功 但无安装成功
  9. nvidia 卸载驱动
  10. 电脑变卡,电脑一直很流畅一夜之间变卡
  11. 主分区和逻辑分区的区别
  12. Ubuntu nautilus 快速打开文件浏览器
  13. AUTOCAD——复制命令、镜像命令
  14. 破壳而出的琉璃之鸟汉化 QA
  15. 解决连接ORACLE错误:ORA-01033: ORACLE 正在初始化或关闭
  16. Posix 接口笔记
  17. PostGIS中的常用函数
  18. Hive 史上最全面的大数据学习第九篇(五) Hive 自定义函数 每一天都是美好的一天!
  19. redis 3.0.7 cluster 集群部署
  20. 安装包UI美化之路-在线安装包

热门文章

  1. php文字添加投影,视频加动态标题文字 视频标题文字添加阴影边框 给视频加上炫酷的文字标题...
  2. 用对这30种秘密武器, 你也能成为区块链高手!
  3. 如何提交form表单嵌套(提交表单外的数据方法 )
  4. 监控摄像头清晰度(分辨率)介绍
  5. 详细分析:摄像头像素为何不是越高越好
  6. 安装 ubuntu 18.04登录界面卡死解决
  7. Adobe XMP SDK编译
  8. ArrayDeque集合的妙用
  9. 安装从GitHub下载的包
  10. ubuntu命令行启动浏览器_linux命令行下使用linux打开浏览器命令