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