bzoj1062【Noi2008】糖果雨

首先给出的颜色没有用。

估计要用数据结构。而线段难以维护。

考虑把线段变成点

T是单增的。

所以询问的时候,存在的线段都可能贡献答案。

那些线段的位置如果可以统一一下就好了。

发现线段2*len一个循环

思路:把所有的线段移动到l=0

或者说,考虑l=0的时候,时间是多少

横坐标:x=(ti-d*l)%(2*len)(这个时间仅仅为了相对关系表示方便,实际上,这个线段可能根本不会在这个时间出现,不过没有关系)

纵坐标:y=r-l

这样的好处是,线段都是从l=0向右移动了

实际上坐标是多少,就意味着距离0还有多远

(看上面博客有图)

然后对于询问的t

分成一个图形,计算点的个数

转化为平行四边形

转化为矩形

二维树状数组维护

为了避免讨论

可以直接分成四块。不合法的直接面积返回0

注意时间轴的下标是从[0,2*len-1]的

所以树状数组还要集体平移1

细节较多。边界有些恶心

r==len的时候还要特别防止一个点统计两遍。

代码:

  1. #include<bits/stdc++.h>
  2. #define reg register int
  3. #define il inline
  4. #define numb (ch^'0')
  5. using namespace std;
  6. typedef long long ll;
  7. il void rd(int &x){
  8. char ch;x=;bool fl=false;
  9. while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  10. for(x=numb;isdigit(ch=getchar());x=x*+numb);
  11. (fl==true)&&(x=-x);
  12. }
  13. namespace Miracle{
  14. const int N=+;
  15. const int M=;
  16. int n,len;
  17. int mod;
  18. struct node{
  19. int x,y1,y2;
  20. }p[N];
  21. int cnt;
  22. int co[+];
  23. struct at{
  24. int f[*M][*M];
  25. void add(int x,int y,int c){
  26. //swap(x,y);
  27. while(x<){
  28. int tmp=y;
  29. while(tmp<){
  30. f[x][tmp]+=c;
  31. tmp+=tmp&(-tmp);
  32. }
  33. x+=x&(-x);
  34. }
  35. }
  36. int query(int x,int y){
  37. //swap(x,y);
  38. if(x<||y<) return ;
  39. ++x,++y;
  40. if(x>=*len) x=*len;
  41. if(y>=*len) y=*len;
  42. int ret=;
  43. // cout<<" x y "<<x<<" "<<y<<endl;
  44. while(x){
  45. int tmp=y;
  46. while(tmp){
  47. ret+=f[x][tmp];
  48. tmp-=tmp&(-tmp);
  49. }
  50. x-=x&(-x);
  51. }
  52. return ret;
  53. }
  54. }t1,t2;
  55. int get(int x1,int y1,int x2,int y2,int c){
  56. // cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<" "<<c-1<<endl;
  57. if(c==){
  58. int ret=t1.query(x2,y2)+t1.query(x1-,y1-)-t1.query(x1-,y2)-t1.query(x2,y1-);
  59. // cout<<" ret "<<ret<<endl;
  60. return ret;
  61. }else{
  62. int ret=t2.query(x2,y2)+t2.query(x1-,y1-)-t2.query(x1-,y2)-t2.query(x2,y1-);
  63. // cout<<" ret "<<ret<<endl;
  64. return ret;
  65. }
  66. }
  67. int sol(int t,int l,int r){
  68. int d=(r==len);
  69. return get(t,t+l,t+r,*len,)+get(,t+l-mod,t+r-mod-d,*len,)
  70. +get(t-r,l-t+mod,t-,*len,)+get(t-r+mod+d,l-t,mod-,*len,);
  71. }
  72. int main(){
  73. rd(n);rd(len);
  74. int op,t,c,l,r,d;
  75. mod=*len;
  76. while(n--){
  77. rd(op);
  78. if(op==){
  79. rd(t);rd(c);rd(l);rd(r);rd(d);
  80. ++cnt;
  81. p[cnt].x=(t-d*l+mod)%mod;
  82. p[cnt].y1=(r-l+p[cnt].x);
  83. p[cnt].y2=(r-l-p[cnt].x+mod);
  84. // cout<<" point "<<p[cnt].x<<" "<<p[cnt].y1<<" || "<<p[cnt].y2<<endl;
  85. co[c]=cnt;
  86. t1.add(p[cnt].x+,p[cnt].y1+,);
  87. t2.add(p[cnt].x+,p[cnt].y2+,);
  88. }else if(op==){
  89. rd(t);rd(l);rd(r);
  90. t%=mod;
  91. printf("%d\n",sol(t,l,r));
  92. }else{
  93. rd(t);rd(c);
  94. t1.add(p[co[c]].x+,p[co[c]].y1+,-);
  95. t2.add(p[co[c]].x+,p[co[c]].y2+,-);
  96. co[c]=;
  97. }
  98. }
  99. return ;
  100. }
  101.  
  102. }
  103. signed main(){
  104. Miracle::main();
  105. return ;
  106. }
  107.  
  108. /*
  109. Author: *Miracle*
  110. Date: 2019/1/8 14:12:04
  111. */

