首页 > 其他分享 >24/02/02 按钮

24/02/02 按钮

时间:2024-02-02 22:34:35浏览次数:27  
标签:02 24 int tot 按下 lsh 按钮 操作

题目描述

有一排按钮,编号为 \(0 \sim n-1\)。现在有两种操作:

  • \(p\) \(l\) \(r\):表示把编号在 \([l,r]\) 范围内的按钮都按下去。

  • \(r\) \(l\) \(r\):表示把编号在 \([l,r]\) 范围内的按钮都提一格。保证这个操作与之前某个按下操作的区间一样,且一次按下只会释放一次

如下图,是一个有6个按钮的初始情况:
image
按下 \([0,2]\) 和 \([2,3]\) 的结果:
image
释放 \([0,2]\) 的结果:
image
每次操作之后,你需要输出,现在有多少个连续段的按钮是复位的(在初始高度)。

输入格式

第 1 行,两个整数和 \(n\) ,\(m\) 表示按钮个数和操作次数。

接下来 \(m\) 行,每行一个操作。

输出格式

每次操作之后,输出现在有多少个连续段的按钮是复位的(在初始高度)。

数据范围

\(n \leq 10^8 , m \leq 10^5\)


一道 *2500 的题。是一道看起来很难,其实很简单,其实也很难的题ze。

题目要求维护连续段的复位按钮,我们可以把每个按钮初始状态看作 \(0\) ,每次 \(p\) 操作相当于区间加一, \(r\) 操作相当于区间减一,每次操作后求连续 \(0\) 的个数。

嘶~在01序列中维护连续 \(0\) 的个数很简单,但这次权值不只有 \(0\) 和 \(1\) ,有点难办。

注意到题目中有一句话:保证这个操作与之前某个按下操作的区间一样,且一次按下只会释放一次

这说明什么?序列中一定不会出现负数!换句话说,区间的最小值一定大于等于 \(0\) 。

这样,我们只需要维护区间连续最小值的段数和区间最小值。输出答案时,如果最小值大于 \(0\) ,则答案为 0 ,反之答案则为区间连续最小值的段数。


代码实现

由于 \(n\) 很大,所以需要离线下来离散化。

说着很简单,但考虑到格点什么的,写代码时要考虑很多细节(尤其是边界什么的)。

还好这题不强制在线,不然肯定要 *3000 起步了daze。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int n,m;
struct ques{
    char op;
    int l,r;
}Q[N];
int lsh[N<<2],tot;
int lv[N<<4],rv[N<<4],v[N<<4],mn[N<<4],tag[N<<4];
#define mid ((l+r)>>1)
#define ls (p<<1)
#define rs (p<<1|1)
inline void push_up(int p,int l,int r){
    if(mn[ls]==mn[rs]){
        mn[p]=mn[ls];
        v[p]=v[ls]+v[rs];
        if(lv[ls]==mid-l+1)lv[p]=lv[ls]+lv[rs];
        else lv[p]=lv[ls];
        if(rv[rs]==r-mid)rv[p]=rv[rs]+rv[ls];
        else rv[p]=rv[rs];
        if(rv[ls]>0&&lv[rs]>0)v[p]--;
    }
    else if(mn[ls]<mn[rs]){
        mn[p]=mn[ls];
        lv[p]=lv[ls],rv[p]=0;
        v[p]=v[ls];
    }
    else {
        mn[p]=mn[rs];
        lv[p]=0,rv[p]=rv[rs];
        v[p]=v[rs];
    }
}
inline void push_down(int p){
    if(tag[p]){
        tag[ls]+=tag[p],tag[rs]+=tag[p];
        mn[ls]+=tag[p],mn[rs]+=tag[p];
        tag[p]=0;
    }
}
void build(int p,int l,int r){
    mn[p]=tag[p]=0;
    lv[p]=rv[p]=lsh[r+1]-lsh[l],v[p]=1;
    if(l==r)return;
    build(ls,l,mid),build(rs,mid+1,r);
}
void update(int p,int l,int r,int L,int R,int x){
    if(l>=L&&r<=R)return mn[p]+=x,tag[p]+=x,void();
    if(l>R||r<L)return;
    push_down(p);
    update(ls,l,mid,L,R,x),update(rs,mid+1,r,L,R,x);
    push_up(p,l,r);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    lsh[++tot]=0,lsh[++tot]=n;
    for(int i=1;i<=m;i++){
        cin>>Q[i].op>>Q[i].l>>Q[i].r;
        lsh[++tot]=Q[i].l,lsh[++tot]=Q[i].r+1;
    }
    sort(lsh+1,lsh+1+tot);
    tot=unique(lsh+1,lsh+1+tot)-lsh-1;
    build(1,1,tot-1);
    for(int i=1;i<=m;i++){
        int l=lower_bound(lsh+1,lsh+1+tot,Q[i].l)-lsh;
        int r=lower_bound(lsh+1,lsh+1+tot,Q[i].r+1)-lsh-1;
        if(Q[i].op=='p')update(1,1,tot-1,l,r,1);
        else update(1,1,tot-1,l,r,-1);
        if(mn[1]==0)cout<<v[1]<<'\n';
        else cout<<0<<'\n';
    }
    return 0;
}
//iictiw-marisa

