我就不该碰莫队的(指全WA)
查看原帖
我就不该碰莫队的(指全WA)
183761
lvyijia44楼主2020/10/31 16:57
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=5e4+5;

inline int read(){
	int ans=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		ans=(ans<<3)+(ans<<1)+(ch&15);
		ch=getchar();
	}
	return ans*f;
} 
inline void p(int m){
	if(m/10)p(m/10);
	putchar(m%10+'0');
}

int n,m,s[maxn];
struct question{
	int l,r,a,b,id;
}q[maxn];
int belong[maxn],c[maxn];

inline bool cmp(question a,question b){
	return (belong[a.l]^belong[b.l]) ? belong[a.l]<belong[b.l] : ((belong[a.l]&1) ? a.r<b.r : a.r>b.r);
}
inline bool cmp1(question a,question b){
	return a.id<b.id;
}

inline int gcd(int a,int b){
	if(!b)return a;
	return gcd(b,a%b);
}
inline void fs(int a,int b){
	if(!a)printf("0/1\n");
	else {
		int c=gcd(a,b);
		printf("%d/%d\n",a/c,b/c);
	}
	return;
}

int main(){//putchar('\n');
	n=read();m=read();
	int size=sqrt(n);
	int bnum=ceil((double)n/size);
	for(int i=1;i<=bnum;i++)
		for(int j=(i-1)*size+1;j<=i*size;j++)
			belong[j]=i;
			
	for(int i=1;i<=n;i++)
		s[i]=read();
	
	for(int i=1;i<=m;i++){
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	int ans=0;
	for(int j=1,l=1,r=0;j<=m;j++){
		int ql=q[j].l,qr=q[j].r;
		while(ql<l){
			l--;
			ans=ans+((c[s[l]]<<1)|1);
			c[s[l]]++;
		}
		while(ql>l){
			ans=ans-(c[s[l]]<<1)+1;
			c[s[l]]--;
			l++;
		}
		while(qr<r){
			ans=ans-(c[s[r]]<<1)+1;
			c[s[l]]--;
			r--;
		}
		while(qr>r){
			r++;
			ans=ans+((c[s[r]]<<1)|1);
			c[s[r]]++;
		}
		if(q[j].l==q[j].r)
			q[j].a=0,q[j].b=1;
		else {
			q[j].a=ans-r+l-1;
			q[j].b=(r-l+1)*(r-l);
		}
	}
	sort(q+1,q+m+1,cmp1);
	for(int i=1;i<=m;i++)
		fs(q[i].a,q[i].b);
	return 0;
}
/*

车

马  车 

*/ 
2020/10/31 16:57
加载中...