莫队,卡常数


题目地址

  • 思路

    • 设\(\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: 2038User: Bj2002Language: C++Result: AcceptedTime:11036 msMemory: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!

转载于:https://www.cnblogs.com/bj2002/p/10791896.html

[题解] 2038: [2009国家集训队]小Z的袜子(hose)相关推荐

  1. 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门

    题目链接:2038: [2009国家集训队]小Z的袜子(hose) 题目: Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再 ...

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

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

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

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

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

    题目传送门 1 /* 2 莫队算法:求出[l, r]上取出两只相同袜子的个数. 3 莫队算法是离线处理一类区间不修改查询类问题的算法.如果你知道了[L,R]的答案,可以在O(1)的时间下得到 4 [L ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 15879  Solved: 7205 [S ...

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

    莫队也是暴力的一种,不过可以很有效的降低复杂度 如果我们已知[l, r]的答案,能在O(1)时间得到[l+1,r]的答案以及[l, r-1]的答案,即可使用莫队算法. 时间复杂度为O(n^1.5).如 ...

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

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...

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

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...

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

    题目大意: Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说, ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 莫队算法可以解决一类不修改.离线查询问题.而这题可以用莫队来做. *我是看这个论文学 ...

最新文章

  1. [题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)
  2. 最大流 ---- 最大密度子图 ----- 2014-2015 ACM-ICPC, Asia Xian Regional Contest C The Problem Needs 3D Arrays
  3. 烧钱大战数以亿计 无人驾驶无法突破局限?
  4. 安装Live communication server 2005存档服务
  5. 启动项目的时候,一直打印日志
  6. jQuery UI resizble、draggable的div包含iframe导致缩放和拖拽的不平滑解决方法
  7. 【Asp.net】Cookie对象
  8. 晨风机器人突破限制_厉害了!工程建设领域首创!会自动测量、自动调平的测量机器人...
  9. 前端学习(2706):重读vue电商网站26之JSON格式的配置文件
  10. IntelliJ IDEA 设置代码检查级别
  11. java 调用window程序_Windows下Java调用可执行文件代码实例
  12. CSS3 Version
  13. c#特性 java注解,Java注解全面了解
  14. Remote Desktop Connection Manager (RDCMan)
  15. LeetCode 刷题记录模板
  16. Unite 2018展区全曝光,Made with Unity精彩游戏等你来体验
  17. java面向对象小知识
  18. Excel如何将工作表按照表内某一单元格命名
  19. IP-guard功能详解——屏幕监控
  20. 贵州支教之第一天(11月7日)

热门文章

  1. mysql group日期_MySQL GROUP BY使用datetime时的日期?
  2. Security+ 学习笔记6 了解漏洞的类型
  3. Kubernetes详解(十七)——Pod存活性探针应用实战
  4. 复习各种符号 字符 巩固基础2
  5. 使用yo -v查看yeoman版本号
  6. 关于Sliverlight的一些问题
  7. redhat solutions
  8. Nginx怎么打开目录浏览功能
  9. 春节7天新增病毒54万 钓鱼欺诈成最大威胁
  10. 也乱弹Book.Save而引OO对话