博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树 HDU 2871
阅读量:4358 次
发布时间:2019-06-07

本文共 2764 字,大约阅读时间需要 9 分钟。

题意还是清楚的

就是维护很麻烦

#include
#include
#include
#include
using namespace std;#define MAXN 50010struct node{ int l,r,la; int ls,rs,ms;}x[MAXN<<3];struct no{ int l,r;};int n,m;vector
z;void Build(int l,int r,int a){ x[a].l=l; x[a].r=r; x[a].la=-1; x[a].ls=x[a].rs=x[a].ms=r-l+1; if(l == r) return ; int mid=(l+r)>>1; Build(l,mid,a<<1); Build(mid+1,r,a<<1|1);}char s1[10];void push_down(int a)//下更{ x[a<<1].la=x[a<<1|1].la=x[a].la; int r,l,mid; l=x[a].l; r=x[a].r; mid=(r+l)>>1; if(x[a].la==1) { x[a<<1].ls=x[a<<1].rs=x[a<<1].ms=mid-l+1; x[a<<1|1].ls=x[a<<1|1].rs=x[a<<1|1].ms=r-mid; } else { x[a<<1].ls=x[a<<1].rs=x[a<<1].ms=0; x[a<<1|1].ls=x[a<<1|1].rs=x[a<<1|1].ms=0; } x[a].la=-1;}void push_up(int a)//上更{ x[a].ls=x[a<<1].ls; if(x[a].ls==x[a<<1].r-x[a<<1].l+1) x[a].ls+=x[a<<1|1].ls; x[a].rs=x[a<<1|1].rs; if(x[a].rs==x[a<<1|1].r-x[a<<1|1].l+1) x[a].rs+=x[a<<1].rs; x[a].ms=max(x[a<<1].ms,x[a<<1|1].ms); x[a].ms=max(x[a].ms,x[a<<1].rs+x[a<<1|1].ls);}int Ques(int a,int len){ if(x[a].la!=-1) push_down(a); int mid=(x[a].r+x[a].l)>>1; if(x[a].ms
=len) //这4个很重要 return x[a].l; else if(x[a<<1].ms>=len) return Ques(a<<1,len); else if(x[a<<1].rs+x[a<<1|1].ls>=len) return mid-x[a<<1].rs+1; else return Ques(a<<1|1,len); } push_up(a);}int b_search(int a){ int l=0,r=z.size()-1; while(l<=r) { int mid=(l+r)>>1; if(a
>1; if(z[mid].l<=a&&z[mid].r>=a) return mid; else if(z[mid].r
>1; if(a1<=mid) Update(l,mid,a1,b1,a<<1); if(b1>mid) Update(mid+1,r,a1,b1,a<<1|1); push_up(a);}void Update1(int l,int r,int a1,int b1,int a)//变成都不被占用{ if(a1<=l&&r<=b1) { x[a].la=1; x[a].ls=x[a].rs=x[a].ms=r-l+1; return ; } if(x[a].la!=-1) push_down(a); int mid=(l+r)>>1; if(a1<=mid) Update1(l,mid,a1,b1,a<<1); if(b1>mid) Update1(mid+1,r,a1,b1,a<<1|1); push_up(a);}int main(){ while(scanf("%d%d",&n,&m) != EOF) { Build(1,n,1); z.clear(); vector
::iterator it; no p1; while(m--) { scanf("%s",s1); if(strcmp(s1,"New") == 0) //查询这段区间存不存在 { int a; scanf("%d",&a); int pos=Ques(1,a); if(pos == 0) printf("Reject New\n"); else { printf("New at %d\n",pos); Update(1,n,pos,pos+a-1,1); //更新 it=z.begin()+b_search(pos); p1.l=pos; p1.r=pos+a-1; z.insert(it,p1); } } else if(strcmp(s1,"Free") == 0)//二分 这个点有没有被使用 { int a; scanf("%d",&a); int pos=b_search1(a); if(pos == -1) printf("Reject Free\n"); else { // it = z.begin()+pos; printf("Free from %d to %d\n",it->l,it->r); Update1(1,n,it->l,it->r,1); z.erase(it); } } else if(strcmp(s1,"Get") == 0) { int a; scanf("%d",&a); if(z.size()

 

转载于:https://www.cnblogs.com/cherryMJY/p/6282006.html

你可能感兴趣的文章
C++ 类的对象管理模型初讲
查看>>
企业应用架构读书笔记与总结
查看>>
查看系统信息命令大全
查看>>
awk,rsync,重启,maxdepth一层目录,登录,开机自启动
查看>>
代码回顾
查看>>
对一次系统上线的思考-走出“舒适区”
查看>>
【06】Cent OS 7 中部署 zabbix_server 环境
查看>>
vue 中 vue-router、transition、keep-alive 怎么结合使用?
查看>>
小常识
查看>>
TungstenSecret
查看>>
LR遇到的问题
查看>>
51nod 1010 只包含因子2 3 5的数 && poj - 1338 Ugly Numbers(打表)
查看>>
在OS X 10.11 中使用 "apue.h" (3rd Edition)
查看>>
mysql 批量插入更新
查看>>
ubuntu 实用命令收集
查看>>
[算法]分治算法(Divide and Conquer)
查看>>
mssql格式化工具——SQL PRETTY PRINTER
查看>>
datagrid删除按钮
查看>>
Redis高级进阶(一)
查看>>
地图坐标助手-开发总结
查看>>