mx 求助莫队卡常
查看原帖
mx 求助莫队卡常
312306
LJ07楼主2022/5/31 23:11

rt , TLE on # 10

#include<bits/stdc++.h>
#define int long long
#define U(i,l,r) for(int i(l),END##i(r);i<=END##i;++i)
#define D(i,r,l) for(int i(r),END##i(l);i>=END##i;--i)
using namespace std;
inline int qr() {
	char c;bool f(1);
	while(!isdigit(c=getchar()))f=c!='-';
	int x(c^48);
	while(isdigit(c=getchar()))x=x*10+(c^48);
	return f?x:-x;
}
const int N(3e5+5);
int n,m,a[N+5],b[N+5],c[N+5],d[N+5];
map<int,int>cnt;
namespace Disc{
	int disc[N+5],tot;
	void insert(int x) {
		disc[++tot]=x;
	}
	void init() {
		sort(disc+1,disc+1+tot);
		tot=unique(disc+1,disc+1+tot)-(disc+1);
	}
	int ask(int x) {
		return lower_bound(disc+1,disc+1+tot,x)-disc;
	}
}; // namespace Disc
using namespace Disc;

namespace MD {
	#define QWQ array<int,3>
	QWQ inq[N+5];
	int block;
	bool cmp(QWQ a,QWQ b) {
		int t1(a[0]/block),t2(b[0]/block);
		if(t1==t2) return t1&1?(a[1]<b[1]):(a[1]>b[1]);
		return t1<t2;
	}
	
	int _ans[N+5],l(1),r,ans,cnt1[N+5],cnt2[N+5];
	
	void add(int p) {
		ans+=cnt2[b[p]]+cnt1[c[p]]+cnt1[d[p]];
		++cnt1[b[p]],++cnt2[c[p]],++cnt2[d[p]];
	}
	
	void del(int p) {
		--cnt1[b[p]],--cnt2[c[p]],--cnt2[d[p]];
		ans-=cnt2[b[p]]+cnt1[c[p]]+cnt1[d[p]];
	}
	
	void work() {
		block=sqrt(n);
		sort(inq+1,inq+1+m,cmp);
		U(i,1,m) {
			QWQ now(inq[i]);
			while(l>now[0]) add(--l);
			while(r<now[1]) add(++r);
			while(l<now[0]) del(l++);
			while(r>now[1]) del(r--);
			_ans[now[2]]=ans;
		}
	}
}; // namespace MD
using namespace MD;
signed main() {
	n=qr(),m=qr();
	U(i,1,n) a[i]=qr(),insert(a[i]),++cnt[a[i]];
	init();
	U(i,1,n) b[i]=ask(a[i]);
	U(i,1,n) {
		if(b[i]==1) c[i]=2;
		else if(b[i]==tot) c[i]=tot-1;
		else if(cnt[a[i]]!=1) c[i]=b[i];
		else {
			int tmp1(disc[b[i]]-disc[b[i]-1]);
			int tmp2(disc[b[i]+1]-disc[b[i]]);
			if(tmp1<=tmp2) c[i]=b[i]-1;
			if(tmp2<=tmp1) d[i]=b[i]+1;
		}
	}
	U(i,1,m) inq[i]={qr(),qr(),i};
	work();
	int Ans(0);
	U(i,1,m) /*cout<<_ans[i]<<endl,*/Ans+=i*_ans[i];
	printf("%lld",Ans);
}

2022/5/31 23:11
加载中...