操作1,的关键是找到第一只和最后一只空花瓶,完全可以利用二分法查找,找第一只花瓶可以在[X,N]内查找,第一个位置pos1,最后一只花瓶则在[POS1,N]中找,然后更新[POS1,POS2],全部置1即可

代码:

#include<iostream>
using namespace std;
const int N = 5e4 + 5;
struct node {
int lazy;
int sum; //sum代表空花瓶的数量
}tree[N<<2]; int ls(int i) { return i << 2; }
int rs(int i) { return i << 2 | 1; } int t, n, m, x, y, k; //以下四个函数都是线段树的基本操作
void pushdown(int id, int l, int r) {
if (tree[id].lazy == -1) { return; } int mid = (l + r) >> 1; tree[ls(id)].sum = (mid - l + 1) * tree[id].lazy;
tree[rs(id)].sum = (r - mid) * tree[id].lazy;
tree[ls(id)].lazy = tree[rs(id)].lazy = tree[id].lazy; tree[id].lazy = -1;
} void pushup(int id) {
tree[id].sum = tree[ls(id)].sum + tree[rs(id)].sum;
} void build(int id, int l, int r) {
if (l == r) {
tree[id].lazy = -1;
tree[id].sum = 0;
}
int mid = (l + r) >> 1;
build(ls(id), l, mid);
build(rs(id), mid + 1, r);
tree[id].lazy = -1;
pushup(id);
} int query(int id, int l, int r, int x, int y) {
if (x <= l && y >= r) return tree[id].sum;
int ans = 0;
pushdown(id, l, r);
int mid = (l + r) >> 1;
if (x <= mid) ans += query(ls(id), l, mid, x, y);
if (y > mid) ans += query(rs(id), mid + 1, r, x, y);
return ans;
} void update(int id, int l, int r, int x, int y, int d) { //d=1代表花瓶是空的,d=0代表花瓶是满的
if (x <= l && y >= r) {
tree[id].sum = (r - l + 1) * d;
tree[id].lazy = d;
return;
}
pushdown(id, l, r);
int mid = (l + r) >> 1;
if (x <= mid) update(ls(id), l, mid, x, y, d);
if (y > mid) update(rs(id), mid + 1, r, x, y, d);
pushup(id);
} int binarysearch(int x, int n, int f) {
int l = x, int r = n;
while (l < r) {
int mid = (l + r) >> 1;
int t = query(1, 1, n, x, mid); //查找左边部分,从左边判断第f个空花瓶是在左边还是右边
if (t >= f) r = mid;
else l = mid + 1;
}
return r;
} int main() {
cin >> t;
while (t--) {
cin >> n >> m;
build(1, 1, n);
for (int i = 1; i <= m; i++) {
cin >> k >> x >> y;
if (k == 1) {
x++; //保证区间为[1,N]
//首先查询[X,N]中是否有空花瓶
int t = query(1, 1, n, x, n);
if (t == 0) {
cout << "Can not put any one" << endl;
}
else {
t = min(y, t); //计算需要插花数量,此时的y代表收到花的数量
int s = binarysearch(x, n, 1); //搜索第一个空花瓶
int t = binarysearch(s, n, t); //搜索最后一个空花瓶
cout << s - 1 << " " << t - 1 << endl;
update(1, 1, n, s, t, 0);
}
}
else {
x++; y++;
int t = query(1, 1, n, x, y);
update(1, 1, n, x, y, 1);
cout << y - x + 1 - t;
}
}
cout << endl;
}
return 0;
}

线段树与二分操作 vases and flowers ——hdu 4614的更多相关文章

  1. L - Vases and Flowers HDU - 4614 线段树+二分

    题意 给出一排空花瓶 有两种操作  1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个  如果没有输出 can not. ...

  2. L - Vases and Flowers - hdu 4614(区间操作)

    题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉.操作2把区间清空 分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩 ...

  3. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

  4. 线段树区间更新操作及Lazy思想(详解)

    此题题意很好懂:  给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...

  5. 【BZOJ4552】排序(线段树,二分答案)

    [BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...

  6. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  7. CodeForces 914DBash and a Tough Math Puzzle(线段树的骚操作)

    D. Bash and a Tough Math Puzzle time limit per test 2.5 seconds memory limit per test 256 megabytes ...

  8. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

  9. LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案

    题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...

  10. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

随机推荐

  1. oeasy教您玩转python - 010 - # 不换行输出

    不换行输出 回忆上次内容 \n 就是换行 他对应着 ascii 字符的代码是(10)10进制 他的英文是 LF,意思是Line Feed 这样我就可以自由的控制哪里换行了! 可以做下面这个框架标题吗? ...

  2. 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)

    前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题.早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现.手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变 ...

  3. Umov移动方块-scratch编程作品

    程序说明: <Umov移动方块>是一款基于Scratch平台制作的小游戏.在这个游戏中,玩家将面对一个3×3的圆圈棋盘,并通过鼠标控制蓝色方块在这些圆圈中灵活移动.游戏的挑战在于,舞台的四 ...

  4. 结合拦截器描述mybatis启动流程

    简介 mybatis的启动入口一般有两个,在结合spring框架后由spring整合包下的SqlSessionFactoryBean启动 如果没有整合spring,则有XMLConfigBuilder ...

  5. 加油,为Vue3提供一个可媲美Angular的ioc容器

    为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发.但是,我们不仅要能做到,而且要做得更好.大型业务系统的关键就是解耦合,从而减缓shi山代 ...

  6. 安装华为软件昇腾mindspore-gpu-1.9.0失败记录

    官网安装地址: https://www.mindspore.cn/install PS: 不得不说华为的软件是愈发的不好用了,这个mindspore老版本去年我是使用过的,安装也是比较方便的,搞不清这 ...

  7. springboot2集成oauth2坑二(The bean 'scopedTarget.oauth2ClientContext', defined in class path resource )

    码云地址:https://gitee.com/lpxs/lp-springcloud.git 有问题可以多沟通:136358344@qq.com. 由于使用Enableoauth2sso注解一直报错, ...

  8. 【CMake系列】10-cmake测试 ctest

    cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习 如何借助cma ...

  9. 网站接入qq登录

    网站接入qq登录可以省去注册账号,增加网站的体验度.那么要实现我自己搭建的站点天天博客的qq单点登录需要以下几个步骤:1,申请appid和appkey 首先要去https://connect.qq.c ...

  10. 游戏AI行为决策——Behavior Tree(行为树)

    游戏AI行为决策--行为树 前言 行为树,是目前游戏中应用较为广泛的一种行为决策模型.这离不开它成熟的可视化编辑工具,例如Unity商城中的「Behaviour Designer」,甚至是虚幻引擎也自 ...