果然看了理解了一下大牛的代码然后自己敲结果果然有不少错误

回复说,线段树做为一种数据结构,最好以一种风格过一题裸的然后作为自己的模板。。

二分写的也很恶心哪

还有题目稍复杂一点的注定得推敲各种公式,不光DP注意边界那样令自己恶心,就是这些公式+1,-1结果都是差之千里,或者自己根本调试不出来。

思路很重要,模板也比较重要,线段树裸敲的话容易出错,比树状数组出错几率大的多。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <iostream>
  8. #include <algorithm>
  9. #include <string>
  10. #include <queue>
  11. #include <set>
  12. #include <map>
  13. #include <vector>
  14. #include <assert.h>
  15.  
  16. using namespace std;
  17.  
  18. #define lowbit(i) (i&-i)
  19. #define sqr(x) ((x)*(x))
  20. #define enter printf("\n")
  21. #define is_sqr(x) (x&(x-1))
  22. #define pi acos(-1.0)
  23. #define clr(x) memset(x,0,sizeof(x))
  24. #define fp1 freopen("in.txt","r",stdin)
  25. #define fp2 freopen("out.txt","w",stdout)
  26. #define pb push_back
  27.  
  28. typedef long long LL;
  29.  
  30. const double eps = 1e-7;
  31. const double DINF = 1e100;
  32. const int INF = 1000000006;
  33. const LL LINF = 1000000000000000005ll;
  34. const int MOD = (int) 1e9 + 7;
  35. const int maxn=300005;
  36.  
  37. template<class T> inline T Min(T a,T b){return a<b?a:b;}
  38. template<class T> inline T Max(T a,T b){return a>b?a:b;}
  39. template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
  40. template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
  41.  
  42. struct Node
  43. {
  44. int l,r,sum,add;
  45. }node[maxn];//这地方也有技巧 线段树要存多大的数据 比如树高为H
  46. void build(int root,int l,int r)
  47. {
  48. node[root].l=l;
  49. node[root].r=r;
  50. node[root].add=-1;
  51. node[root].sum=0;
  52. if(node[root].l==node[root].r) return ;
  53. else
  54. {
  55. int mid=(l+r)/2;
  56. build(root*2,l,mid);
  57. build(root*2+1,mid+1,r);
  58. }
  59. }
  60. int query(int root,int l,int r)
  61. {
  62. if(node[root].l==l&&node[root].r==r) return node[root].sum;//又有错误
  63. if(node[root].add>=0)//更新子结点?
  64. {
  65. int ls=root*2,rs=root*2+1;
  66. //node[root].sum=(node[root].r-node[root].l+1)*node[root].add;
  67. //这一步不需要,前面已修改
  68. node[ls].sum=(node[ls].r-node[ls].l+1)*node[root].add;//两处错误
  69. node[rs].sum=(node[rs].r-node[rs].l+1)*node[root].add;// ls rs用不用更新?
  70. node[ls].add=node[rs].add=node[root].add;
  71. node[root].add=-1;
  72. }
  73. int ans=0;
  74. int mid=(node[root].l+node[root].r)/2;
  75. if(r<=mid)
  76. {
  77. return query(root*2,l,r);
  78. }
  79. else if(l>mid)
  80. {
  81. return query(root*2+1,l,r);
  82. }
  83. else
  84. {
  85. ans=query(root*2,l,mid);
  86. ans+=query(root*2+1,mid+1,r);
  87. }
  88. return ans;
  89. }
  90. void update(int root,int l,int r,int add)
  91. {
  92. if(node[root].l==l&&node[root].r==r)//不够掌握的就是他这块的更新和上面的什么关系
  93. {
  94. node[root].add=add;
  95. node[root].sum=(node[root].r-node[root].l+1)*node[root].add;
  96. return;
  97. }
  98. int mid=(node[root].l+node[root].r)/2;
  99. if(r<=mid)
  100. {
  101. update(root*2,l,r,add);
  102. }
  103. else if(l>mid)
  104. {
  105. update(root*2+1,l,r,add);
  106. }
  107. else
  108. {
  109. update(root*2,l,mid,add);
  110. update(root*2+1,mid+1,r,add);
  111. }
  112. node[root].sum=node[root*2].sum+node[root*2+1].sum;
  113. }
  114. int bin_sea(int l,int r,int a)
  115. {
  116. int ll=l;
  117. while(l<r)
  118. {
  119. int mid=(l+r)/2;
  120. int temp_num=query(1,ll,mid);
  121. if(mid-ll+1-temp_num>=a)//最开始没写出二分查找来 后来又因为mid-l+1错了 //第N处错误 //第N+1处错误
  122. r=mid;
  123. else l=mid+1;
  124. }
  125. return l;
  126. }
  127. int main()
  128. {
  129. int ncase;
  130. scanf("%d",&ncase);
  131. while(ncase--)
  132. {
  133. int n,m,i,j;
  134. scanf("%d%d",&n,&m);
  135. n--;
  136. build(1,0,n);
  137. for(i=1;i<=m;i++)
  138. {
  139. int a,b,c;
  140. scanf("%d%d%d",&a,&b,&c);
  141. if(a==1)
  142. {
  143. int right_num=query(1,b,n);
  144. // printf("~%d\n",right_num);
  145. if(right_num==n-b+1)
  146. printf("Can not put any one.\n");
  147. else
  148. {
  149. int left_num=b==0?0:query(1,0,b-1);//这地方要是b==0的话 left_num直接等于0 (注意点1)//第N+3处错误
  150. //printf("~%d\n",left_num);
  151. int left_pos=bin_sea(0,n,b-left_num+1);//为吗是b-left_num+1?而不是+2
  152. int right_pos=bin_sea(b,n,min(n-b+1-right_num,c));//(注意点2,min)
  153. printf("%d %d\n",left_pos,right_pos);
  154. update(1,left_pos,right_pos,1);
  155. }
  156. }
  157. else if(a==2)
  158. {
  159. printf("%d\n",query(1,b,c));
  160. update(1,b,c,0);
  161. }
  162. }
  163. printf("\n");
  164. }
  165. return 0;
  166. }

