HDU 4614 线段树+二分
来源:互联网 发布:k8陀螺仪软件下载 编辑:程序博客网 时间:2024/06/05 20:15
线段树+二分的思想
二分出起点和终点 其他的线段树部分很简单
#include "stdio.h"#include "string.h"#include "stdlib.h"#include "math.h"struct comp{int l,r,mid,x,lazy;} data[300010];void build(int l,int r,int k){data[k].l=l;data[k].r=r;data[k].mid=(l+r)/2;data[k].x=r-l+1;data[k].lazy=-1;if (l==r) return ;build(l,data[k].mid,k*2);build(data[k].mid+1,r,k*2+1);}void Pushdown(int k){if (data[k].l==data[k].r || data[k].lazy==-1) return ;data[k*2].lazy=data[k*2+1].lazy=data[k].lazy;if (data[k].lazy==1){data[k*2].x=data[k*2].r-data[k*2].l+1;data[k*2+1].x=data[k*2+1].r-data[k*2+1].l+1;}else data[k*2].x=data[k*2+1].x=0;data[k].lazy=-1;}int search(int l,int r,int k){if (data[k].l==l && data[k].r==r)return data[k].x;Pushdown(k);if (r<=data[k].mid) return search(l,r,k*2);else if (l>data[k].mid) return search(l,r,k*2+1);else return search(l,data[k].mid,k*2)+search(data[k].mid+1,r,k*2+1);}void updata(int l,int r,int k,int op){if (data[k].l==l && data[k].r==r){if (op==0){data[k].x=0;data[k].lazy=0;}else {data[k].x=r-l+1;data[k].lazy=1;}return ;}Pushdown(k);if (r<=data[k].mid) updata(l,r,k*2,op);else if (l>data[k].mid) updata(l,r,k*2+1,op);else {updata(l,data[k].mid,k*2,op);updata(data[k].mid+1,r,k*2+1,op);}data[k].x=data[k*2].x+data[k*2+1].x;}int findstart(int l,int r){int ll,rr,mid;ll=l;rr=r;while (ll<=rr){mid=(ll+rr)/2;if (search(ll,mid,1)!=0) rr=mid-1;else if (search(mid,mid,1)==1) return mid;else ll=mid+1;}return ll;}int findend(int l,int r,int x){int ll,rr,w,mid;ll=l;rr=r;while (ll<=rr){mid=(ll+rr)/2;w=search(l,mid,1);if (w<x) ll=mid+1;else rr=mid-1;}return ll;}int main(){int Case,n,m,op,a,b,start,end,sum;scanf("%d",&Case);while (Case--){scanf("%d%d",&n,&m);build(0,n-1,1);while (m--){scanf("%d%d%d",&op,&a,&b);if (op==1){sum=search(a,n-1,1);if (sum==0) {printf("Can not put any one.\n");continue;}if (sum<b) b=sum;start=findstart(a,n-1);end=findend(start,n-1,b);if (end==n) end--;printf("%d %d\n",start,end);updata(start,end,1,0);}else {sum=b-a+1-search(a,b,1);printf("%d\n",sum);updata(a,b,1,1);}}printf("\n");}return 0;}
- hdu 4614 线段树+二分~
- HDU 4614 线段树+二分
- hdu 4614 线段树+二分
- hdu 4614 线段树+二分
- HDU 4614 线段树+二分
- HDU 4614 二分加线段树
- hdu 4339 线段树+二分
- HDU 4791二分+线段树
- HDU - 4973(线段树+二分)
- hdu 4339 线段树+二分
- hdu 5592 线段树 + 二分
- HDU 3450 线段树+二分
- HDU 5649 (二分 线段树)
- HDU 6070 二分+线段树
- hdu 6070二分+线段树
- HDU 5649 线段树+二分
- hdu 4614 Vases and Flowers(线段树+二分)
- hdu 4614 Vases and Flowers (线段树+二分)
- Unity3d 固定一段时间进入某个方法
- Android4.2模拟器kernel下载及编译-linux kernel3.4.0
- iOS 7用户界面过渡指南 更新UI
- CART分类算法
- 学习笔记:C#修改电脑密码方法如下
- HDU 4614 线段树+二分
- Java线程的创建
- android edittext切换数字键盘
- Objective-C学习笔记(一)–类
- oracle的profiles
- python处理时间--- datetime模块
- ubuntu命令备忘
- iOS学习系列 - 扩展机制category与associative
- MFC,C++ 截屏