【求Juju们解答】只有最后一个AC,其他都是RE
查看原帖
【求Juju们解答】只有最后一个AC,其他都是RE
434567
不负ACM不负卿楼主2021/10/22 20:36
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define _for(i,l,r) for(int i=(l); i<=(r); i++)

inline int read(){
	int s = 0, w = 1;
	char ch = getchar();
	while(ch<'0' || ch >'9') {if(ch=='-') w = -1, ch = getchar();}
	while(ch>='0' && ch<='9') s=s*10 + ch-'0', ch = getchar();
	return s*w;
}

const int mmax = 5e4+5;

int N, M, block, ncnt = 0;
int a[mmax], cnt[mmax];
string res;
struct node{
	int l,r,id;
	int x, y;
}q[mmax];

bool cmp_block(node a, node b){
	if(a.l/block == b.l/block) return a.r < b.r;
	return a.l/block < b.l/block;
}
bool cmp_id(node a, node b){
    return a.id < b.id;
}

inline void add(int x) {ncnt += 1+2*cnt[a[x]], ++cnt[a[x]];}
inline void sub(int x) {ncnt += 1-2*cnt[a[x]], --cnt[a[x]];}

signed main(){
    N = read(), M = read();
	block = sqrt(N);
	_for(i,1,N) scanf("%lld", &a[i]);
	_for(i,1,M){
		scanf("%lld%lld", &q[i].l, &q[i].r);
		q[i].id = i;
	}
	sort(q+1, q+1+M, cmp_block);
	int l = 1, r = 0;
	_for(i,1,M){
		while(q[i].l < l) add(--l);
		while(q[i].r > r) add(++r);
		while(q[i].l > l) sub(l++);
		while(q[i].r < r) sub(r--);
		int a = ncnt-(r-l+1), b = (r-l+1)*(r-l);
        int gcd = __gcd(a, b);
        q[i].x = a/gcd, q[i].y = b/gcd;
	}
	sort(q+1, q+1+M, cmp_id);
	_for(i, 1, M) printf("%lld/%lld\n", q[i].x, q[i].y);
	return 0;
}

2021/10/22 20:36
加载中...