bzoj 3615: MSS
Description
平面上有N个点,开始时每个点属于一个不同的集合。不妨设点Pi属于集合Si。请维护数据结构支持以下三种操作:
"Merge x y":将集合Sy中的点到Sx中;
"Split i d v"(d ∈ {0, 1}):创建新集合Sc + 1,Sc + 2,之后将集合Si中的所有点中,第d维坐标不超过v的到集合Sc + 1中,超过v的移动到集合Sc + 2中,其中c为现有集合数( 包括之前合并和分割中产生的空集 );
"Query i":查询集合Si中点权值的最大值,最小值及和;
"Add i d":将集合Si中所有点的权值增加d。
方便起见,对于d ∈ {0, 1},输入的所有点的第d维坐标不重复。所有操作涉及的集合非空。
Input
接下来N行,每行3个整数分别表示Pi的坐标与权值。
接下来一个整数Q表示操作数。
接下来Q行,每行描述一个操作,格式如上所述。
Output
#include<bits/stdc++.h>
#define G getchar()
int _(){
int x=,f=,c=G;
while(c<)c=='-'&&(f=-),c=G;
while(c>)x=x*+c-,c=G;
return x*f;
}
int _s(){
int c=G,c0;
while(c<)c=G;
c0=c;
while(c>)c=G;
return c0;
}
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
const int N=,inf=0x3f3f3f3f;
int n,qp;
struct node;
node*newnode();
struct node{
node*c[];
int mn[],mx[];
int mnv,mxv,sz,id;
long long sum,a;
void add(long long x){
if(this){
a+=x;
mnv+=x;
mxv+=x;
sum+=x*sz;
}
}
void dn(){
if(a){
c[]->add(a);
c[]->add(a);
a=;
}
}
void up(){
mnv=inf;mxv=-inf;sum=;
sz=;
if(c[]){
mnv=c[]->mnv;
mxv=c[]->mxv;
sum=c[]->sum;
sz=c[]->sz;
}
if(c[]){
mnv=min(mnv,c[]->mnv);
mxv=max(mxv,c[]->mxv);
sum+=c[]->sum;
sz+=c[]->sz;
}
}
void set(int x0,int x1,int v){
mn[]=mx[]=x0;
mn[]=mx[]=x1;
sum=mnv=mxv=v;
sz=;a=;
}
void query(){
printf("%d %d %lld\n",mxv,mnv,sum);
}
void upds(){
for(int i=;i<;++i){
mn[i]=min(c[]->mn[i],c[]->mn[i]);
mx[i]=max(c[]->mx[i],c[]->mx[i]);
}
}
}mem[N*],*pool[N*],*rt0,*n0[N],*rts[N*];
int pp;
node*newnode(){
return pool[--pp];
}
int dx=;
bool cmp(node*a,node*b){
return a->mn[dx]<b->mn[dx];
}
node*build(int L,int R){
if(L==R)return n0[L];
int M=(L+R)>>;
std::nth_element(n0+L,n0+M,n0+R+,cmp);
node*w=newnode();
dx^=;
w->c[]=build(L,M);
w->c[]=build(M+,R);
w->upds();
dx^=;
return w;
}
node*ss[];
int sp=;
void init(node*w){
ss[sp++]=w;
if(w->id){
node*t=w;
for(int i=sp-;~i;--i){
node*u=newnode();
*u=*ss[i];
int d=u->c[]==ss[i+];
u->c[d]=t;
u->c[d^]=;
u->up();
t=u;
}
rts[w->id]=t;
}else{
init(w->c[]);
init(w->c[]);
}
--sp;
}
int _x,_d;
void split(node*w,node*&l,node*&r){
if(!w)l=r=;
else if(_x<w->mn[_d])l=,r=w;
else if(w->mx[_d]<=_x)l=w,r=;
else{
w->dn();
node*u=newnode();
*u=*w;
split(w->c[],w->c[],u->c[]);
split(w->c[],w->c[],u->c[]);
w->up();u->up();
l=w,r=u;
}
}
node*merge(node*a,node*b){
if(!a)return b;
if(!b)return a;
a->dn();b->dn();
a->c[]=merge(a->c[],b->c[]);
a->c[]=merge(a->c[],b->c[]);
a->up();
pool[pp++]=b;
return a;
}
int main(){
n=_();
pp=n*;
for(int i=;i<pp;++i)pool[i]=mem+i;
for(int i=,x,y;i<=n;++i){
x=_();y=_();
n0[i]=newnode();
n0[i]->set(x,y,_());
n0[i]->id=i;
}
rt0=build(,n);
init(rt0);
for(qp=_();qp;--qp){
int o=_s();
if(o=='M'){
int x=_(),y=_();
rts[x]=merge(rts[x],rts[y]);
rts[y]=;
}else if(o=='S'){
int x=_();
_d=_();_x=_();
split(rts[x],rts[n+],rts[n+]);
rts[x]=;
n+=;
}else if(o=='Q'){
rts[_()]->query();
}else{
int x=_();
rts[x]->add(_());
}
}
return ;
}
bzoj 3615: MSS的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- 关于TCP中的MSS
MSS 是TCP选项中最经常出现,也是最早出现的选项.MSS选项占4byte.MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头部.TCP在三次握手中,每一方都 ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- Windows系统下解决“telnet不是外部或内部命令”的问题
在学习Node.js时,需要使用Telnet连接Node TCP服务器,在命令行中运行: $ telnet 127.0.0.1 9000 时,命令行工具会报错:“telnet不是外部或内部命令”. 这 ...
- python 随机整数
# Program to generate a random number between and # import the random module import random print(ran ...
- vim 安装vim-airline
在.vimrc中添加 Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' 然后打开vim编辑器执行 :Pl ...
- Abstract Factory(抽象工厂)
意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关 ...
- JDK_源码
1.http://hg.openjdk.java.net/ (ZC:这个貌似像官网的样子,不知道 到底是不是...) 1.1.jdk8u_jdk8u_jdk_ 5b86f66575b7 _src_.h ...
- 伪多项式时间 Pseudo-polynomial time
2018-03-15 14:20:08 伪多项式时间:如果一个算法的传统时间复杂度是多项式时间的,而标准时间复杂度不是多项式时间的,则我们称这个算法是伪多项式时间的. 想要理解“伪多项式时间”,我们需 ...
- tp5集成淘宝,微信,网易,新浪等第三方登录
tp5集成淘宝,微信,网易,新浪等第三方登录 一.总结 一句话总结: 接口 链接 实现的话就是这些平台给的一个接口(链接),你通过这些接口登录进去之后,它会给你返回用户名,头像之类的信息,我们的网站存 ...
- RabbitMQ 消息传递的可靠性
生产者保证消息可靠投递 消费者保证消息可靠消费 RabbitMQ持久化 参考:https://blog.csdn.net/RobertoHuang/article/details/79605185
- centOS安装ab测试工具
yum install apr-util cd /opt mkdir abtmp cd abtmp yum install yum-utils.noarch yumdownloader httpd-t ...
- SpringBoot 使用 EhCache2.x 缓存(三十一)
SpringBoot 使用 EhCache2.x 缓存入门很简单,废话少说上干货: 1.在POM.xml中增加jar包 <!--开启 cache 缓存--> <dependency& ...