题面

传送门

题解

首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例

我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\(s_0=1\)。这个条件等价于\(\max(s_i,s_{i-1})>0\)且\(\min(s_i,s_{i-1})<0\)。我们可以容斥一下,就是总数减去\(\max(s_i,s_{i-1})<0\)的个数减去\(\min(s_i,s_{i-1})>0\)的个数

注意到一次单点修改会使一个点到结尾的\(s_i\)区间加,而对应的\(\max(s_i,s_{i+1}),\max(s_{i+1},s_{i+2})\)之类的可以直接加上这个值,但前面的不行。我们记录一个偏移量,并且开一个平衡树,平衡树里只放指针右边的元素,那么一次修改不会影响前面,我们可以在移动指针的时候顺便维护答案,而指针右边的答案在平衡树里找就可以了

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
inline char getop(){char ch;while((ch=getc())>'Z'||ch<'A');return ch;}
unsigned int aaa=19260817;
inline unsigned int rd(){aaa^=aaa>>15,aaa+=aaa<<12,aaa^=aaa>>3;return aaa;}
inline int max(R int x,R int y){return x>y?x:y;}
inline int min(R int x,R int y){return x<y?x:y;}
const int N=2e5+5;
struct node;typedef node* ptr;
struct node{
ptr lc,rc;int sz,v;unsigned int pr;
inline ptr init(R int val){return sz=1,v=val,pr=rd(),this;}
inline ptr upd(){return sz=lc->sz+rc->sz+1,this;}
};
struct Treap{
node e[N],*rt=e,*pp=e;
inline ptr newnode(R int v){return ++pp,pp->lc=pp->rc=e,pp->init(v);}
void split(ptr p,int k,ptr &s,ptr &t){
if(p==e)return s=t=e,void();
if(p->v<=k)s=p,split(p->rc,k,p->rc,t);
else t=p,split(p->lc,k,s,p->lc);
p->upd();
}
ptr merge(ptr s,ptr t){
if(s==e)return t;if(t==e)return s;
if(s->pr<t->pr)return s->rc=merge(s->rc,t),s->upd();
return t->lc=merge(s,t->lc),t->upd();
}
void push(int k){
ptr s,t;
split(rt,k,s,t),rt=merge(merge(s,newnode(k)),t);
}
void pop(int k){
ptr s,t,p,q;
split(rt,k,s,t),split(s,k-1,p,q),q=merge(q->lc,q->rc);
rt=merge(merge(p,q),t);
}
int les(int k){
ptr s,t;int now;
split(rt,k-1,s,t),now=s->sz;
return rt=merge(s,t),now;
}
int gre(int k){
ptr s,t;int now;
split(rt,k,s,t),now=t->sz;
return rt=merge(s,t),now;
}
Treap(){e->lc=e->rc=e;}
}sx[2],sy[2];
int nx[N],ny[N],X,Y,dx,dy,p,ansx,ansy,n;
void Ri(){
if(p==n)return;++p;
sx[0].pop(min(X,X+nx[p])-dx),sx[1].pop(max(X,X+nx[p])-dx),
sy[0].pop(min(Y,Y+ny[p])-dy),sy[1].pop(max(Y,Y+ny[p])-dy);
if(X*(X+nx[p])<0)++ansx;if(Y*(Y+ny[p])<0)++ansy;
X+=nx[p],Y+=ny[p];
}
void Le(){
if(p==1)return;X-=nx[p],Y-=ny[p];
if(X*(X+nx[p])<0)--ansx;if(Y*(Y+ny[p])<0)--ansy;
sx[0].push(min(X,X+nx[p])-dx),sx[1].push(max(X,X+nx[p])-dx),
sy[0].push(min(Y,Y+ny[p])-dy),sy[1].push(max(Y,Y+ny[p])-dy);
--p;
}
void modify(){
int x=read(),y=read();
if(X*(X-nx[p])<0)--ansx;if(Y*(Y-ny[p])<0)--ansy;
X+=x-nx[p],Y+=y-ny[p],dx+=x-nx[p],dy+=y-ny[p],nx[p]=x,ny[p]=y;
if(X*(X-x)<0)++ansx;if(Y*(Y-y)<0)++ansy;
}
inline int query(){return n-p-sx[0].gre(-dx)-sx[1].les(-dx)+n-p-sy[0].gre(-dy)-sy[1].les(-dy)+ansx+ansy;}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),X=Y=1;
fp(i,1,n){
nx[i]=read(),ny[i]=read();
sx[0].push(min(X,X+nx[i])),sx[1].push(max(X,X+nx[i]));
sy[0].push(min(Y,Y+ny[i])),sy[1].push(max(Y,Y+ny[i]));
X+=nx[i],Y+=ny[i];
}
X=Y=1,p=0,Ri();
for(int q=read();q;--q){
char op=getop();
switch(op){
case 'F':Ri();break;
case 'B':Le();break;
case 'C':modify();break;
case 'Q':print(query());break;
}
}
return Ot(),0;
}

LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)的更多相关文章

  1. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...

  2. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  3. loj#501 「LibreOJ β Round」ZQC 的树列

    分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...

  4. loj#500 「LibreOJ β Round」ZQC 的拼图

    分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...

  5. [LOJ#500]「LibreOJ β Round」ZQC的拼图

    题目   点这里看题目. 分析   首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\).   考虑如何去判断当前的答案.设这个答案为 ...

  6. #505. 「LibreOJ β Round」ZQC 的游戏

    题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...

  7. LOJ504「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...

  8. 「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...

  9. LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)

    博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...

随机推荐

  1. noip模拟赛 道路分组

    分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分. 事实上每一次都不需 ...

  2. apple网址

    https://developer.apple.com/downloads/index.action#   开发工具下载

  3. ***mysql 用一个表的一列,去更新另一表的一列

    需求: 老板给了一个EXCEL数据,是本人提供的一个模板,含ID,现在相当于要导入这新增的一列数据到数据库中的某一个表. 方法一:用navicat,在excel中复制一列,再粘贴到navicat中的一 ...

  4. Memcached与Spring集成的方式(待实践)

    主要是基于这几种方式http://www.cnblogs.com/EasonJim/p/7624822.html去实现与Spring集成,而个人建议使用Xmemcached去集成好一些,因为现在官方还 ...

  5. 一个简单的Java文件工具类

    package com.xyworkroom.ntko.util; import java.io.File; import java.io.FileInputStream; import java.i ...

  6. Android GIS开发系列-- 入门季(8) Json与Geometry的相互转换

    在Android中json数据十分普遍,也很实用,在Arcgis中也同样支持Json数据,Json与Geometry可以相互转换,达到我们想要的数据. 一.Geometry转换成Json数据 这个实现 ...

  7. 码农小汪-spring框架学习之2-spring IoC and Beans 控制反转 依赖注入 ApplicationContext BeanFactory

    spring Ioc依赖注入控制反转 事实上这个东西很好理解的,并非那么的复杂. 当某个Java对象,须要调用还有一个Java对象的时候(被依赖的对象)的方法时.曾经我们的做法是怎么做呢?主动的去创建 ...

  8. 在JAR中打包使用JAR库

    不知大家在写Java程序的时候有没有这种需求: 将引用其他第三方JAR库的项目打包成一个JAR文件执行.也就是说在你打包好的JAR文件里再包括那些你引用的第三方JAR文件,合成一个JAR包,这样仅仅需 ...

  9. [DLX反复覆盖] poj 1084 Square Destroyer

    题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么当中会有非常多诸如边长为1,为2...为n的正方形,如今能够拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些 ...

  10. kafka 生产者消费者 api接口

    生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Keyed ...