首页 > 其他分享 >Codeforces 863E Turn Off The TV

Codeforces 863E Turn Off The TV

时间:2024-02-29 10:45:53浏览次数:20  
标签:TV mn mid Turn int maxn 端点 863E id

能发现其实就是区间加查询区间最小值。
如果最小值 \(> 1\) 则这个区间可以删掉。

考虑离散化端点,先把区间表示为 \([l_i, r_i)\) 的形式,方便离散化端点。
这样子离散化出来的端点也是 \([x, y)\) 的形式。

对于区间加查询区间最小值,很容易用线段树维护。
时间复杂度 \(O(n\log n)\)。

代码
#include<bits/stdc++.h>
const int maxn = 4e5 + 10;
int n, m;
int mn[maxn * 2], tag[maxn * 2];
#define mid ((l + r) >> 1)
#define id(l, r) (((l) + (r)) | ((l) != (r)))
inline void pushup(int l, int r) {mn[id(l, r)] = std::min(mn[id(l, mid)], mn[id(mid + 1, r)]);}
inline void upd(int l, int r, int v) {mn[id(l, r)] += v, tag[id(l, r)] += v;}
inline void pushdown(int l, int r) {int &v = tag[id(l, r)]; v && (upd(l, mid, v), upd(mid + 1, r, v), v = 0);}
inline void update(int x, int y, int l = 1, int r = m) {
    if (x <= l && r <= y) return upd(l, r, 1), void();
    pushdown(l, r);
    x <= mid && (update(x, y, l, mid), 1), mid < y && (update(x, y, mid + 1, r), 1);
    pushup(l, r);
}
inline int qry(int x, int y, int l = 1, int r = m) {
    if (x <= l && r <= y) return mn[id(l, r)];
    pushdown(l, r);
    return std::min(x <= mid ? qry(x, y, l, mid) : n, mid < y ? qry(x, y, mid + 1, r) : n);
}
int W[maxn], l[maxn], r[maxn];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d%d", &l[i], &r[i]), r[i]++;
    for (int i = 1; i <= n; i++) W[++m] = l[i], W[++m] = r[i];
    std::sort(W + 1, W + m + 1);
    for (int i = 1; i <= n; i++) {
        l[i] = std::lower_bound(W + 1, W + m + 1, l[i]) - W;
        r[i] = std::lower_bound(W + 1, W + m + 1, r[i]) - W - 1;
    }
    for (int i = 1; i <= n; i++) update(l[i], r[i]);
    for (int i = 1; i <= n; i++)
        if (qry(l[i], r[i]) > 1) return printf("%d\n", i), 0;
    puts("-1");
    return 0;
}

还有一种更为简单的方式是考虑到只需要判断区间最小值是否 \(> 1\)。
对于每个点维护右端点满足这个点到右端点的区间最小值 \(> 1\) 且这个右端点是合法中最靠右的。
可以倒序维护。

复杂度瓶颈在离散化,时间复杂度 \(O(n\log n)\)。

代码
#include<bits/stdc++.h>
const int maxn = 4e5 + 10;
int n, m;
int W[maxn], l[maxn], r[maxn];
int sum[maxn], R[maxn];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d%d", &l[i], &r[i]), r[i]++;
    for (int i = 1; i <= n; i++) W[++m] = l[i], W[++m] = r[i];
    std::sort(W + 1, W + m + 1);
    for (int i = 1; i <= n; i++) {
        l[i] = std::lower_bound(W + 1, W + m + 1, l[i]) - W;
        r[i] = std::lower_bound(W + 1, W + m + 1, r[i]) - W - 1;
        sum[l[i]]++, sum[r[i] + 1]--;
    }
    for (int i = 1; i <= m; i++) sum[i] += sum[i - 1];
    R[m + 1] = m;
    for (int i = m; i; i--) R[i] = sum[i] > 1 ? R[i + 1] : (i - 1);
    for (int i = 1; i <= n; i++)
        if (R[l[i]] >= r[i]) return printf("%d\n", i), 0;
    puts("-1");
    return 0;
}

