P5445 [APIO2019]路灯(树套树)
转化为平面上的坐标(x,y),set维护连续区间.
用树套树维护矩阵加法,单点查询。
注意维护矩阵差分的时候,
$(x,y,v)$是对$(x,y)(n+1,n+1)$的矩阵做出贡献
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define ri register int
using namespace std;
int read(){
char c=getchar(); ri x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
#define N 600005
#define W 20000005
struct E{
int l,r;
E(int A,int B):l(A),r(B){}
bool operator < (const E &G) const{return r<G.r;}
};set<E> g;
set<E>::iterator it;
int n,T,a[N]; char opt[],cc[N];
int cnt,rt[N],lc[W],rc[W],s[W];
#define mid (l+r)/2
void Ins1(int &o,int l,int r,int x,int v){
if(!o)o=++cnt; s[o]+=v;
if(l==r) return;
if(x<=mid) Ins1(lc[o],l,mid,x,v);
else Ins1(rc[o],mid+,r,x,v);
}
int Ask1(int o,int l,int r,int x1,int x2){
if(!o||x2<l||r<x1) return ;
if(x1<=l&&r<=x2) return s[o];
return Ask1(lc[o],l,mid,x1,x2)+Ask1(rc[o],mid+,r,x1,x2);
}
void Ins2(int x,int y,int v){for(;x<=n+;x+=x&-x)Ins1(rt[x],,n+,y,v);}
int Ask2(int x,int y){int re=; for(;x;x-=x&-x)re+=Ask1(rt[x],,n+,,y); return re;}
inline void Add(int x1,int y1,int x2,int y2,int v){//注意修改标记是对右上的查询产生贡献,并不是平移区间
Ins2(x1,y1,v),Ins2(x1,y2+,-v),Ins2(x2+,y1,-v),Ins2(x2+,y2+,v);
}
int main(){
n=read()+; T=read(); scanf("%s",cc+);
for(ri i=;i<=n;++i) g.insert(E(i,i));
int x,y,pl,pr,ql,qr;
for(ri i=;i<n;++i) if((a[i]=cc[i]-)){
it=g.lower_bound(E(,i+)); --it; pl=(*it).l;
g.erase(it); g.erase(E(i+,i+)); g.insert(E(pl,i+));
}
for(it=g.begin();it!=g.end();++it) Add((*it).l,(*it).l,(*it).r,(*it).r,T);
for(ri t=;t<=T;++t){
scanf("%s",opt);
if(opt[]=='q'){
x=read(); y=read();
pl=(*(g.lower_bound(E(,x)))).l;
ql=(*(g.lower_bound(E(,y)))).l;
printf("%d\n",Ask2(x,y)-(T-t)*(pl==ql));
}else{
x=read();
if(a[x]){
it=g.lower_bound(E(,x));
pl=(*it).l,pr=x; ql=x+,qr=(*it).r;
Add(pl,ql,pr,qr,t-T);
g.erase(it); g.insert(E(pl,pr)); g.insert(E(ql,qr));
}else{
it=g.lower_bound(E(,x));
pl=(*it).l,pr=x; ++it; ql=x+,qr=(*it).r;
Add(pl,ql,pr,qr,T-t);
g.erase(E(pl,pr)); g.erase(E(ql,qr)); g.insert(E(pl,qr));
}a[x]^=;
}
}return ;
}
P5445 [APIO2019]路灯(树套树)的更多相关文章
- 【LOJ#3146】[APIO2019]路灯(树套树)
[LOJ#3146][APIO2019]路灯(树套树) 题面 LOJ 题解 考场上因为\(\text{bridge}\)某个\(\text{subtask}\)没有判\(n=1\)的情况导致我卡了\( ...
- 【APIO2019】路灯(ODT & (树套树 | CDQ分治))
Description 一条 \(n\) 条边,\(n+1\) 个点的链,边有黑有白.若结点 \(a\) 可以到达 \(b\),需要满足 \(a\to b\) 的路径上的边不能有黑的.现给出 \(0\ ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- BZOJ4170 极光(CDQ分治 或 树套树)
传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...
- bzoj3262: 陌上花开(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- bzoj3295: [Cqoi2011]动态逆序对(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ 3110 k大数查询 & 树套树
题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...
- BZOJ 3110 树套树 && 永久化标记
感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
随机推荐
- phpStorm 配置PHP_CodeSniffer自动检查代码
环境 ubuntu18.4 phpstorm php7.2 最正确安装方法 sudo apt-get install php-codesniffer 一.composer安装PHP_CodeSniff ...
- 四种会话跟踪技术以及jstl介绍
四种会话跟踪技术 page:代表与一个页面相关的对象和属性.一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示.这既包括 ...
- LA 6834 Shopping
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- 如何搭建一个spring boot项目
什么是springboot? Spring Boot俗称微服务.Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特 ...
- python每日练习0730
""" 1. 现有面包.热狗.番茄酱.芥末酱以及洋葱,数字显 示有多少种订购组合, 其中面包必订,0 不订,1 订,比如 10000,表示只订购面包 "&quo ...
- java中 运算符
我们先讨论 &,&&,| ,|| 这四个运算符 boolean a=true; boolean b=true; boolean c=false; //输出:a为true,b ...
- ES6中的export和import
1.ES6中的模块加载 ES6 模块是编译时加载,编译时就能确定模块的依赖关系,以及输入和输出的变量,相比于CommonJS 和 AMD 模块都只能在运行时确定输入输出变量的加载效率要高. 1.1.严 ...
- 求超大文件上传方案( Java )
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- Python Web框架本质——Python Web开发系列一
前言:了解一件事情本质的那一瞬间总能让我获得巨大的愉悦感,希望这篇文章也能帮助到您. 目的:本文主要简单介绍Web开发中三大基本功能:Socket实现.路由系统.模板引擎渲染. 进入正题. 一. 基础 ...
- BZOJ 5170: Fable
离散化+树状数组 求当前位之前是否有k位比它大 这样的话它就需要前移k位 剩下的按照原来的顺序依次填入 其实我觉得sort一下就可以做出来了 太久没写树状数组了 所以写了一下树状数组 #include ...