MLE求助
查看原帖
MLE求助
305854
Drind楼主2023/9/18 20:31

RT,有四个点 MLE 了。

#include<bits/stdc++.h>
using namespace std;
const int N=6e4+10;

struct node{
	int l,r,id,ans;
}q[N];

int a[N],pos[N];
int cnt[(1<<26)+10];
int ans;

bool cmp1(node x,node y){
	if(pos[x.l]==pos[y.l]) return x.r<y.r;
		return x.l<y.l;
}

bool cmp2(node x,node y){
	return x.id<y.id;
}

inline void fake_main(){
	int n,m; cin>>n>>m;
	int siz=max(1,(int)(n/sqrt(m)));
	for(int i=1;i<=n;i++) pos[i]=(i-1)/siz+1;
	string s; cin>>s; s=' '+s;
	for(int i=1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].l--; q[i].id=i;
	}
	for(int i=1;i<=n;i++) a[i]=a[i-1]^(1<<(s[i]-'a'));
	sort(q+1,q+m+1,cmp1);
	
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		for(;l<q[i].l;){
			for(int j=0;j<26;j++) cnt[a[l]^(1<<j)]--;
			cnt[a[l]]--;
			ans-=cnt[a[l]];
			l++;
		}
		for(;l>q[i].l;){
			l--; 
			ans+=cnt[a[l]];
			for(int j=0;j<26;j++) cnt[a[l]^(1<<j)]++;
			cnt[a[l]]++;
		}
		for(;r<q[i].r;){
			r++;
			ans+=cnt[a[r]];
			for(int j=0;j<26;j++) cnt[a[r]^(1<<j)]++;
			cnt[a[r]]++;
		}
		for(;r>q[i].r;){
			for(int j=0;j<26;j++) cnt[a[r]^(1<<j)]--;
			cnt[a[r]]--;
			ans-=cnt[a[r]];
			r--;
		}
		q[i].ans=ans;
	}
	sort(q+1,q+m+1,cmp2);
	
	for(int i=1;i<=m;i++) cout<<q[i].ans<<"\n";
}

signed main(){
	ios::sync_with_stdio(false);
	int t; t=1;
	while(t--) fake_main();
}

2023/9/18 20:31
加载中...