zoukankan      html  css  js  c++  java
  • 小Z的袜子(hose) HYSBZ

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll>pll;
    const int maxn=5e5+10;
    int n,m;
    int block;
    int a[maxn],belong[maxn];
    pll ans[maxn];
    ll sum;
    ll num[maxn];
    struct node{
        int l,r;
        int id;
    }q[maxn];
    bool cmp(node a,node b)
    {
        //先所在块 
        if(belong[a.l]==belong[b.l])
            return a.r<b.r;
        //按所在快排序 
        return belong[a.l]<belong[b.l];
    }
    void add(int x)
    {
        sum-=num[a[x]]*num[a[x]];
        num[a[x]]++;
        sum+=num[a[x]]*num[a[x]];
    }
    void del(int x)
    {
        sum-=num[a[x]]*num[a[x]];
        num[a[x]]--;
        sum+=num[a[x]]*num[a[x]];
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        int sz=sqrt(n);
        for(int i=1;i<=n;i++)
            belong[i]=i/sz;
        for(int i=1;i<=m;i++)
        {
            cin>>q[i].l>>q[i].r;
            q[i].id=i;
        }
        sort(q+1,q+1+m,cmp);
        int l=1,r=0;
        sum=0;
        for(int i=1;i<=m;i++)
        {
            int id=q[i].id;
            while(r<q[i].r)
            {
                r++;
                add(r);
            }
            while(r>q[i].r)
            {
                del(r);
                r--;
            }
            while(l>q[i].l)
            {
                l--;
                add(l);
            }
            while(l<q[i].l)
            {
                del(l);
                l++;
            }
            //减去重复拿相同的 
            ans[id].first=sum-(q[i].r-q[i].l+1);
            //所有方案 
            ans[id].second=(ll)(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
            if(ans[id].first==0)
            {
                ans[id].second=1;
                continue;
            } 
            ll tmp=__gcd(ans[id].first,ans[id].second);
            ans[id].first=ans[id].first/tmp;
            ans[id].second=ans[id].second/tmp;
        }
        for(int i=1;i<=m;i++)
            cout<<ans[i].first<<"/"<<ans[i].second<<endl;
        return 0;
    }
  • 相关阅读:
    Android OpenGL(2)
    Bootloader:BareBox
    Android OpenGL(1)
    Android脚本环境
    Android用户界面开发:事件处理
    S5PV210按键控制LED
    S5PV210控制蜂鸣器
    Windows Vista/Windows 7上安装wince5.0/6.0及SDK模拟器
    Makefile
    每日英语:Apps Reorder the Job Landscape
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12349500.html
Copyright © 2011-2022 走看看