AC on 10,10pts,求调
查看原帖
AC on 10,10pts,求调
1269609
yiwugougou楼主2025/1/5 21:35
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Node{
	int l,r,bh;
}arr[50005];
int n,m,temp;
int vis[50005],colour[50005],ans[2][50005];
inline int read(){//此快读在网上盗取 
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-'){
            f=-1;
		}
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
    	x=x*10+ch-'0';
		ch=getchar();
	}
    return x*f;
}
bool cmp(Node x,Node y){
	if(x.l/temp!=y.l/temp){
		return x.l<y.l;
	}
	return ((int)(x.l/temp)&1?x.r<y.r:x.r>y.r);
}
signed main(){
	n=read();
	m=read();
	temp=sqrt(n);
	for(int i=1;i<=n;i++){
		colour[i]=read();
	}
	for(int i=1;i<=m;i++){
		arr[i].l=read();
		arr[i].r=read();
		arr[i].bh=i;
	}
	sort(arr+1,arr+m+1,cmp);
	int left=1,right=0;
	int sum=0;
	for(int i=1;i<=m;i++){
		while(left>arr[i].l){
			left--;
			sum-=vis[colour[left]]*vis[colour[left]];
			vis[colour[left]]++;
			sum+=vis[colour[left]]*vis[colour[left]]; 
		}
		while(right<arr[i].r){
			right++;
			sum-=vis[colour[right]]*vis[colour[right]];
			vis[colour[right]]++;
			sum+=vis[colour[right]]*vis[colour[right]];
		}
		while(left<arr[i].l){
			sum-=vis[colour[left]]*vis[colour[left]];
			vis[colour[left]]--;
			sum+=vis[colour[left]]*vis[colour[left]];
			left++;
		}
		while(right>arr[i].r){
			sum-=vis[colour[right]]*vis[colour[right]];
			vis[colour[right]]--;
			sum+=vis[colour[right]]*vis[colour[right]];
			right--;
		}
		if(arr[i].l==arr[i].r){
			ans[0][i]=0;
			ans[1][i]=1;
			continue;
		}
		ans[0][arr[i].bh]=sum-(arr[i].r-arr[i].l+1);
		ans[1][arr[i].bh]=1ll*(right-left+1)*(right-left);
		int g=__gcd(ans[0][arr[i].bh],ans[1][arr[i].bh]);
		ans[0][arr[i].bh]/=g;
		ans[1][arr[i].bh]/=g;
	}
	for(int i=1;i<=m;i++){
		printf("%lld/%lld\n",ans[0][i],ans[1][i]);
	}
	return 0;
}

~《此快读从网上盗取》~

2025/1/5 21:35
加载中...