全RE求助
查看原帖
全RE求助
1076440
Kano_zyc楼主2023/12/23 17:02

rt,萌新求条

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,k;
int a[N],cnt[N];
int tmp[N],blong[N],B;
int L=1,R;
struct Kano{
    int l,r;
    int id;
}q[N];

struct Kano1{
    int fz,fm;
    int id;
}ans[N];

bool cmp(Kano a, Kano b)
{
    if(blong[a.l]!=blong[b.l]) return blong[a.l]<blong[b.l];
    return a.r<b.r;
}

int main()
{
    scanf("%d %d",&n,&m);
    
    B = pow(n,0.5);
    
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);

    for(int i=1; i<=n; i++)
        blong[i] = ceil(i*1.0/B);
        
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d",&q[i].l,&q[i].r);
        q[i].id = i;
    }
    
    sort(q+1, q+m+1, cmp);
    
    int fz1 = 0, fm1 = 0;
    
    for(int i=1; i<=m; i++)
    {
        int len = R - L + 1;
        
        while(q[i].l > L)
        {
            fm1 -= len * (len - 1) / 2;
            len--;
            fm1 += len * (len - 1) / 2;
            fz1 -= tmp[a[L]] * (tmp[a[L]] - 1) / 2;
            tmp[a[L]]--;
            fz1 += tmp[a[L]] * (tmp[a[L]] - 1) / 2;
            L++;
        }
        while(q[i].l < L)
        {
            L--;
            fm1 -= len * (len - 1) / 2;
            len++;
            fm1 += len * (len - 1) / 2;
            fz1 -= tmp[a[L]] * (tmp[a[L]] - 1) / 2;
            tmp[a[L]]++;
            fz1 += tmp[a[L]] * (tmp[a[L]] - 1) / 2;
        }
        while(q[i].r > R)
        {
        	fm1 -= len * (len - 1) / 2;
            len++;
            fm1 += len * (len - 1) / 2;
            R++;
            fz1 -= tmp[a[R]] * (tmp[a[R]] - 1) / 2;
            tmp[a[R]]++;
            fz1 += tmp[a[R]] * (tmp[a[R]] - 1) / 2;
        }
        while(q[i].r < R)
        {
        	fm1 -= len * (len - 1) / 2;
            len--;
            fm1 += len * (len - 1) / 2;
            fz1 -= tmp[a[R]] * (tmp[a[R]] - 1) / 2;
            tmp[a[R]]--;
            fz1 += tmp[a[R]] * (tmp[a[R]] - 1) / 2;
            R--;
        }
        ans[q[i].id].fz = fz1;
        ans[q[i].id].fm = fm1;
    }
    for(int i=1; i<=m; i++)
    {
        int gcd = __gcd(ans[i].fz, ans[i].fm);
        printf("%d/%d\n", ans[i].fz / gcd, ans[i].fm / gcd);
    }
    
    return 0;
}                           

2023/12/23 17:02
加载中...