标签:TV,mn,mid,Turn,int,maxn,端点,863E,id
From: https://www.cnblogs.com/rizynvu/p/18042912

相关文章

  • Qt 虚拟键盘qtvirtualkeyboard遮挡QLineEdit问题
    1.通过修改虚拟键盘源码qtvirtualkeyboard-everywhere-src-5.14.2\src\virtualkeyboard\desktopinputselectioncontrol.cpp:1591voidDesktopInputSelectionControl::updateVisibility()2{3staticintoriginalY=0;4if(!m_enabled){5//if......
  • R语言时变面板平滑转换回归模型TV-PSTR分析债务水平对投资的影响|附代码数据
    全文下载链接:http://tecdat.cn/?p=21506最近我们被客户要求撰写关于TV-PSTR的研究报告,包括一些图形和统计输出。在本文中,当采用两种状态时,单转换函数PSTR模型具有两个变量:我们的经验方法的基础包括评估N个国家的资本流动性。相应的模型定义如下:其中,Iit是第i个国家在时间t时观......
  • [Rust] Implicitly returning values from functions
    Codehaserror:fnmain(){letanswer=square(3);println!("Thesquareof3is{}",answer);}fnsquare(num:i32)->i32{num*num;}Error:⚠️Compilingofexercises/functions/functions5.rsfailed!Pleasetryagain.Here&#......
  • 协变返回类型(covariant return type)
    协变返回类型(covariantreturntype)C++中的协变返回类型(covariantreturntype)是指派生类(子类)中的虚函数返回类型可以是基类(父类)中虚函数返回类型的子类。这个特性使得在派生类中可以返回更具体的类型,而不违反了虚函数的约定。在C++11中,如果派生类的虚函数覆盖基类的虚函数,并......
  • Go 100 mistakes - #45: Returning a nil receiver
        We’veseeninthissectionthatinGo,havinganilreceiverisallowed,andaninterfaceconvertedfromanilpointerisn’tanilinterface.Forthatreason,whenwehave toreturnaninterface,weshouldreturnnotanilpointerbuta......
  • subprocess中的return_code与poll
    subprocess中的return_code与pollp=subprocess.Popen('ping8.8.8.8',shell=True,stdout=subprocess.PIPE,stderror=subprocess.DEVNULL)whilenotp.poll():#p.poll()即为return_codeprint(p.stdout.read().decode())#return_code=p.poll()#......
  • return vs exit
    在C语言中,return和exit都是用于退出函数的,但它们之间有一些区别。return语句:return语句用于从函数中返回一个值。当函数执行到return语句时,函数立即结束并返回指定的值。return语句可以带一个值,也可以不带值。如果不带值,那么函数返回一个默认值(例如,对于整数函数,返回0;对于浮点函......
  • 微控制器STM32L475RCT7[IC MCU 32BIT 256KB]、AZ5A25-01F.R7G瞬态抑制二极管(TVS),AONS
    1、微控制器STM32L475RCT7[ICMCU32BIT256KBFLASH64LQFP]STM32L475RC器件是基于高性能ARM®Cortex®-M432位RISC内核的超低功耗微控制器,工作频率高达80MHz。Cortex-M4内核具有浮点单元(FPU)单精度,支持所有ARM单精度数据处理指令和数据类型。它还实现了完整的DSP指令集和存储......
  • GitHub 热搜项目--电视直播软件:my-tv
    1.GitHub热搜项目1.1开箱即用的电视直播软件:my-tv主语言:C,Star:10k,周增长:6.9k这是一款开源、免费、无广告、不用注册的电视直播软件,适用于Android5及以上的手机和电视盒子。它安装即用、启动快,没有花里胡哨的UI和弹框,内置中央台、地方台等优质直播源,画质高清、播放流畅,......
  • useEffect中return语句的执行时机
    概要:在开发过程中我发现了一个问题,在useEffect中写的return函数并没有执行,于是在此基础上进行了查证和测试.一、useEffect的使用方法1.两个参数,第二个参数为空数组useEffect(()=>{console.log('111')},[])结果:执行一次2.两个参数,第二个参数不为空数组......