感觉这题好玄学啊/kel
  • 板块P3149 排序
  • 楼主Leap_Frog
  • 当前回复13
  • 已保存回复13
  • 发布时间2020/10/30 20:39
  • 上次更新2023/11/5 09:29:15
查看原帖
感觉这题好玄学啊/kel
44805
Leap_Frog楼主2020/10/30 20:39

WA 60,下了数据,打了暴力。
我写了个checker(暴力
如果我假装相等的数不是逆序对,那麽答案是18288966215
如果我假装相等的数是逆序对,那麽答案是18288966236
out 文件的第二位确是 18288966223
我感觉我的暴力应该没写挂吧/kel

#include<bits/stdc++.h>
using namespace std;
template<typename t>inline void read(t &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<'0'||c>'9';c=getchar()) if(!(c^45)) f=1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	if(f) x=-x;
}
int n,a[300005],c,b[300005],t[300005];
inline void add(int x,int w) {for(;x<=1000000000;x+=x&(-x)) t[x]+=w;}
inline int qry(int x) {int r=0;for(;x;x-=x&(-x)) r+=t[x];return r;}
inline void lisan()
{
	for(int i=1;i<=n;i++) t[i]=a[i];
	sort(t+1,t+n+1);
	int tmp=unique(t+1,t+n+1)-t-1;
	for(int i=1;i<=n;i++) a[i]=lower_bound(t+1,t+tmp+1,a[i])-t;
	memset(t,0,sizeof(t));
}
inline int lowbit(int a) {return a&(-a);}
inline void add(int x)
{
	for(int i=x;i<=n;i+=lowbit(i)) t[i]++;
}
inline int search(int l,int r)
{
	int s1=0,s2=0;
	for(int i=l-1;i>=1;i-=lowbit(i)) s1+=t[i];
	for(int i=r;i>=1;i-=lowbit(i)) s2+=t[i];
	return s2-s1;
}
int main()
{
	read(n);int x;read(x);
	for(int i=1;i<=n;i++) read(a[i]);
	read(x);long long ans=0;int qwq=a[x];
	for(int i=1;i<=n;i++) if(a[i]<=qwq) b[++c]=a[i],a[i]=-1;
	sort(b+1,b+c+1);
	for(int i=1,l=0;i<=n;i++) if(a[i]==-1) a[i]=b[++l];
	lisan();//在下一行a[i]+1或者a[i]
	for(int i=1;i<=n;i++) {ans+=search(a[i],n);add(a[i]);}
	return printf("%lld\n",ans),0;
}
2020/10/30 20:39
加载中...