POJ3667 hotel

发布时间:2021-10-24 20:59:45

题目链接:http://poj.org/problem?id=3667


线段树区间合并的入门题,区间合并和就是求什么最长连续什么什么的,所以说需要记录三个值,左起向右最长长度,右起向左最长长度,还有当前区间总最长长度,当前节点的总最长连续长度可由它的左子树和右子树推知,讲的话太麻烦……代码把



#include
#include
#include
#include
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 55555;
int lsum[maxn<<2], rsum[maxn<<2], msum[maxn<<2], cover[maxn<<2];
void PushDown(int rt, int m){
if (cover[rt] != -1){
cover[rt<<1] = cover[rt<<1|1] = cover[rt];
lsum[rt<<1] = rsum[rt<<1] = msum[rt<<1] = cover[rt] ? 0 : m - (m >> 1);
lsum[rt<<1|1] = rsum[rt<<1|1] = msum[rt<<1|1] = cover[rt] ? 0 : (m >> 1);
cover[rt] = -1;
}
}
void PushUp(int rt, int m){
lsum[rt] = lsum[rt<<1];
rsum[rt] = rsum[rt<<1|1];
if (lsum[rt] == m - (m >> 1)) lsum[rt] += lsum[rt<<1|1];//如果左起向右连续长度等于左子树区间总长度,右子树左起最长连续长度加入进去才是左起总的最长连续长度,下面的右子树同理
if (rsum[rt] == (m >> 1)) rsum[rt] += rsum[rt<<1];
msum[rt] = max(lsum[rt<<1|1] + rsum[rt<<1], max(msum[rt<<1], msum[rt<<1|1]));//推知当前区间总的连续长度
}
void build(int l, int r, int rt){
lsum[rt] = rsum[rt] = msum[rt] = r - l + 1;
cover[rt] = -1;
if (l == r) return;
int m = (l + r) >> 1;
build(lson);
build(rson);
}
void update(int ll, int rr, int c, int l, int r, int rt){
if (ll <= l && rr >= r){
lsum[rt] = rsum[rt] = msum[rt] = c ? 0 : r - l + 1;
cover[rt] = c;
return;
}
PushDown(rt, r - l + 1);
int m = (l + r) >> 1;
if (ll <= m) update(ll, rr, c, lson);
if (rr > m) update(ll, rr, c, rson);
PushUp(rt, r - l + 1);
}
int query(int w, int l, int r, int rt){
if (l == r) return l;
PushDown(rt, r - l + 1);
int m = (l + r) >> 1;
if (msum[rt<<1] >= w) return query(w, lson);
else if (lsum[rt<<1|1] + rsum[rt<<1] >= w) return m - rsum[rt<<1] + 1;
return query(w, rson);
}
int main(){
int n, m;
while (~scanf("%d%d", &n, &m)){
build(1, n, 1);
while (m--){
int op, a, b;
scanf("%d", &op);
if (op == 1){
scanf("%d", &a);
if (msum[1] < a) printf("0
");
else{
int p = query(a, 1, n, 1);
printf("%d
", p);
update(p, p + a - 1, 1, 1, n, 1);
}
}
else{
scanf("%d%d", &a, &b);
update(a, a + b - 1, 0, 1, n, 1);
}
}
}
return 0;
}





相关文档

  • 国际西装着装礼仪
  • cs电脑人老自杀怎么办
  • 煤矿工人学习心得体会
  • 网球拍什么牌子最好 什么网球拍比较好
  • 历史常识错误
  • 2021年有关中秋节寄语40句
  • 2007年入党申请书范文二
  • 芒果吃多了会上火吗?芒果的功效
  • 解决Docker ADD/COPY 报ADD failed: stat /var/lib/docker/tmp/docker-builder****: no such file or director
  • 2020年《保密法》主题教育活动总结
  • 对数函数的应用教学设计
  • 关于晚香玉的养殖方法介绍
  • 21个项目玩转深度学习---自我解析
  • 十个挺有意思的励志成长故事
  • 经济法基础学习技巧
  • 数据结构与算法-C版(王卓)day02
  • 写野菊花的句子
  • 【建筑电气控制技术试题】电气控制技术在建筑工程中的应用论文
  • 孕妇肥胖的危害有哪些,妈咪体型真会影响孕产程?
  • 学校开学追寻梦想演讲稿
  • 中国邮政储蓄短信通知怎么更改手机号码
  • 唐朝边塞诗人高适简介
  • 车队领导个人工作总结
  • 苹果x充满电后显示
  • 2016中级会计师《财务管理》复习:财务管理环境
  • 周忠和院士:探寻远古之谜
  • 吃什么可以治便秘
  • 适合中秋节收听的浪漫中秋歌曲推荐
  • 高新技术企业工作总结范文
  • Java 类集初探
  • 猜你喜欢

  • 糖纳豆项目可行性研究报告(目录)
  • 2019-世界摄影金质奖作品-文档资料
  • 秦皇岛正金装饰工程有限公司企业信用报告-天眼查
  • 带有冬的词语及成语有什么
  • 河南省许昌、新乡、*顶山市2016届高三第二次调研考试语文试题 Word版含答案
  • 荷花倒影的水彩画绘画教程
  • 探析小学生语文自主阅读学*方法
  • 2019年最新标准的初二入团志愿书00字怎么写入团申请书文档【十篇】
  • 福建瑞峰土地开发有限责任公司企业信用报告-天眼查
  • 新房入住必备:臭氧 杀菌 消毒 除味 高效分解甲醛、苯系物等有害气体
  • 学14―15学年下学期高一期末考试模块测试物理试题(扫描版)(附答案)
  • 大学法学毕业论文提纲最新
  • 海盐县实验小学教育集团文件
  • 内网和外网区别 (灰鸽子上线必看)
  • 2018版高考物理(粤教版)大一轮复*课件:选修3-4 基础课1 机械振动
  • 2018年学校食堂工作计划样例
  • 辨证分型治疗口腔扁*苔癣
  • 小学生赞美祖国的作文,小学赞美祖国的作文
  • 广西大新县德天大瀑布
  • 2019-2020年高中生物必修三 5-5《生态系统的稳定性》教案2
  • 外语教学法的主要流派PPT课件
  • 如何篇馕尴咄?缑苈毹无线网络密码篇猢
  • 鼻咽癌的发病因素是什么?鼻咽癌的并发症有哪些?
  • 掌握护肤5技巧对着电脑也不怕
  • 2018-2019年方山县大武镇文源小学三年级上册科学模拟期末考试无答案
  • 小学足球训练教学计划
  • 汉源县灾后恢复重建九襄水厂工程融资投资立项项目可行性研究报告(中撰咨询)
  • 广西桂林市第十八中学2019届高三地理上学期第一次月考试题201809030239
  • 【最新】体育课作文450字-实用word文档 (1页)
  • 数学建模题目及论文_数学建模优秀论文
  • GET与POST比较(数据大小、数据类型、传送形式)
  • 【精品文档】小学三年级第二学期数学老师工作总结-精选word文档 (1页)
  • 夜间开车技巧注意事项
  • 【精编】新人教版小学四年级数学上册期中试卷1
  • 开封市凤麒房屋维修有限公司企业信用报告-天眼查
  • (新)康师傅2008年津冀企划培训
  • 权威的现金流量表分析教程20111210
  • 华人加拿大国家生活小经验四则@皇家留学
  • 高教版单片机原理及应用
  • 湖北监利缔福龙港口有限公司企业信用报告-天眼查
  • Efficient path planning method based on Genetic Algorithm combining path
  • 有机物的组成、结构和性质共102页文档
  • 电脑版