BZOJ 3333: 排队计划 树状数组 线段树
来源:互联网 发布:js旋转木马轮播图 编辑:程序博客网 时间:2024/06/05 07:37
3333: 排队计划
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 715 Solved: 322
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
6 2
160 163 164 161 167 160
2
3
160 163 164 161 167 160
2
3
Sample Output
6
3
1
3
1
HINT
粘题面时才发现 出题的竟然是学长a...
很容易发现
一次放哨,只有以出列的同学开头的逆序对会减少
其他的不变
所以
先把每个点开头的逆序对搞出来
之后每次把需要出列且没出列过的点都找出来 把它们的贡献剪掉就好
刚开始脑残 没YY出来支持这个的数据结构 竟然想上树套树...
拿线段树搞搞就好了
#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;typedef long long ll;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=10*x+ch-'0';ch=getchar();}return x*f;}void print(ll x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=500100,inf=0X3f3f3f3f;int n;struct node{int val,pos,x;friend bool operator <(const node &x,const node &y){return x.val==y.val?x.pos<y.pos:x.val<y.val;}}p[N];int bit[N];inline void modify_bit(int x,int val){for(;x<=n;x+=(x&-x))bit[x]+=val;}inline int query_bit(int x){int res=0;for(;x;x-=(x&-x))res+=bit[x];return res;}int V[N],a[N];struct seg_tree{int mn;}tr[N<<2];inline void pushup(int k){a[tr[k<<1].mn]<a[tr[k<<1|1].mn]?tr[k].mn=tr[k<<1].mn:tr[k].mn=tr[k<<1|1].mn;}void build(int k,int l,int r){if(l==r){tr[k].mn=l;return ;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);}void modify(int k,int l,int r,int x){if(l==r){a[l]=inf;return ;}int mid=(l+r)>>1;x<=mid?modify(k<<1,l,mid,x):modify(k<<1|1,mid+1,r,x);pushup(k);}int query(int k,int l,int r,int x,int y){if(l>=x&&r<=y)return tr[k].mn;int mid=(l+r)>>1;if(x>mid)return query(k<<1|1,mid+1,r,x,y);if(y<=mid)return query(k<<1,l,mid,x,y);int t=query(k<<1|1,mid+1,r,x,y);int T=query(k<<1,l,mid,x,y);return a[T]<a[t]?T:t;}int main(){n=read();int Q=read();register int i,j=1,now;for(i=1;i<=n;++i)p[i].val=read(),p[i].pos=i;sort(p+1,p+1+n);a[p[1].pos]=p[1].x=1;for(i=2;i<=n;++i){if(p[i].val!=p[i-1].val)j++;p[i].x=a[p[i].pos]=j;}ll ans=0;for(i=n;i;i--){V[i]=query_bit(a[i]-1);modify_bit(a[i],1);ans+=V[i];}print(ans);puts("");build(1,1,n);while(Q--){now=read();while(a[now]!=inf){j=query(1,1,n,now,n);modify(1,1,n,j);ans-=V[j];}print(ans);puts("");}return 0;}
阅读全文
0 0
- BZOJ 3333 排队计划 树状数组+线段树
- BZOJ 3333: 排队计划 树状数组+线段树
- bzoj 3333: 排队计划(树状数组+线段树)
- [树状数组 线段树] BZOJ 3333 排队计划
- bzoj 3333: 排队计划 树状数组+线段树
- BZOJ 3333: 排队计划 树状数组 线段树
- [bzoj3333][排队计划][树状数组+线段树]
- [BZOJ3333]排队计划(离散化+树状数组+线段树)
- bzoj 2141: 排队 树状数组套线段树
- bzoj 3333 树状数组+线段树
- BZOJ 3333: 排队计划
- BZOJ 3333 排队计划
- BZOJ 2141: 排队|树状数组套主席树
- 【bzoj 1901】树状数组套线段树
- BZOJ 2141 排队 分块+树状数组
- [BZOJ]2141: 排队 分块+树状数组
- BZOJ 2141 排队 [分块+树状数组]
- bzoj 3333: 排队计划 题解
- java集合类框图
- 使用Tablayout实现安卓导航栏效果
- 机器学习-用python绘制常见的统计分布
- ...Uncaught TypeError: Cannot use 'in' operator to search for“length”in { json数据 }
- Git 清理无效的远程追踪分支
- BZOJ 3333: 排队计划 树状数组 线段树
- thinkhphp5中创建公共函数
- 求数组左右平衡值得索引
- 状态模式
- 【PHP进阶学习】——命名空间
- mybatis系列之 mybatis-generator的使用
- C语言·操作符小结
- 转载-MarkDown编辑器中缩进
- 多线程之间的通信与并发库工具