萌新爆零求助
查看原帖
萌新爆零求助
209454
watermonster楼主2020/10/16 08:41

RT,过了样例交上去却爆零,有大佬可以帮忙差错或者给一组hack数据吗?
提交记录

#include <cstdio>
#include <algorithm>

using namespace std;

#define il inline
#define re register
#define ll long long

const int N=2e4+100;

namespace FastIO
{
char buf[1<<21],buf2[1<<21],*p1=buf,*p2=buf;
int p,p3=-1;
il int getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
il void flush(){fwrite(buf2,1,p3+1,stdout),p3=-1;}
#define isdigit(ch) (ch>=48&&ch<=57)
template <typename T>
il void read(T &x)
{
	re bool f=0;x=0;
	re char ch=getc();
	while(!isdigit(ch)) f|=(ch=='-'),ch=getc();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getc();
	x=f?-x:x;
}
template <typename T>
il void print(T x)
{
	if(p3>(1<<20)) flush();
	if(x<0) buf2[++p3]=45,x=-x;
	re int a[50]={};
	do{a[++p]=x%10+48;}while(x/=10);
	do{buf2[++p3]=a[p];}while(--p);
	buf2[++p3]='\n';
}
}
using namespace FastIO;

il void swap(int &a,int &b){a^=b^=a^=b;}

int n,m;
struct sequence{int val,id;}h[N];
il bool cmp1(sequence a,sequence b){return a.val<b.val;}
il bool cmp2(sequence a,sequence b){return a.id<b.id;}
il void decrete()
{
	sort(h+1,h+n+1,cmp1);
	re int pre=0,now=0;
	for(re int i=1;i<=n;++i)
	{
		if(h[i].val^pre) ++now,pre=h[i].val;
		h[i].val=now;
	}
	sort(h+1,h+n+1,cmp2);
}

int rt[N],pool;
int ls[N<<6],rs[N<<6];
int cnt[N<<6];
il void insert(int &now,int l,int r,int p,int x)
{
	if(!now) now=++pool;
	cnt[now]+=x;
	if(l==r) return;
	re int mid=(l+r)>>1;
	if(p>mid) insert(rs[now],mid+1,r,p,x);
	else insert(ls[now],l,mid,p,x);
}
il int query(int p,int l,int r,int L,int R)
{
	if(!p) return 0;
	if(l>R||r<L) return 0;
	if(l>=L&&r<=R) return cnt[p];
	re int mid=(l+r)>>1;
	return query(ls[p],l,mid,L,R)+query(rs[p],mid+1,r,L,R);
}
#define lowbit(x) (x&-x)
il void change(int p,int x)
{
	for(re int i=p;i<=n;i+=lowbit(i))
		insert(rt[i],1,n,h[p].val,x);
}
il int ask(int l,int r,int L,int R)
{
	if(l>r||L>R) return 0;
	re int res=0;
	for(re int i=r;i;i-=lowbit(i))
		res+=query(rt[i],1,n,L,R);
	for(re int i=l-1;i;i-=lowbit(i))
		res-=query(rt[i],1,n,L,R);
	return res;
}

ll ans;

int main()
{
	read(n);
	for(re int i=1;i<=n;++i) read(h[i].val),h[i].id=i;
	decrete();
	for(re int i=1;i<=n;++i) change(i,1);
	for(re int i=1;i<=n;++i) ans+=ask(1,i-1,h[i].val+1,n);
	print(ans);
	re int a,b;
	read(m);
	while(m--)
	{
		read(a),read(b);
		if(a==b){print(ans);continue;}
		if(a>b) swap(a,b);
		ans-=ask(a+1,b-1,h[b].val+1,n);
		ans+=ask(a+1,b-1,1,h[b].val-1);
		ans-=ask(a+1,b-1,1,h[a].val-1);
		ans+=ask(a+1,b-1,h[a].val+1,n);
		if(h[a].val<h[b].val) ++ans;
		if(h[a].val>h[n].val) --ans;
		change(a,-1);change(b,-1);
		swap(h[a].val,h[b].val);
		change(a,1);change(b,1);
		print(ans);
	}
	flush();return 0;
}
2020/10/16 08:41
加载中...