LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)

时间:2022-12-16 09:40:24

题面

传送门

题解

首先\(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. &num;503&period; 「LibreOJ β Round」ZQC 的课堂 容斥原理&plus;Treap

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

  2. LOJ&num;505&period; 「LibreOJ β Round」ZQC 的游戏&lpar;最大流&rpar;

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

  3. loj&num;501 「LibreOJ β Round」ZQC 的树列

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

  4. loj&num;500 「LibreOJ β Round」ZQC 的拼图

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

  5. &lbrack;LOJ&num;500&rsqb;「LibreOJ β Round」ZQC的拼图

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

  6. &num;505&period; 「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 &num;3119「CTS2019 &vert; CTSC2019」随机立方体 (容斥)

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

随机推荐

  1. 初学者的python学习笔记1——作业篇

    既然是学习,作业必不可少,其实在看后面讲思路之前还是感觉自己写的不错,但是和后面一对比,感觉实在是想的太片面太肤浅了,还需要太多太多改进的地方. 首先放一下作业要求. 最开始做的时候真的是完全按照字面 ...

  2. PHP的学习--PHP加密

    PHP中的加密方式有如下几种 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. ...

  3. C&num; 多重overide

    overide 是覆盖的意思,用在且仅用在虚函数上,虚函数可以是virtual或abstract修饰的,或者是overide修饰的. 文档大概是这么说的. 由此知道,由overide修饰的函数都是虚函 ...

  4. OC协议

    概念:定义了一个接口,其他类负责来实现这些接口.如果你的类实现了一个协议的方法时,则说该类遵循此协议. 非正式协议:非正式协议虽名为协议,但实际上是挂于NSObject上的未实现分类(Unimplem ...

  5. Mvc分页组件MvcSimplePager代码重构及使用

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  6. &sol;sbin&sol;insserv&colon; No such file or directory

    /sbin/insserv: No such file or directory在Ubuntu下安装service服务,可能会报如下错误:/sbin/insserv: No such file or ...

  7. css基础系列

    盒子模型 盒子模型的概念 高和宽的设置 边框的设置 内边距的设置 外边距的设置 盒子的计算 元素显示的方式 盒子模型: border边框,margin外边距,padding内部距,content内容, ...

  8. windows下编译SDL1&period;2

    首先,官网下载开发库,我这里用的是tdm-gcc,因此下载mingw版的. 解压,写代码,编译…… 成功!...地出错了 这里提一下,编译命令是 g++ test.cpp -I include目录  ...

  9. Flex 弹性布局——笔记

    将容器指定为Flex布局 display:flex -->d-flex display:-webkit-flex /*Safari*/ *float clear vertical-align失效 ...

  10. 「TJOI2015」概率论 解题报告

    「TJOI2015」概率论 令\(f_i\)代表\(i\)个点树形态数量,\(g_i\)代表\(i\)个点叶子个数 然后列一个dp \[ f_i=\sum_{j=0}^{i-1} f_j f_{i-j ...