题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527

题意:

  有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站,所有空间站按照顺序形成一个环,也就是说,m号空间站和1号空间站相邻。

  现在,将会有k场流星雨降临,每一场流星雨都会给区间[li,ri]内的每个空间站带来ai单位的陨石,每个国家都有一个收集陨石的目标pi,即第i个国家需要收集pi单位的陨石。

  询问:每个国家最早完成陨石收集目标是在第几场流星雨过后。

  1<=n,m,k<=300000

题解:

  整体二分。

  将所有的国家一起二分。

  对于当前的答案区间[l,r],先模拟下前mid场的流星雨,用树状数组维护。

  再将已经超出目标pi的国家放到左边;把没达到目标的放在右边,并将这些国家的需求减去已经收集到的数量。

  然后恢复刚才的流星雨,带上相应的国家,分别左右递归。

  当访问到叶子节点的时候(即l==r),当前存的国家的答案即为l。

AC Code:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. #define MAX_N 300005
  6. #define INF 100000000
  7.  
  8. using namespace std;
  9.  
  10. int n,m,t;
  11. int ct[MAX_N];
  12. int nd[MAX_N];
  13. int L[MAX_N];
  14. int R[MAX_N];
  15. int a[MAX_N];
  16. int ans[MAX_N];
  17. long long sum[MAX_N];
  18. long long dat[MAX_N];
  19. vector<int> sp[MAX_N];
  20.  
  21. void update(int k,int x)
  22. {
  23. while(k>)
  24. {
  25. dat[k]+=x;
  26. k-=k&-k;
  27. }
  28. }
  29.  
  30. long long query(int k)
  31. {
  32. long long sum=;
  33. while(k<=m)
  34. {
  35. sum+=dat[k];
  36. k+=k&-k;
  37. }
  38. return sum;
  39. }
  40.  
  41. void section(int l,int r,int x)
  42. {
  43. update(r,x);
  44. update(l-,-x);
  45. }
  46.  
  47. void meteor(int x,int f)
  48. {
  49. if(L[x]<=R[x]) section(L[x],R[x],a[x]*f);
  50. else section(L[x],m,a[x]*f),section(,R[x],a[x]*f);
  51. }
  52.  
  53. void read()
  54. {
  55. scanf("%d%d",&n,&m);
  56. for(int i=;i<=m;i++)
  57. {
  58. scanf("%d",&ct[i]);
  59. sp[ct[i]].push_back(i);
  60. }
  61. for(int i=;i<=n;i++)
  62. {
  63. scanf("%d",&nd[i]);
  64. }
  65. scanf("%d",&t);
  66. for(int i=;i<=t;i++)
  67. {
  68. scanf("%d%d%d",&L[i],&R[i],&a[i]);
  69. }
  70. t++;
  71. L[t]=; R[t]=t; a[t]=INF;
  72. }
  73.  
  74. void dfs(vector<int> v,int l,int r)
  75. {
  76. if(l==r)
  77. {
  78. for(int i=;i<v.size();i++)
  79. {
  80. ans[v[i]]=l;
  81. }
  82. return;
  83. }
  84. vector<int> vl,vr;
  85. int mid=(l+r)>>;
  86. for(int i=l;i<=mid;i++)
  87. {
  88. meteor(i,);
  89. }
  90. for(int i=;i<v.size();i++)
  91. {
  92. sum[v[i]]=;
  93. }
  94. for(int i=;i<v.size();i++)
  95. {
  96. for(int j=;j<sp[v[i]].size() && sum[v[i]]<nd[v[i]];j++)
  97. {
  98. int temp=sp[v[i]][j];
  99. sum[v[i]]+=query(temp);
  100. }
  101. }
  102. for(int i=;i<v.size();i++)
  103. {
  104. if(sum[v[i]]>=nd[v[i]]) vl.push_back(v[i]);
  105. else nd[v[i]]-=sum[v[i]],vr.push_back(v[i]);
  106. }
  107. for(int i=l;i<=mid;i++)
  108. {
  109. meteor(i,-);
  110. }
  111. dfs(vl,l,mid);
  112. dfs(vr,mid+,r);
  113. }
  114.  
  115. void solve()
  116. {
  117. memset(dat,,sizeof(dat));
  118. vector<int> v;
  119. for(int i=;i<=n;i++) v.push_back(i);
  120. dfs(v,,t);
  121. }
  122.  
  123. void print()
  124. {
  125. for(int i=;i<=n;i++)
  126. {
  127. if(ans[i]==t) printf("NIE\n");
  128. else printf("%d\n",ans[i]);
  129. }
  130. }
  131.  
  132. int main()
  133. {
  134. read();
  135. solve();
  136. print();
  137. }

BZOJ 2527 [Poi2011]Meteors:整体二分的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【BZOJ2527】[Poi2011]Meteors 整体二分

    [BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  8. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  9. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

随机推荐

  1. HTML5 2D平台游戏开发#11斜坡物理

    在游戏中会经常遇到斜坡地形,比如众所周知的魂斗罗,角色可以在坡上移动和跳跃: 斜坡在2D游戏中很常见,处理起来也较为棘手.最初我打算用分离轴定律来实现,在建立了一个物理模型之后: 发现上坡时没什么问题 ...

  2. 【边做项目边学Android】小白会遇到的问题--Appcompat_V7问题

    问题描写叙述: 首先遇到的问题就是adt版本号的选择,sdk版本号的选择: adt按非小白朋友说的选了最新的ADT-22.3.0,同一时候我也把sdk更新到了最新的(嗯.这个要fanqiang,或者找 ...

  3. Java Web开发笔记

    问题: 读取资源文件问题 servletContext.getRealPath() servletContext.getResouce().getPath() setvletContext.getRe ...

  4. c++中如何查看一个类的内存布局

    打开VS command prompt,输入下述命令可以看到对象的内存布局. cl a.cpp -d1 reportSingleClassLayout[classname] //  reportSin ...

  5. 基于Linux整形时间的常用计算思路

    上一次分享了Linux时间时区详解与常用时间函数,相信大家对Linux常见时间函数的使用也有了一定的了解,在工作中遇到类似获取时间等需求的时候也一定能很好的处理.本文基于Linux整形时间给出一些简化 ...

  6. Lumen开发:添加手机验证,中文验证与Validator验证的“半个”生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 添加手机验证方法可直接看这里:https://www.cnblogs.com/cxscode/p/9609828.html 今天来讲一下,Lume ...

  7. markdown流程图语法

    从网上找了非常久关于markdown语法的文章.机会微乎其微.大多所指向的都是同一个页面https://github.com/adrai/flowchart.js 这是github上的一个开源项目,里 ...

  8. Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站

    Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站 1.安装nginx和mono-fastcgi-server2 sodu apt-get  in ...

  9. [luogu3393]逃离僵尸岛

    [luogu3393]逃离僵尸岛 luogu 先把被禁止的点和新建的虚点n+1连0边 跑最短路,dis<=s的点价格为Q,否则为P, 再建图跑最短路 #define ll long long # ...

  10. 我的Android进阶之旅------>FastJson的简介

    在最近的工作中,在客户端和服务器通信中,需要采用JSON的方式进行数据传输.简单的参数可以通过手动拼接JSON字符串,但如果请求的参数过多,采用手动拼接JSON字符串,出错率就非常大了.并且工作效率也 ...