莫队,卡常数


题目地址

  • 思路

    • 设\(\text{Vis[i]}\)为元素\(\text{i}\)在区间\(\text{[L,R]}\)的出现次数

    • 考虑区间\(\text{[L,R]}\)和元素\(\text{i}\),首次取出的概率为\(\frac{Vis[i]}{R-L+1}\),再次取出的概率是\(\frac{Vis[i]-1}{R-L}\)

    • 对于区间\(\text{[L,R]}\),答案为\(\sum_{i=1}^{N}{\frac{Vis[i](Vis[i]-1)}{(R-L)*(R-L+1)}}\)。

    • 这样,每次给变\(\text{[L,R]}\),分子的变化可以通过对前、后两项的值做差得到:

      • 设X=Vis[i],有:

      \[(X+1)X-(X)(X-1)=2X
      \]

    • 莫队这样修改即可。

  • Code

    • /**************************************************************
      Problem: 2038
      User: Bj2002
      Language: C++
      Result: Accepted
      Time:11036 ms
      Memory:2584 kb
      ****************************************************************/ #include <stdio.h>
      #include <string.h>
      #include <algorithm>
      #define GC getchar()
      #define Clean(X,K) memset(X,K,sizeof(X))
      using namespace std ;
      int Qread () {
      int X = 0 ;
      char C = GC ;
      while (C > '9' || C < '0') C = GC ;
      while (C >='0' && C <='9') {
      X = X * 10 + C - '0' ;
      C = GC ;
      }
      return X ;
      }
      long long GCD(long long M, long long N) {
      while (N != 0) {
      long long T = M % N;
      M = N;
      N = T;
      }
      return M;
      }
      const int Maxn = 50005 ;
      int N , M , A[Maxn] , Vis[Maxn] ;
      long long Ans[Maxn] , Sum[Maxn];
      struct Node {
      int Left , Right , Place;
      };
      Node Q[Maxn] ;
      bool Cmp (const Node &X , const Node &Y) {
      if (X.Left != Y.Left ) return X.Left < Y.Left ;
      if (X.Left & 1) return X.Right < Y.Right ;
      else return X.Right > Y.Right ;
      }
      bool Cmp2 (const Node &X , const Node &Y) {
      return X.Place < Y.Place ;
      }
      void Qwrite(int X) {
      if(X > 9) Qwrite(X / 10);
      putchar(X % 10 + '0');
      } int main () {
      // freopen ("P1494.in" , "r" , stdin) ;
      // freopen ("P1494.out", "w" , stdout) ;
      N = Qread () , M = Qread ();
      for (int i = 1 ; i <= N; ++ i) A[i] = Qread () ;
      for (int i = 1 ; i <= M; ++ i) Q[i].Left = Qread () , Q[i].Right = Qread () , Q[i].Place = i ;;
      sort (Q + 1 , Q + 1 + M , Cmp) ;
      Clean (Vis , 0) ;
      int L , R ;
      long long Now = 0 ;
      L = R = Q[1].Left ;
      Vis[A[L]] = 1 ;
      for (int i = 1 ; i <= M; ++ i) {
      while (L < Q[i].Left ) {
      -- Vis[A[L]] ;
      Now -= (Vis[A[L]] << 1) ;
      ++ L ;
      }
      // cout << L <<' '<<R <<' '<<Now<<endl;
      while (R < Q[i].Right ) {
      ++ R ;
      Now += (Vis[A[R]] << 1) ;
      ++ Vis[A[R]] ;
      }
      // cout << L <<' '<<R <<' '<<Now<<endl;
      while (R > Q[i].Right ) {
      -- Vis[A[R]] ;
      Now -= (Vis[A[R]] << 1) ;
      -- R ;
      }
      // cout << L <<' '<<R <<' '<<Now<<endl;
      Ans[Q[i].Place] = Now , Sum[Q[i].Place ] = ((long long)Q[i].Right - Q[i].Left ) * (Q[i].Right - Q[i].Left + 1) ;
      }
      std :: sort (Q + 1 , Q + 1 + M , Cmp2) ;
      for (int i = 1 ; i <= M; ++ i) {
      if (Q[i].Left == Q[i].Right ) printf ("0/1\n") ;
      else {
      int K = GCD (Ans[i] , Sum[i]) ;
      Ans[i] /= K , Sum[i] /= K ;
      printf ("%lld/%lld\n" , Ans[i] , Sum[i]) ;
      }
      }
      fclose (stdin) , fclose (stdout) ;
      return 0 ;
      }

Thanks!

[题解] 2038: [2009国家集训队]小Z的袜子(hose)的更多相关文章

  1. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  3. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  4. 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Subm ...

  8. 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...

  9. 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9472  Solved: 4344 Desc ...

随机推荐

  1. Linux时间子系统之(六):POSIX timer

    专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...

  2. ThinkPHP5+Apicloud+vue商城APP实战

    ThinkPHP5+Apicoud+vue商城APP实战 目录 章节1:项目概述 课时1apicloud平台介绍.04:38 课时2知识体系架构介绍.16:10 章节2:apicloud50分钟快速入 ...

  3. Python /usr/bin/python

    #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器: #!/usr/bin/env python这种用法是为了防止操作系统用户没有将pyth ...

  4. pdf在线加载·

    https://yq.aliyun.com/articles/40197  在线例子是这个

  5. Java开源生鲜电商平台-监控模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-监控模块的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-监控模块的设计与架构,我们谈到监控,一般设计到两个方面的内容: 1. 服务器本身的监控.(比如:linux ...

  6. C# 操作Word文本框——插入表格/读取表格/删除表格

    在文本框中,我们可以操作很多元素,如文本.图片.表格等,在本篇文章中将着重介绍如何插入表格到文本框,插入的表格我们可以对表格进行格式化操作来丰富表格内容.此外,对于文本框中的表格内容,我们也可以根据需 ...

  7. 请注意写代码的习惯与态度(Java)

    注: 以下内容引自http://blog.csdn.net/xtayfjpk/article/details/52136686 请注意写代码的习惯与态度(Java) 原创 2016年08月06日 16 ...

  8. Java 链接SQL Server 数据库

    1 //Java 连接 SQL Server数据库 2 public static final String DRIVERNAME="com.microsoft.sqlserver.jdbc ...

  9. BZOJ_1097_[POI2007]旅游景点atr_状压DP

    BZOJ_1097_[POI2007]旅游景点atr_状压DP 题面描述: FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣 的事情.经过这些城市的顺 ...

  10. poj3352添加多少条边可成为双向连通图

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13311   Accepted: 671 ...