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栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- UVa 12169 不爽的裁判
https://vjudge.net/problem/UVA-12169 题意: 输入T,x1,x2,x3,...,x2T-1,输出x2,x4,...,x2T. 递推公式为xi=(axi-1+b)mo ...
- git 撤销
在add之前撤回文件: git checkout src/com/jay/example/testforgit/MainActivity.java 已经add的,先取消添加,再撤回 git reset ...
- Java 字节的常用封装
一. Java 的字节 byte (字节) 是 Java 中的基本数据类型,一个 byte 包含8个 bit(位),byte 的取值范围是-128到+127. byte 跟 Java 其他基本类型的关 ...
- kali debian linux 的samba 共享设置
1) 首先,默认的源http.kali.org 会自动帮你找镜像,问题是他找到了 mirrors.neusoft.edu.cn , 这个源速度虽然快,却是有问题的. 安装不了cifs-utils 2) ...
- appium+pytest+allure+jenkins 如何实现多台手机连接
使用appium可以实现app自动化测试,我们之前是连接一台手机去运行,如何同时连接多台手机呢?很多人可能想到的是多线程(threading).今天分享一种比多线程更简单的方法,虽然不是多台手机同时运 ...
- UVALive-3126 Taxi Cab Scheme (DAG的最小路径覆盖)
题目大意:要给n个人安排车,已知每个人的出发时间和起点与终点,问最少需要安排几辆车才能完成任务. 题目分析:最小路径覆盖.如果送完a到目的地后能在b出发之前赶来接b,那么连一条有向边a->b,最 ...
- UVA-129 Krypton Factor(回溯)
题目大意:由字母A到Z组成的字符串,其中有两个子串完全相同的叫做容易的串,反之叫困难的串.找出由前L个字母组成的第n个困难的串. 题目分析:简单回溯,不过要判断是否存在重复子串比较棘手.<入门经 ...
- Java语言发展史和eclipse配置
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 线程的同步之Synchronized在单例模式中的应用
synchronized在单例模式中的使用 在单例模式中有一种懒汉式的单例,就是类初始化的时候不创建对象.等第一次获取的时候再创建对象.这种单例在单线程下是没有问题的获取的也都是同一个对象.但是如果放 ...
- 传智:自己简单实现一个struts2框架的demo
struts2的结构图: 代码实现: 组织结构: 主要代码: package cn.itcast.config; import org.apache.log4j.Logger; import org. ...