BZOJ2038: 小Z的袜子

Problem :

N只袜子排成一排,每次询问一个区间内的袜子种随机拿两只袜子颜色相同的概率。

Solution :

莫队算法真的是简单易懂又暴力。

莫队算法用来离线处理区间询问,要求每次区间的端点左右移动1可以直接求出,通过第一关键字分块排序左端点,第二关键字排序右端点,来合理安排询问的顺序,使得总的时间复杂度下降。每次询问直接暴力修改就行。

假设分为k块,每块大小为n/k。

那么左端点移动总的时间复杂度为 n * n / k

右端点移动总的时间复杂度为 k * n + n * k

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <string>
  7. #include <map>
  8. #include <vector>
  9. #include <queue>
  10. #include <ctime>
  11. using namespace std;
  12. #define f(i, x, y) for (int i = x; i <= y; ++i)
  13. #define fd(i, x, y) for (int i = x; i >= y; --i)
  14. #define rep(i, x, y) for (int i = x; i <= y; ++i)
  15. #define repd(i, x, y) for (int i = x; i >= y; --i)
  16. queue <int> Q;
  17. const int INF = 1e9 + 7;
  18. const int N = 200008;
  19. int n, m, q;
  20. vector <int> vec[N];
  21. int dp[N];
  22. int cnt[N], vis[N];
  23. void init()
  24. {
  25. srand(time(NULL));
  26. cin >> n >> m;
  27. for (int i = 1; i <= n; ++i)
  28. vec[i].clear();
  29. for (int i = 1; i <= m; ++i)
  30. {
  31. int u, v;
  32. cin >> u >> v;
  33. vec[u].push_back(v);
  34. vec[v].push_back(u);
  35. }
  36. }
  37. void solve()
  38. {
  39. for (int i = 1; i <= n; ++i)
  40. dp[i] = rand() % 4;
  41. for (int i = 1; i <= n; ++i) Q.push(i), vis[i] = 1;
  42. while (!Q.empty())
  43. {
  44. int u = Q.front(); Q.pop(); vis[u] = 0;
  45. for (int i = 0; i < 4; ++i) cnt[i] = 0;
  46. for (auto v : vec[u]) cnt[dp[v]]++;
  47. if (cnt[dp[u]] <= 1) continue;
  48. int qmin = INF, cl = 0;
  49. for (int i = 0; i < 4; ++i)
  50. if (cnt[i] < qmin)
  51. {
  52. qmin = cnt[i];
  53. cl = i;
  54. }
  55. dp[u] = cl;
  56. for (auto v : vec[u])
  57. if (dp[v] == cl && !vis[v])
  58. Q.push(v);
  59. }
  60. for (int i = 1; i <= n; ++i)
  61. printf("%c",'a' + dp[i]);
  62. printf("\n");
  63. }
  64. int main()
  65. {
  66. cin.sync_with_stdio(0);
  67. int T; cin >> T;
  68. for (int cas = 1; cas <= T; ++cas)
  69. {
  70. init();
  71. solve();
  72. }
  73. }

BZOJ2038 (莫队)的更多相关文章

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

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目: 题意:中文题意,大家都懂. 思路:莫队入门题.不过由于要去概率,所以我们假 ...

  2. [bzoj2038]莫队算法学习

    解题关键:莫队最重要的是区间之间以$O(1)$的复杂度进行转化,由于电脑原因,后续补上公式推导. #include<cstdio> #include<cstring> #inc ...

  3. BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】

    BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...

  4. BZOJ2038 小Z的袜子 (莫队算法)

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

  5. [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队

    小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...

  6. BZOJ2038 小Z的袜子 莫队

    BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...

  7. 【填坑向】bzoj2038小Z的袜子 莫队

    学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...

  8. 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队

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

  9. [BZOJ2038]小Z的袜子(莫队算法)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 分析:莫队算法 莫队算法是一种思想…… 处理问题:不带修改的区间询问 使用要求:[l-1 ...

随机推荐

  1. 学习Python的day1

    自己以前从来没有写博客的想法,但是学Python,里面的老师也说了,写博客可以加深自己的记忆,也能回顾内容.还能给别人参考.挺值的.2017-09-16 一. Python介绍 python的创始人为 ...

  2. 盘点那些年,被Oracle收购的公司

    微博上看到一图,很清晰.盘点那些年,被Oracle收购的公司,Oracle日益强大,都收购了哪些公司呢?别再以为只有Sun啦...看看你都知道哪些? ps:Strategic Acquisitions ...

  3. Java JDK装配置

     1- 介绍 本文章介绍JAVA开发环境安装是基于:  Java8(JDK8) 2- 下载JDK http://www.oracle.com/technetwork/java/javase/dow ...

  4. Linux/Windows 实用工具简记

    以下只是开发中可能用的比较多的工具,另外还有其他很多未曾提及的实用工具.Linux篇: 1.链接过程的调试:主要用于查看构建过程:如链接时加载的动态库以及运行时加载动态库过程的调试 支持LD_DEBU ...

  5. Unity3D_最简单的开始界面_结束界面

    开始界面1.创建一个新的场景添加button 2.C#脚本LoadingGame.cs using System.Collections;using System.Collections.Generi ...

  6. ::Sleep(0)的使用

    ::Sleep(0)的使用 This function causes a thread to relinquish the remainder of its time slice and become ...

  7. css实现水平/垂直居中效果

    一.如果是已知宽高的元素做水平/垂直居中效果的话,可以直接用具体的数值指定定位布局或偏移布局,这个就不过多讨论.这里主要介绍在不知宽高或需要弹性布局下的几种实现方式. 二.1.table表格法思路:显 ...

  8. 前端拖动div 效果

    /** * author levi * url http://levi.cg.am */ $(function() { $(document).mousemove(function(e) { if(! ...

  9. 纯css实现同一页面下选择之后更换内容效果

    实现效果为如下:在同一页面下,当我选中输入手机号时,出现手机号输入框,当我选中输入验证码时,出现验证码输入框,当我选中设置密码时,出现密码框 在这里有一个小技巧,就是  1.对下面的输入框设置同样的样 ...

  10. C++11程序设计要点总结-模板机制详解

    C++程序设计要点总结 在编程的过程中呢我们总会遇到一些各种各样的问题,就比如在写方法的时候,我们一个同样的方法要写好几种类型的呢,这让我们很伤脑筋,但是呢C++有一个强大的功能就是模板机制,这个模板 ...