关于ABC的F题
  • 板块学术版
  • 楼主y0y68tahs6
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/1/30 21:56
  • 上次更新2023/11/5 04:07:11
查看原帖
关于ABC的F题
115668
y0y68tahs6楼主2021/1/30 21:56

WA了,求查错

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e5+5;
int n,ans,a[N];
struct Segment_Tree{
	struct Node{
		int s,tag;
	}tree[N<<2];
	inline int ls(int u){return u<<1;}
	inline int rs(int u){return u<<1|1;}
	inline void push_up(int u){
		tree[u].s=tree[ls(u)].s+tree[rs(u)].s;
	}
	inline void push_down(int u,int l,int r){
		if(tree[u].tag==0)return;
		tree[ls(u)].tag+=tree[u].tag;
		tree[rs(u)].tag+=tree[u].tag;
		tree[ls(u)].s+=l*tree[u].tag;
		tree[rs(u)].s+=r*tree[u].tag;
		tree[u].tag=0;
	}
	inline void update(int u,int l,int r,int L,int R){
		if(l>=L&&r<=R){
			tree[u].s+=r-l+1;
			tree[u].tag++;return;
		}
		int mid=l+r>>1;
		push_down(u,mid-l+1,r-mid);
		if(mid>=L)update(ls(u),l,mid,L,R);
		if(mid<R)update(rs(u),mid+1,r,L,R);
		push_up(u);
	}
	inline int query(int u,int l,int r,int x){
		if(l==r)return tree[u].s;
		int mid=l+r>>1;
		push_down(u,mid-l+1,r-mid);
		if(mid>=x)return query(ls(u),l,mid,x);
		return query(rs(u),mid+1,r,x);
	}
}t;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),a[i]++;
	for(int i=1;i<=n;i++){
		ans+=t.query(1,1,n,a[i]);
		if(a[i]>1)t.update(1,1,n,1,a[i]-1);
	}
	cout<<ans<<endl;
	for(int i=1;i<n;i++){
		ans+=n-a[i]-(a[i]-1);
		printf("%d\n",ans);
	}
	return 0;
}
2021/1/30 21:56
加载中...