HDU4614【线段树。】的更多相关文章

  1. hdu4614 线段树+二分 插花

    Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...

  2. HDU-4614 Vases and Flowers (线段树区间更新)

    题目大意:有n个花瓶,每个花瓶中只能放一朵花.两种操作,一种是从A开始放F朵花,如果有的花瓶中已经有花则跳过这个花瓶,往下一个花瓶放:第二种是将区间[A,B]之间花瓶中的花清空.如果是第一种操作,输出 ...

  3. HDU4614 Vases and Flowers 二分+线段树

    分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...

  4. HDU-4614 Vases and Flowers 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 线段树保存区间是否被覆盖以及区间的和即可,在询问的时候在线段树上二分查找就可以了...代码写得比 ...

  5. hdu4614(线段树+二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给定一个区间[0,N-1],初始时每个位置上的数字都是0,可以对其进行以下两种操作: 1. ...

  6. hdu4614 Vases and Flowers 线段树+二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...

  7. hdu4614 Vases and Flowers 线段树

    Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...

  8. hdu4614 Vases and Flowers【线段树】【二分】

    Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...

  9. HDU-4614 Vases and Flowers(线段树区间更新+二分查找)

    http://acm.hdu.edu.cn/showproblem.php?pid=4614 Time Limit: 4000/2000 MS (Java/Others)    Memory Limi ...

随机推荐

  1. MFC中获取指针的方法

    1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...

  2. PDF编辑、删除、替换某页面或文字

    在工作中,我们常常会用到PDF,当然尤其是会计,我虽然是程序员,但是“小老鼠”是会计,前几天,突然问我,怎么样将PDF中的某个页面替换掉,也就是删掉某页然后再从另外一个地方找一页补上来: 还需要改变这 ...

  3. mysql 触发器,insert,auto字段竟然一样....

    a 表的字段有id,uid,name,其中id是自增值, CREATE TRIGGER trigger_insert_productAFTER INSERT ON aFOR EACH ROWBEGIN ...

  4. get post

    浅谈HTTP中Get与Post的区别 2009-03-31 14:51 by hyddd, 248341 阅读, 74 评论, 收藏, 编辑 Http定义了与服务器交互的不同方法,最基本的方法有4种, ...

  5. DTCMS视频模版更改,

    1.去掉style.css中视频的高度 .video-box{ position:relative; width:100%; height:473px; _clear:both; _display:i ...

  6. 通用SQL存储过程分页以及asp.net后台调用

    创建表格并添加300万数据 use Stored CREATE TABLE UserInfo( --创建表 id ,) PRIMARY KEY not null,--添加主键和标识列 UserName ...

  7. 同时存在两个或多个homestead 虚拟box

    开发中发现,不同版本的homestead 里面的环境各不相同,里面的node,npm等版本都不一致,如果需要添加 不同版本的homestead同时存在可以按照以下办法处理. tips: 提供可以离线下 ...

  8. AjaxFileUpload Firefox 不工作异常 (zero-width space characters from a JavaScript string)

    Firefox 返回的提示报错parse error (Chrome 和 IE正常) 打印出来返回的字符串,目测正常 将字符串放入notepad++, 转换字符集为ANSI 发现多出了欧元符号 通过j ...

  9. shell脚本编程之for语句、if语句使用介绍

    介绍了shell脚本编程之for语句.if语句的使用方法. 上部: 面向过程: 顺序执行 选择执行: if, case 循环执行: for, while, until 一.for语句 格式:      ...

  10. jQuery回车事件

    有网就是好. 全局事件: document.onkeydown=function(e){ var ev=document.all?window.evevt:e; if(ev.keyCode==13){ ...