ZJOI2007报表统计
比较简单的一道平衡树题。
第三个操作可以直接用map完成(加进去一个数只会让答案变小,于是与它的前面后面一个数做差更新答案即可),只考虑前两个操作。
·维护区间内的最大最小值,以及区间相邻两数最小差值。
·对于insert x k ,相当于在x+1前插入k,再用一个树状数组维护原数组中的每个数在现在的数组中是第几个,这个操作相当于对 x+1 ~ n 的排名全部加了1。
复杂度O(nlogn) ,常数略大...
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<vector>
- #include<algorithm>
- #include<queue>
- #include<cmath>
- #include<stack>
- #include<map>
- #include<cassert>
- #define P puts("lala")
- #define cp cerr<<"lala"<<endl
- #define ln putchar('\n')
- #define sp putchar(' ')
- #define pb push_back
- #define pf push_front
- #define fi first
- #define se second
- #define mkp make_pair
- using namespace std;
- typedef pair<int,int> pii;
- inline void read(int &re)
- {
- char ch=getchar();int g=1;
- while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
- re=0;
- while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
- re*=g;
- }
- typedef long long ll;
- inline void read(ll &re)
- {
- char ch=getchar();ll g=1;
- while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
- re=0;
- while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+ch-48ll,ch=getchar();
- re*=g;
- }
- const int N=500050;
- const int inf=0x3f3f3f3f;
- map<int,int>mp;
- map<int,int>::iterator it,it1;
- int dv[N],n,m;
- inline void add(int x,int k)
- {
- for(;x<=n;x+=(x&-x)) dv[x]+=k;
- }
- inline int ask(int x)
- {
- int sum=0;
- for(;x>0;x-=(x&-x)) sum+=dv[x];
- return sum;
- }
- int key[N<<1],mind[N<<1],ch[N<<1][2],fa[N<<1],pre[N<<1],nex[N<<1];
- int a[N],sz,root,siz[N<<1];
- inline void up(int o)
- {
- mind[o]=min(mind[ch[o][0]],mind[ch[o][1]]);
- pre[o]=key[o];nex[o]=key[o];
- siz[o]=1;
- if(ch[o][0])
- {
- mind[o]=min(mind[o],abs(key[o]-nex[ch[o][0]]));
- pre[o]=pre[ch[o][0]];
- siz[o]+=siz[ch[o][0]];
- }
- if(ch[o][1])
- {
- mind[o]=min(mind[o],abs(key[o]-pre[ch[o][1]]));
- nex[o]=nex[ch[o][1]];
- siz[o]+=siz[ch[o][1]];
- }
- }
- void build(int &o,int l,int r)
- {
- if(l>r) return ;
- o=++sz;
- int mid=l+r>>1;
- key[o]=a[mid];
- siz[o]=1;
- pre[o]=a[mid];nex[o]=a[mid];
- mind[o]=inf;
- if(l==r) return ;
- build(ch[o][0],l,mid-1);build(ch[o][1],mid+1,r);
- fa[ch[o][0]]=o;fa[ch[o][1]]=o;
- up(o);
- }
- inline bool ge(int x){return ch[fa[x]][1]==x;}
- inline void rotate(int x)
- {
- int f=fa[x],g=fa[f],wh=ge(x);
- ch[f][wh]=ch[x][wh^1];fa[ch[f][wh]]=f;
- ch[x][wh^1]=f;fa[f]=x;
- fa[x]=g;
- if(g) ch[g][ch[g][1]==f]=x;
- up(f);up(x);
- }
- void splay(int x)
- {
- for(int f;f=fa[x];rotate(x)) if(fa[f]) rotate(ge(x)==ge(f)?f:x);
- root=x;
- }
- int find(int k)
- {
- //assert(k<=siz[root]);
- //assert(k>=1);
- int x=root;
- while(1)
- {
- if(k<=siz[ch[x][0]]) x=ch[x][0];
- else
- {
- k-=siz[ch[x][0]];
- if(k<=1) return x;
- k--;
- x=ch[x][1];
- }
- }
- }
- void inspre(int k)
- {
- int x=ch[root][0];
- while(ch[x][1]) x=ch[x][1];
- ch[x][1]=++sz;siz[sz]=1;
- pre[sz]=k;key[sz]=k;nex[sz]=k;
- fa[sz]=x;mind[sz]=inf;
- up(x);
- splay(sz);
- }
- char in[50];
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("1.in","r",stdin);freopen("1.out","w",stdout);
- #endif
- int i,j,opt,T;
- mind[0]=inf;
- read(n);read(m);
- for(i=1;i<=n;++i) add(i,1);
- for(i=1;i<=n;++i) read(a[i]),mp[a[i]]++;
- build(root,1,n);
- int minn=inf;
- for(it=mp.begin();it!=mp.end();++it)
- {
- it1=it;
- it1++;
- if(it1!=mp.end()) minn=min(minn,abs( (it->fi)-(it1->fi) ));
- if((it->second)>1) minn=0;
- }
- siz[0]=0;
- for(int cas=1;cas<=m;++cas)
- {
- scanf("%s",in);
- if(in[0]=='I')
- {
- int x,k;read(x);read(k);
- //cerr<<cas<<endl;
- if(x+1>n)
- {
- int rt=find(siz[root]);
- splay(rt);
- root=++sz;
- ch[sz][0]=rt;
- fa[rt]=sz;
- key[sz]=k;mind[sz]=inf;
- up(sz);
- }
- else
- {
- int rt=find(ask(x+1));
- splay(rt);
- //cout<<siz[root]<<endl;
- inspre(k);
- }
- mp[k]++;
- it=mp.find(k);
- if((it->se)>1) minn=0;
- else
- {
- it1=it;
- if(it1!=mp.begin())
- {
- it1--;
- minn=min(minn,abs((it1->fi)-k));
- }
- it++;
- if(it!=mp.end()) minn=min(minn,abs((it->fi)-k));
- }
- add(x+1,1);
- }
- else if(in[4]=='G') printf("%d\n",mind[root]);
- else if(in[4]=='S') printf("%d\n",minn);
- }
- return 0;
- }
- /*
- */
ZJOI2007报表统计的更多相关文章
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
- [补档][ZJOI2007] 报表统计
[ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...
- BZOJ_1058_[ZJOI2007]报表统计_STL
BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
- bzoj P1058 [ZJOI2007]报表统计——solution
1058: [ZJOI2007]报表统计 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4099 Solved: 1390 [Submit][St ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
- [ZJOI2007]报表统计(splay,堆)
[ZJOI2007]报表统计(luogu) Description 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. ...
- 1058: [ZJOI2007]报表统计 - BZOJ
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个非 ...
随机推荐
- RestTemplate上传文件
1.上传的文件是File类型 如果文件保存在本地,即可以通过File file = new File(path) 或者 文件路径地址获取到指定文件 public String uploadFile(F ...
- 面试突击74:properties和yml有什么区别?
properties 和 yml 都是 Spring Boot 支持的两种配置文件,它们可以看作是 Spring Boot 在不同时期的两款"产品".在 Spring Boot 时 ...
- Webstorm设置背景图为Windows桌面背景
桌面背景图会缓存在这个目录中,文件名不确定在改变桌面背景后会不会变. C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles ...
- 十周周末总结 MySQL的介绍与使用
python 十周周末总结 MySQL的介绍与使用 MySQL字符编码与配置文件 查看数据库的基本信息(用户,字符编码) /s windos下MySQL默认的配置文件 my_default.ini 修 ...
- String vs StringBuffer vs StringBuilder
String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutorials/strin ...
- 【IDEA】IDEA打开欢迎页面
概述 IDEA在默认情况下,会进入最后一个项目.如果项目比较大的话会加载的比较久,这个就比较烦人了,目前我觉得最好的办法就是在设置中直接进入欢迎页面. 解决方案 ① 进入设置 ② Appearance ...
- KingbbaseES V8R6集群维护案例之---集群之间数据迁移
案例说明: 生产环境是集群环境,测试环境是集群,现需要将生产环境的数据迁移到测试集群中运行,本文档详细介绍了从集群环境迁移数据的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingbase ...
- 如何自动清理 KingbaseES SYS_LOG
KingbaseES 初始化完成后,默认不会对 sys_log进行清理.如果需要对sys_log进行自动清理,需要设置相关参数. 与日志自动清理有关的参数(默认值)如下: log_filename | ...
- Java 9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是. ...
- 聊聊两个Go即将过时的GC优化策略
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 这篇文章本来是要讲 Go Memory Ballast 以及 Go GC Tuner 来 ...