BZOJ 3333: 排队计划 树状数组 线段树

来源:互联网 发布:js旋转木马轮播图 编辑:程序博客网 时间:2024/06/05 07:37

3333: 排队计划

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 715  Solved: 322
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

6 2
160 163 164 161 167 160
2
3

Sample Output

6
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;}

原创粉丝点击