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;}


原创粉丝点击