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

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

二分写的也很恶心哪

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

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

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <assert.h> using namespace std; #define lowbit(i) (i&-i)
#define sqr(x) ((x)*(x))
#define enter printf("\n")
#define is_sqr(x) (x&(x-1))
#define pi acos(-1.0)
#define clr(x) memset(x,0,sizeof(x))
#define fp1 freopen("in.txt","r",stdin)
#define fp2 freopen("out.txt","w",stdout)
#define pb push_back typedef long long LL; const double eps = 1e-7;
const double DINF = 1e100;
const int INF = 1000000006;
const LL LINF = 1000000000000000005ll;
const int MOD = (int) 1e9 + 7;
const int maxn=300005; template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);} struct Node
{
int l,r,sum,add;
}node[maxn];//这地方也有技巧 线段树要存多大的数据 比如树高为H
void build(int root,int l,int r)
{
node[root].l=l;
node[root].r=r;
node[root].add=-1;
node[root].sum=0;
if(node[root].l==node[root].r) return ;
else
{
int mid=(l+r)/2;
build(root*2,l,mid);
build(root*2+1,mid+1,r);
}
}
int query(int root,int l,int r)
{
if(node[root].l==l&&node[root].r==r) return node[root].sum;//又有错误
if(node[root].add>=0)//更新子结点?
{
int ls=root*2,rs=root*2+1;
//node[root].sum=(node[root].r-node[root].l+1)*node[root].add;
//这一步不需要,前面已修改
node[ls].sum=(node[ls].r-node[ls].l+1)*node[root].add;//两处错误
node[rs].sum=(node[rs].r-node[rs].l+1)*node[root].add;// ls rs用不用更新?
node[ls].add=node[rs].add=node[root].add;
node[root].add=-1;
}
int ans=0;
int mid=(node[root].l+node[root].r)/2;
if(r<=mid)
{
return query(root*2,l,r);
}
else if(l>mid)
{
return query(root*2+1,l,r);
}
else
{
ans=query(root*2,l,mid);
ans+=query(root*2+1,mid+1,r);
}
return ans;
}
void update(int root,int l,int r,int add)
{
if(node[root].l==l&&node[root].r==r)//不够掌握的就是他这块的更新和上面的什么关系
{
node[root].add=add;
node[root].sum=(node[root].r-node[root].l+1)*node[root].add;
return;
}
int mid=(node[root].l+node[root].r)/2;
if(r<=mid)
{
update(root*2,l,r,add);
}
else if(l>mid)
{
update(root*2+1,l,r,add);
}
else
{
update(root*2,l,mid,add);
update(root*2+1,mid+1,r,add);
}
node[root].sum=node[root*2].sum+node[root*2+1].sum;
}
int bin_sea(int l,int r,int a)
{
int ll=l;
while(l<r)
{
int mid=(l+r)/2;
int temp_num=query(1,ll,mid);
if(mid-ll+1-temp_num>=a)//最开始没写出二分查找来 后来又因为mid-l+1错了 //第N处错误 //第N+1处错误
r=mid;
else l=mid+1;
}
return l;
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
int n,m,i,j;
scanf("%d%d",&n,&m);
n--;
build(1,0,n);
for(i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==1)
{
int right_num=query(1,b,n);
// printf("~%d\n",right_num);
if(right_num==n-b+1)
printf("Can not put any one.\n");
else
{
int left_num=b==0?0:query(1,0,b-1);//这地方要是b==0的话 left_num直接等于0 (注意点1)//第N+3处错误
//printf("~%d\n",left_num);
int left_pos=bin_sea(0,n,b-left_num+1);//为吗是b-left_num+1?而不是+2
int right_pos=bin_sea(b,n,min(n-b+1-right_num,c));//(注意点2,min)
printf("%d %d\n",left_pos,right_pos);
update(1,left_pos,right_pos,1);
}
}
else if(a==2)
{
printf("%d\n",query(1,b,c));
update(1,b,c,0);
}
}
printf("\n");
}
return 0;
}

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. L006-oldboy-mysql-dba-lesson06

    L006-oldboy-mysql-dba-lesson06 数据清理状态,先标记update table state=1,再删除. myisam没外键,硬件,并发,锁表力度,不支持事务,OLAP. ...

  2. 开发问题记录——ArcEngine问题记录

    ArcEngine 使用Winform进行坐标投影变换,用到AE空间,出现如下错误:   “ESRI.ArcGIS.esriSystem.IXMLSerialize”在未被引用的程序集中定义.必须添加 ...

  3. Linux系统下安装rz/sz命令及使用说明(转载)

    对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令.今天,我们 ...

  4. 获取股票历史数据和当前数据的API

    关键字:股票,stock,API,接口 1.获取股票当前数据 新浪数据接口:http://hq.sinajs.cn/list={code}.{code}替换为股票代码,沪市股票代码加前缀sh,深市股票 ...

  5. QT定制有标题的扁平化下拉框控件

    关键字:QT,QComboBox,QLineEdit,QListView,QPushButton,QMenu,QWidgetAction,setStyleSheet OS:Windows 7 方法一: ...

  6. 升级python版本导致Django无法使用的解决办法

    运行环境是CentOS6.2 x86_64,在把python从2.6.6升级到2.7.5后,由于环境变量的改变,在python代码中再import django的话将会出现以下报错:   “No mo ...

  7. Android SDK离线安装方法详解(加速安装) 转

    AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助! 离线安装包下载地址:http://dl.vmall.com/c ...

  8. table 中实现 控制 指定列的 左对齐 右对齐方式

    .listTable{ border-collapse:collapse; border-top:1px solid #8c9594; border-right:1px solid #8c9594; ...

  9. C#微信登录-手机网站APP应用

    要求:公众号必须先认证,认证费用¥300/年,比较黑 一.微信登录核心代码 //核心代码,没判断异常 1.登录页面 protected void Page_Load(object sender, Ev ...

  10. Google面试题

    今天早上在Quora上看到的一个题目,很不错的!最直观的是枚举n^3,但稍微进步一点的观察是找出3个数,然后最大的减去最小的2倍的结果,然后就有了线性扫一遍就OK. Given three array ...