2 条题解

  • 0
    @ 2026-1-12 19:57:55

    #include <bits/stdc++.h>
    #define block(i) ((i + b - 1) / b)
    #define gcd __gcd
    #define N 50034
    using namespace std;
    
    typedef long long ll;
    
    struct req{
        int st, en, id, ans;
        req *read(int id0 = 0){scanf("%d%d", &st, &en); id = id0; return this;}
    };
    
    int n, q, b;
    int i, lp, rp, cur;
    ll x, y, d;
    int a[N], cnt[N];
    char ans[N][20];
    req r[N];
    
    bool cmp(const req &x, const req &y){
        int bx = block(x.st), by = block(y.st);
        return bx < by || (bx == by && x.en < y.en);
    }
    
    void add(int pos, int val){
        cnt[a[pos]] += val;
        cur = cur + (~val ? cnt[a[pos]] << 1 : -cnt[a[pos]] << 1) - 1;
    }
    
    int main(){
        scanf("%d%d", &n, &q);
        b = (int)(sqrt(n) + 1e-6);
        for(i = 1; i <= n; i++)
            scanf("%d", a + i);
        for(i = 0; i < q; i++)
            r[i].read(i);
        sort(r, r + q, cmp);
        lp = 1;
        rp = 0;
        cur = 0;
        memset(cnt, 0, sizeof cnt);
        for(i = 0; i < q; i++){
            while(rp < r[i].en) add(++rp, 1);
            while(rp > r[i].en) add(rp--, -1);
            while(lp < r[i].st) add(lp++, -1);
            while(lp > r[i].st) add(--lp, 1);
            r[i].ans = cur;
        }
        for(i = 0; i < q; i++){
            y = (ll)r[i].en - (ll)r[i].st + 1;
            x = (ll)r[i].ans - y;
            y *= (y - 1);
            d = gcd(x, y);
            sprintf(ans[r[i].id], "%lld/%lld", x /= d, y /= d);
        }
        for(i = 0; i < q; i++)
            puts(ans[i]);
        return 0;
    }
    
    
    • 0
      @ 2025-10-8 17:05:20

      C112 莫队算法 P1494 [国家集训队] 小 Z 的袜子

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=5e4+10;
      int n,m,a[N],B;
      LL cnt[N],ans1[N],ans2[N],sum;
      struct node{ int l,r,id;}q[N];
      bool cmp(const node &n1,const node &n2){return n1.l/B != n2.l/B ? n1.l<n2.l : (n1.l/B & 1 ? n1.r<n2.r : n1.r > n2.r );}
      void add(int x)
      {
          sum+=cnt[x];
          cnt[x]++;
      
      }
      void del(int x)
      {
          cnt[x]--;
          sum-=cnt[x];
      }
      int main()
      {
          scanf("%d%d",&n,&m);
          B=sqrt(n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);
          for(int i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
          sort(q+1,q+1+m,cmp);
          sum=0;memset(cnt,0,sizeof(cnt));
          for(int i=1,l=1,r=0;i<=m;i++)
          {
              while(l>q[i].l) add(a[--l]);
              while(r<q[i].r) add(a[++r]);
              while(l<q[i].l) del(a[l++]);
              while(r>q[i].r) del(a[r--]);
              ans1[q[i].id]=sum;
              ans2[q[i].id]=1ll*(r-l+1)*(r-l)/2;
          }
          for(int i=1;i<=m;i++)
          {
              if(ans1[i]==0)printf("0/1\n");
              else 
              {
                  LL d=__gcd(ans1[i],ans2[i]);
                  printf("%lld/%lld\n",ans1[i]/d,ans2[i]/d);
              }
          }
          return 0;
      }
      
      • 1

      C112【莫队算法】区间不同:区间两数相同的概率[国家集训队] 小 Z 的袜子

      信息

      ID
      3703
      时间
      200ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      95
      已通过
      20
      上传者