2019.7.4 莫队

今儿练了一下莫队

先是死活过不了样例,后面是一直 t
大概调了半小时
直接全文匹配正确代码

最后发现几个不易察觉的错误
我想看和做算法是截然不同的概念
不去真正的敲一遍是做不出一类题的

对于本题小B的询问

排序方法是 若右端点在同一个块,则以左端点从小到大,否则右端点总小到大

还有inline要尽量加上

还有l要置1,r置0

中途sort还给加了n参数,很伤

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[50005],b[50005],anss[50005];
ll block;
ll ans=0;
struct node {
	ll l,r,id;
}p[50005];

bool cmp(node x,node y){
	return (x.r/block)==(y.r/block)?x.l<y.l:x.r<y.r;//(((x.l/block)&1)?x.r<y.r:x.r>y.r)
}
inline void add(int x){
	
	b[a[x]]++;
	ans+=b[a[x]]*2-1;
}
inline void del(int x){
	
	b[a[x]]--;
	ans-=b[a[x]]*2+1;
}
int main(){
	ll n,m,k;
	scanf("%lld%lld%lld",&n,&m,&k);
	block=sqrt(n); 
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(ll i=1;i<=m;i++){
		scanf("%lld%lld",&p[i].l,&p[i].r);
		p[i].id=i;
	}
	sort(p+1,p+m+1,cmp);
	int l=1,r=0;
	for(ll i=1;i<=m;i++){
		while(l<p[i].l){
			del(l);
			l++;
		}
		while(l>p[i].l){
			l--;
			add(l);
		}
		while(r<p[i].r){
			r++;
			add(r);
		}
		while(r>p[i].r){
			del(r);
			r--;
		}
		anss[p[i].id]=ans;
	}
	for(ll i=1;i<=m;i++){
		printf("%lld\n",anss[i]);
	}
	return 0;
}

这个排序方法还需斟酌
如果排还是会T

发布了61 篇原创文章 · 获赞 8 · 访问量 2477

猜你喜欢

转载自blog.csdn.net/weixin_43982216/article/details/94619068