转化还是鬼斧神工

方向就是抓住时间单增,统一出发位置考虑,mod意义下处理,线段变成点,方便维护。

不规则图形转化,坐标翻转。

同时避免讨论的小trick也不错。(这还是对水平要求比较高的)

[NOI2008]糖果雨的更多相关文章

  1. 【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**

    1062: [NOI2008]糖果雨 Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成的.更加神奇的是, ...

  2. [bzoj1062] [NOI2008]糖果雨

    Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成的.更加神奇的是,天空中飘满了五颜六色的糖果云,很快糖果 ...

  3. 1062: [NOI2008]糖果雨 - BZOJ

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1062 神题一个,直接讲思路了(全都是看别人的) 首先我们把一个云用一个平面上的点( ...

  4. BZOJ 1062: [NOI2008]糖果雨(二维树状数组)

    首先嘛,这道题是非同一般的恶心= = 然后首先膜拜一下CDQ大神ORZ在考场上A了这道题ORZ 这道题看到的话,我是先想把云朵化成在0s时的位置,但很容易发现这样只能单点查询而不能查询整段 结果只能膜 ...

  5. bzoj1062【Noi2008】糖果雨

    orz.....神tm数形结合题 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1062 插入线段,删除线段,查询区间内线段个数,线段随时间往复 ...

  6. BZOJ 1062 糖果雨

    http://www.lydsy.com/JudgeOnline/problem.php?id=1062 思路:找到平行四边形以后,变换坐标:y->y-kx,k为斜率,这样变成了矩形,然后只要二 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. bzoj 1061~1065【Noi2008】解题报告

    这次Noi好像格外喜欢树形DpQAQ P.S.好像这次的题都与图有关QAQ bzoj1061[Noi2008]志愿者招募:上下界可行最小费用流 bzoj1062[Noi2008]糖果雨:数形结合&am ...

  9. 【FINAL】NOI

    我就是复习一下..根本就不是什么题解...谁也看不懂的... NOI2007 社交网络         最短路 货币兑换         斜率优化动态规划 项链工厂         线段树 生成树计数 ...

随机推荐

  1. 使用idea写ssm的时候提示源文件夹中的文件找不到

    <context:property-placeholder location="classpath:db.properties"/>这一行idea提示找不到db.pro ...

  2. html5新特性localStorage和sessionStorage

    HTML5 提供了两种在客户端存储数据的新方法: localStorage: (1)它的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失. (2)它的容量大小是5M作用 ...

  3. 第k小分数(二分值)

    //时间限制:10000ms //单点时限:1000ms //内存限制:256MB //描述 //给定N个不同的质数P1, P2, … PN.用它们作为分目可以组成(P1-1) + (P2-1) + ...

  4. html页面中完成查找功能

    最近在搞一个被很多人改了的框架,天天看代码看的头的晕了,不过感觉进步还挺大的,自己做了一个后台可配置前台查看两个库不同数据范围的东西,还挺满意,那天拿出来分享一下,今天先说一个这几天做的功能,就是ht ...

  5. POJ 1417 并查集 dp

    After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was finally cast ...

  6. Paper Reading - Mind’s Eye: A Recurrent Visual Representation for Image Caption Generation ( CVPR 2015 )

    Link of the Paper: https://ieeexplore.ieee.org/document/7298856/ A Correlative Paper: Learning a Rec ...

  7. 欢迎来怼—第三次Scrum会议

    一.会议成员 队名:欢迎来怼队长:田继平队员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片: 二.会议时间 2017年10月15日    17:15-17:41   总用时26min 三.会议地点 ...

  8. 元素相加交换另解&puts的一个用法

    #include<iostream> using namespace std; int main(){ int a,b; cin>>a>>b; a^=b; b^=a ...

  9. HDU 5233 Gunner II 离散化

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5233 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  10. lintcode-382-三角形计数

    382-三角形计数 给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形? 样例 例如,给定数组 S = {3,4,6,7},返回 3 其 ...