LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)
莫队。发现只需要维护前驱后继就可以了。
但是加入一个点需要找到它当前的前驱后继,很麻烦还带个\(\log\)。
但是如果只有删除某个点,只需要更新一下它的前驱后继即可。
用回滚莫队就好惹。
撤销,即重新加入点时,按顺序把每个点的前驱后继改回来即可。
不需要求斜率=-=
atan2(y,x):返回点\((x,y)\)与\(x\)轴正半轴的夹角。
//6527ms	8292K
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=150005;
int bel[N],L[N],R[N],A[N];
LL Now,Ans[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Quries
{
	int l,r,id;
	bool operator <(const Quries &x)const
	{
		return bel[l]==bel[x.l]?r>x.r:l<x.l;
	}
}q[N];
struct Vec
{
	int x,y; double k;
	Vec(int y=0,int x=0):x(x),y(y) {k=atan2(y,x);}//x,y读反了调半小时=-=
	LL operator *(const Vec &a)const {return 1ll*x*a.y-1ll*y*a.x;}
}p[N];
typedef Vec Point;
inline int read()
{
	int now=0,f=1;register char c=gc();
	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
	for(;isdigit(c);now=now*10+c-48,c=gc());
	return now*f;
}
inline bool cmp(int a,int b)
{
	return p[a].k<p[b].k;
}
void Add(int x)
{
	int l=L[x],r=R[x];
	R[l]=x, L[r]=x;
}
void Delete(int x)
{
	int l=L[x],r=R[x];
	Now+=p[l]*p[r]-p[l]*p[x]-p[x]*p[r], R[l]=r, L[r]=l;
}
int main()
{
	const int n=read(),Q=read(),size=sqrt(n);
	for(int i=1; i<=n; ++i) p[i]=Point(read(),read()),bel[i]=(i-1)/size+1,A[i]=i;
	std::sort(A+1,A+1+n,cmp);
	for(int i=1; i<=Q; ++i) q[i]=(Quries){read(),read(),i};
	std::sort(q+1,q+1+Q);
	for(int i=1,now=1; i<=bel[n]&&now<=Q; ++i)
	{
		if(bel[q[now].l]!=i) continue;
		int Ln=(i-1)*size+1,l=Ln,r=n,las=0,beg=0;
		Now=0;
		for(int j=1,pos; j<=n; ++j)
			if(A[j]>=Ln)
			{
				pos=A[j];
				if(las) Now+=p[las]*p[pos], L[pos]=las, R[las]=pos, las=pos;
				else beg=las=pos;
			}
		R[las]=beg, L[beg]=las, Now+=p[las]*p[beg];
		while(bel[q[now].l]==i)
		{
			while(r>q[now].r) Delete(r--);
			LL tmp=Now;
			while(l<q[now].l) Delete(l++);
			Ans[q[now++].id]=Now, Now=tmp;
			while(l>Ln) Add(--l);
		}
	}
	for(int i=1; i<=Q; printf("%lld\n",Ans[i++]));
	return 0;
}
												
											LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)的更多相关文章
- 「雅礼集训 2018 Day5」Convex 凸包、莫队
		
LOJ 看到离线区间操作仍然考虑莫队,然后可以发现:我们对于原来的凸包集合按照极角序维护一个链表,那么删除一个位置可以\(O(1)\),撤回删除操作也可以\(O(1)\)(因为原来的链表结构中当前节点 ...
 - LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)
		
题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...
 - Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】
		
正题 题目链接:https://loj.ac/p/6503 题目大意 \(n\)张卡\(m\)种,第\(i\)种卡有\(a_i\)张,求所有排列中有\(k\)对相邻且相同的卡牌. \(1\leq n\ ...
 - Loj #6503. 「雅礼集训 2018 Day4」Magic
		
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
 - LOJ #6509. 「雅礼集训 2018 Day7」C
		
神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...
 - 【题解】【雅礼集训 2017 Day5】远行 LOJ 6038 LCT
		
Prelude 快要THUWC了,练一练板子. 传送到LOJ:o(TヘTo) Solution 首先有一条定理. 到树中任意一点的最远点一定是直径的两个端点之一. 我也不会证反正大家都在用,似乎可以用 ...
 - 「LOJ #6500」「雅礼集训 2018 Day2」操作
		
description LOJ 6500 solution 根据常有套路,容易想到将区间差分转化为异或数组上的单点修改,即令\(b_i=a_i \ xor\ a_{i-1}\), 那么将\([l,l+ ...
 - [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]
		
题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ...
 - LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]
		
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...
 
随机推荐
- bootstrap浅谈
			
学习地址:http://www.runoob.com/bootstrap/bootstrap-tutorial.html 自己练习了下 主要是使用了bootstrap中包含的class类样式,只要给相 ...
 - Docker:dockerfile自动构建镜像 [六]
			
一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...
 - NOI-OJ 2.2 ID:3089 爬楼梯
			
整体思路 这是一个典型的递归型问题: 临界点:如果只有1级台阶,有1种走法(一次一步):如果有2级台阶,则有2种走法(一次一步或一次两步) 递归方法,对于n级台阶,如果第一次走1步,还剩n-1级台阶, ...
 - vue-resource的使用,前后端数据交互
			
vue-resource的使用,前后端数据交互 1:导入vue与vue-resource的js js下载: https://pan.baidu.com/s/1fs5QaNwcl2AMEyp_kUg ...
 - 老是上不了 google scholar...
			
这段时间老是上不了 google scholar... 下载了最新的 host 也不行. 难道真是电脑有问题了? 网络有时也老是掉... 也好. 多休息休息. 人生难得几回清闲. 马上就要开学咯. 课 ...
 - python3中的socket
			
socket是什么?用它做什么? socket,我们通俗的称之为套接字, 是进程间通信的一种方式,但是他与其他进程通信的一个主要区别是 他能实现不同主机间的通信,比如我们现在用的浏览器,在比如我们使用 ...
 - react+antdesign
			
http://scaffold.ant.design/#/scaffolds/ng-alain http://scaffold.ant.design/#/scaffolds/react-redux-a ...
 - spring和mybatis的整合开发(基于MapperFactoryBean的整合开发(方便简单不复杂))
			
MapperFactoryBean是mybati-spring团队提供的一个用于根据mapper接口生成mapper对象的类. 在spring配置文件中可以配置以下参数: 1.mapperInterf ...
 - Java并发之Thread类的使用
			
一.线程的几种状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wa ...
 - 《css网站布局实录》(李超)——读书札记
			
1.web表现层技术 2.HTML链接设计思想 3.对信息进行合理的分析.分类与处理来创造商业价值. 4.头部描述浏览器所需信息,主体包含所需要展现的具体内容. 5.HTML(XHTML)XML 6. ...