标签:02,24,int,tot,按下,lsh,按钮,操作
From: https://www.cnblogs.com/Iictiw/p/18004119

相关文章

  • AT_past202107_l 题解
    Solution题目来源:AT_past202107_l(inAtCoder|inluogu)用线段树维护区间最小值。单点修改很好写,我们看怎么区间寻找最小值位置。对于每次询问,我们先求出所查询区间\([x_i,y_i]\)的最小值\(p\),然后写一个寻找函数。对于当前区间\([l,r]\),分以下情况来看:如果当前区间长......
  • 2.2寒假每日总结24
    使用的HBuilderX版本:3.98Git插件已安装:项目结构如下:右击项目目录,在git命令中-》检查已修改,可以发现还是能检索到修改过的文件:文件是有修改过的,但是在上图中没有任何的修改标识,这些文件也没有添加到.gitignore配置中。二、问题解决......
  • 【洛谷 P2249】【深基13.例1】查找(向量+lower_bound)
    【深基13.例1】查找题目描述输入个不超过的单调不减的(就是后面的数字不小于前面的数字)非负整数,然后进行次询问。对于每次询问,给出一个整数,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出。输入格式第一行个整数和,表示数字个数和询问次数。第二行......
  • 在 Windows 10 上使用 Visual Studio 2022 C++ 桌面开发
    工具下载链接:https://pan.quark.cn/s/c70b23901ccb环境介绍在今天的快速发展的软件开发行业中,选择合适的开发环境是非常关键的一步。对于C++开发人员来说,VisualStudio2022(VS2022)是一个强大的集成开发环境(IDE),特别是在Windows10操作系统中。安装VisualStudio2022本文将引导您......
  • noip2023 游记
    Day0看暑假的题解和笔记,写了两道小题,并用1h码了P1505[国家集训队]旅游,但是240行...下午帮hyl干活,想起来没写过树套树,于是写了一会,没写完@262620zzj用归并排序处理n=8的“机密文件”,难评开家长会,没被que,好事应该没人发现我妈发言稿是我写的吧晚上Co突然说不......
  • CSP2023 游记
    CSP2023游寄死的非常彻底呢...小y死,速归周五复习了一些图论的板子,多测没清空,rp--周六上午写了ST表,看了看KMP和Manacher,发现忘差不多了,有点慌,rp--(此处伏笔看到了J组的题,T3居然还是大模拟,心道不好(伏笔++中午出门晚了一点,又有一点点慌,rp--进考场的时候大概是......
  • [BSidesCF 2020]Had a bad day
    [BSidesCF2020]Hadabadday打开网站有两个按钮,点击之后链接后都会加上?category=meowers猜测有文件包含漏洞,尝试?category=php://filter/read=convert.base64-encode/resource=index.php警告中看到.php出现了两次,推测源码中存在.php拼接,于是去掉.php得到PHP源码<?p......
  • 2024.2.2寒假每日总结24
    算法题:1686.石子游戏VI-力扣(LeetCode)最最简单的超级马里奥训练过程fromnes_py.wrappersimportJoypadSpaceimportgym_super_mario_brosfromgym_super_mario_bros.actionsimportSIMPLE_MOVEMENTimporttimefrommatplotlibimportpyplotaspltfromstable_basel......
  • 2024.2.2日报
    6.1HashShuffle解析以下的讨论都假设每个Executor有1个cpucore。6.1.1HashShuffleManagershufflewrite阶段,主要就是在一个stage结束计算之后,为了下一个stage可以执行shuffle类的算子(比如reduceByKey),而将每个task处理的数据按key进行“划分”。所谓“划分......
  • JXOI2024 日记
    看到大家都在写游记,退役菜鸡也想写一写自己退役的悠闲生活。(关于为什么是日记不是游记:我太啰嗦了)2024/1/21及以前在家睡觉,背单词,打块,玩原神。2024/1/22下雪了,于是鸽了,不去学校。准备在家好好睡一觉。问ZH喵要不要一起出来玩雪,ZH拒绝了,但是TZ喵问大家要不要出来散步,就......