救救我
  • 板块灌水区
  • 楼主Eterna
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/25 20:37
  • 上次更新2024/11/25 22:17:37
查看原帖
救救我
1348260
Eterna楼主2024/11/25 20:37

P5047调了一晚上还是不对,连样例都没过。。

主函数部分是正确的,玄关求条

#include<bits/stdc++.h>
#define int long long
#define N 100005
#define gc getchar()
#define rd read()
using namespace std;
inline int read()
{
	unsigned register int x=0,s=gc;
	while(s<'0'||s>'9')s=gc;
	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=gc;
	return x;
}
int n,m,a[N],A[N],bl,blv[N];
int ls[N],rs[N],ans[N];
struct node{int l,r,id,x;};
vector<node> cl[N],cr[N];
struct BIT
{
	int c[N];
	void add(int x,int y){while(x<=n)c[x]+=y,x+=(x&-x);}
	int sum(int x){int s=0;while(x)s+=c[x],x^=(x&-x);return s;}
	void clear(){memset(c,0,sizeof(c));}
}t1;
struct kuai
{
	int c[N],s[1000];
	void add1(int x){for(int i=blv[x]+1;i<=blv[n];i++)s[i]++;for(int i=x;blv[x]==blv[i]&&i<=n;i++)c[i]++;}
	void add2(int x){for(int i=1;i<=blv[x]-1;i++)s[i]++;for(int i=x;blv[x]==blv[i]&&i>=1;i--)c[i]++;}
	int sum(int x){return c[x]+s[blv[x]];}
	void clear(){memset(c,0,sizeof(c));memset(s,0,sizeof(s));}
}t2;
struct qur{int l,r,id;}q[N];
bool operator<(const qur x,const qur y)
{
	int a=x.l/bl,b=y.l/bl;
	return (a!=b?a<b:(x.r<y.r));
}
void init()
{
	sort(A+1,A+n+1);
	register int s=unique(A+1,A+n+1)-A-1;
    for(register int i=1;i<=n;i++)a[i]=lower_bound(A+1,A+s+1,a[i])-A;
    sort(q+1,q+m+1);
	for(int i=1;i<=n;i++)ls[i]=ls[i-1]+t1.sum(n)-t1.sum(a[i]),t1.add(a[i],1);
	t1.clear();
	for(int i=n;i>=1;i--)rs[i]=rs[i+1]+t1.sum(a[i]-1),t1.add(a[i],1);
}
void solve()
{
	for(int i=1;i<=n;i++)
	{
		t2.add2(a[i]-1);
		for(auto j:cl[i])
		{
			int l=j.l,r=j.r,id=j.id,is=j.x,sumv=0;
			for(int k=l;k<=r;k++)sumv+=t2.sum(a[k]);
			if(is)ans[id]+=sumv;
            else ans[id]-=sumv;
		}
	}
	t2.clear();
	for(int i=n;i>=1;i--)
	{
		t2.add1(a[i]+1);
		for(auto j:cr[i])
		{
			int l=j.l,r=j.r,id=j.id,is=j.x,sumv=0;
			for(int k=l;k<=r;k++)sumv+=t2.sum(a[k]);
			if(is)ans[id]+=sumv;
            else ans[id]-=sumv;
		}
	}
	exit(0);
}
signed main()
{
//	freopen("P5047_1.in","r",stdin);
//	freopen("out.out","w",stdout);
	n=rd,m=rd;bl=sqrt(n);
	for(int i=1;i<=n;i++)A[i]=a[i]=rd;
	for(int i=1;i<=n;i++)blv[i]=(i-1)/bl+1;
	for(int i=1;i<=m;i++)q[i]={rd,rd,i};
	init();
	for(int l=1,r=0,i=1;i<=m;i++)
	{
		int L=q[i].l,R=q[i].r,ID=q[i].id;
		if(r<R)cl[l-1].push_back({r+1,R,ID,0});
		if(r>R)cl[l-1].push_back({R+1,r,ID,1});
		if(l>L)cr[r+1].push_back({L,l-1,ID,0});
		if(l<L)cr[r+1].push_back({l,L-1,ID,1});
		ans[ID]+=ls[R]-ls[r];ans[ID]+=rs[L]-rs[l];
		l=L,r=R;
	}
	solve();
	for(int i=1;i<=m;i++)ans[q[i].id]+=ans[q[i-1].id];
	for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';	
	return 0;
} 
2024/11/25 20:37
加载中...