TLE求助
查看原帖
TLE求助
758680
hzy_____楼主2023/7/17 21:29

rt

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int N=1e5+10;
int n,m,a[N],b[N],bl[N],c[N],len;
int t[N];
ll p[N][2];
inline void add(int k,int x){for(;k<=n;k+=k&(-k))t[k]+=x;}
inline int ask(int k){
	int ans=0;
	for(;k>0;k-=k&(-k))ans+=t[k];
	return ans;
}
struct query{int l,r,id;ll ans;}q[N];
bool cmp(query a,query b){
	if(bl[a.l]==bl[b.l]){
		if(bl[a.l]&1)return a.r<b.r;
		else return a.r>b.r;
	}
	return bl[a.l]<bl[b.l];
}
bool cmp1(query a,query b){return a.id<b.id;}
struct P{int l,r,id,op,k;}; 
vector<P> v[N][2];
void init(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i],c[i]=a[i];
	sort(c+1,c+n+1);
	int s=n/(sqrt(n)+1);
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(c+1,c+n+1,a[i])-c,bl[i]=(i-1)/s+1;
		add(a[i],1);
		p[i][0]=i-ask(a[i]);
	}
	memset(t,0,sizeof(t));
	for(int i=n;i>=1;i--){
		add(a[i],1);
		p[i][1]=ask(a[i]-1);
	}
	for(int i=1;i<=n;i++)p[i][0]+=p[i-1][0],p[i][1]+=p[i-1][1];
}
void work(){
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>l>>r;
		q[i]=(query){l,r,i};
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1,l=1,r=0;i<=m;i++){
		int L=q[i].l,R=q[i].r;
		if(r<R)v[l-1][1].push_back((P){r+1,R,i,-1}),q[i].ans+=(ll)p[R][0]-p[r][0],r=R;
		if(r>R)v[l-1][1].push_back((P){R+1,r,i,1}),q[i].ans-=(ll)p[r][0]-p[R][0],r=R;
		if(l>L)v[r+1][0].push_back((P){L,l-1,i,-1}),q[i].ans+=(ll)p[l-1][1]-p[L-1][1],l=L;
		if(l<L)v[r+1][0].push_back((P){l,L-1,i,1}),q[i].ans-=(ll)p[L-1][1]-p[l-1][1],l=L;
	}
	memset(t,0,sizeof(t));
	for(int i=1;i<=n;i++){
		add(a[i],1);
		for(P s:v[i][1])for(int t=s.l;t<=s.r;t++)q[s.id].ans+=(ll)s.op*(i-ask(a[t]));
	}
	memset(t,0,sizeof(t));
	for(int i=n;i>=1;i--){
		add(a[i],1);
		for(P s:v[i][0])for(int t=s.l;t<=s.r;t++)q[s.id].ans+=(ll)s.op*ask(a[t]-1);
	}
	for(int i=1;i<=m;i++)q[i].ans+=q[i-1].ans;
	sort(q+1,q+m+1,cmp1);
}
void print(){for(int i=1;i<=m;i++)cout<<q[i].ans<<endl;}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	init();
	work();
	print();
}
2023/7/17 21:29
加载中...