昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的。

(这里n,m,k我就不区分了)

首先一个城市的询问可以很容易的二分

check用树状数组维护区间(区间修改,单点查询的那种)

一次是\(O(nlog^2n)\)

n次就是\(O(n^2log^2n)\)

但是我们check的时候都是树状数组维护,询问相同

我们就可以整体二分(顾名思义)

把区间考虑成二叉树(类似线段树的形状)

我们每一层用一遍树状数组

查询的话,一个国家用一个链表存下所在的点

因为深度是\(logn\)的

复杂度是还是差不多的\((Onlog^2n)\)

妙啊

会炸long long 及时break就好

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <utility>
  6. #include <vector>
  7. #define ll long long
  8. using namespace std;
  9. const int N = 5e5+7;
  10. int read() {
  11. int x = 0,f = 1;char s = getchar();
  12. for(; s > '9'||s < '0'; s = getchar()) if(s == '-') f = -1;
  13. for(; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
  14. return x * f;
  15. }
  16. int n, m, k;
  17. int L[N], R[N], w[N], need[N], ans[N];
  18. pair<int,int> erfen[N];
  19. vector<int> hav[N];
  20. namespace BIT {
  21. ll sum[N];
  22. void add(int id, ll ad) {for(int i = id; i <= m; i += (i&-i)) sum[i] += ad;}
  23. ll query(int id) {ll ans = 0;for(int i = id; i >= 1;i -= (i&-i)) ans += sum[i]; return ans;}
  24. void modify(int l, int r, ll ad) {add(l, ad), add(r + 1, -ad);}
  25. void clear() {memset(sum, 0, sizeof(sum));}
  26. }
  27. void solve() {
  28. vector<pair<int,int> > Q;
  29. for(int i = 1; i <= n; ++i)
  30. if(erfen[i].first!=k+1&&erfen[i].first <= erfen[i].second)
  31. Q.push_back(make_pair((erfen[i].first+erfen[i].second)>>1,i));
  32. if(Q.empty()) return;
  33. sort(Q.begin(), Q.end());
  34. BIT::clear();
  35. for(int i = 1, js = 0;i <= k; ++ i) {
  36. if(L[i] <= R[i]) BIT::modify(L[i], R[i], (ll)w[i]);
  37. else BIT::modify(L[i], m, w[i]), BIT::modify(1, R[i], (ll)w[i]);
  38. while(js < Q.size() && Q[js].first == i) {
  39. int id = Q[js].second;
  40. ll tmp=0;
  41. for(vector<int>::iterator it = hav[id].begin();it != hav[id].end(); ++it) {
  42. tmp += BIT::query(*it);
  43. if(tmp>=(ll)need[id]) break;
  44. }
  45. if(tmp>=(ll)need[id])
  46. ans[id] = i,erfen[id].second = i - 1;
  47. else
  48. erfen[id].first = i + 1;
  49. ++js;
  50. }
  51. }
  52. solve();
  53. }
  54. int main() {
  55. //read
  56. n = read(), m = read();
  57. for(int i = 1; i <= m; ++i) {
  58. int x = read();
  59. hav[x].push_back(i);
  60. }
  61. for(int i = 1; i <= n; ++i) need[i] = read();
  62. k = read();
  63. for(int i = 1; i <= k; ++i) L[i] = read(), R[i] = read(), w[i] = read();
  64. for(int i = 1; i <= n; ++i) erfen[i].first = 1, erfen[i].second = k+1;
  65. //work
  66. solve();
  67. //print
  68. for(int i = 1;i <= n; ++i) {
  69. if(ans[i]) printf("%d\n", ans[i]);
  70. else puts("NIE");
  71. }
  72. return 0;
  73. }

bzoj 2527: [Poi2011]Meteors的更多相关文章

  1. BZOJ 2527 [Poi2011]Meteors(整体二分)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2527 [题目大意] 有N个成员国.现在它发现了一颗新的星球, 这颗星球的轨道被分为M份 ...

  2. BZOJ 2527 [Poi2011]Meteors:整体二分

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527 题意: 有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站, ...

  3. bzoj 2527: [Poi2011]Meteors 整体二分

    给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...

  4. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  5. 2527: [Poi2011]Meteors[整体二分]

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1528  Solved: 556 [Submit][S ...

  6. BZOJ.2527.[POI2011]MET-Meteors(整体二分)

    题目链接 BZOJ 洛谷 每个国家的答案可以二分+求前缀和,于是可以想到整体二分. 在每次Solve()中要更新所有国家得到的值,不同位置的空间站对应不同国家比较麻烦. 注意到每次Solve()其国家 ...

  7. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

  8. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

  9. BZOJ 2527 Meteors | 整体二分

    BZOJ 2527 Meteors 题意 一个圆环上有m个位置,编号为1~m,分别属于n个国家. 有k个时刻,每个时刻都会给圆环上的一个区间中每个位置的值加上一个数. 每个国家有一个目标,问对于每个国 ...

随机推荐

  1. 大话设计模式C++ 适配器模式

    适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作. 角色: (1)Target:这是客户所期待的接口,Target可以 ...

  2. C#回调浅析(委托、接口回调)

    https://wenku.baidu.com/view/ed724173bd64783e08122b2f.html

  3. Knowing is not enough; we must apply. Willing is not enough; we must do.

    Knowing is not enough; we must apply. Willing is not enough; we must do. 仅限于知道是不够的,我们必须去实践:单纯的希望是不够的 ...

  4. jdk和jre区别

  5. java中的神奇"this"

    java中的神奇"this",神奇的原因事它能不用new就可以直接创造一个对象出来,后来研究发现,其实java的“this”使用时,也是"new"了一个当前的对 ...

  6. go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量

    go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...

  7. Anaconda下载及安装及查看安装的Python库用法

    Anaconda下载及安装及查看安装的Python库用法 Anaconda 是一个用于科学计算的 Python 发行版,提供了包管理与环境管理的功能.Anaconda 利用 conda 来进行 pac ...

  8. win10 校园宽带连接不上的解决办法(错误720、“以太网”没有有效的ip设置)

    遇到的问题如下图所示: 插上宽带后,查看以太网状态显示如下: 创建新连接宽带(PPPoE)(R)后,连接失败,错误为720,显示如下: 以太网网络诊断后,结果显示“以太网”没有有效的Ip设置,如下图所 ...

  9. 关于js的日期处理

    1.日期转换(Date)方法一:String变为Date var t = "2015-03-16";var array =  t.split("-");var ...

  10. Linux查看机器和硬盘的SN

    查看硬件RAID中某块硬盘SN # sas 口: [root@ ~]$ smartctl -a /dev/sda -d megaraid,n *** Serial number: 6RJ974SR * ...