首页 > 其他分享 >23牛客多校9 I Non-Puzzle: Segment Pair

23牛客多校9 I Non-Puzzle: Segment Pair

时间:2023-08-14 18:55:25浏览次数:49  
标签:方案 Non 23 int Puzzle mi maxn 区间 mod

也许更好的阅读体验

\(\mathcal{Description}\)
给\(n\)对区间,要求每对区间恰好选一个使得选出来的\(n\)个区间有交集,问有多少方案数
\(1\le n, l_i,r_i\le 5×10^5\)

\(\mathcal{Solution}\)
注意到区间的值域也是\(5×10^5\),考虑从值域入手,也就是枚举每个点看有多少种方案使最后的交集包含这个点
设有\(k\)对区间的两个区间都包含这个点,那么就有\(2^k\)种方案
显然,这样的方法会算重,因为不同的点可能对应相同的选择方案,考虑当前枚举的点是\(i\),假设\(i-1\)对应的方案数为\(2^m\),如果点\(i\)相比点\(i-1\)没有新增的区间,也没有减少区间,那么\(i\)和\(i-1\)方案数是完全一样的,如果\(i\)比\(i-1\)新增了一些区间并没有减少区间,那么\(i\)对应的方案数是包含了\(i-1\)对应的方案数的,新增的方案数是二者的差\(2^k-2^m\),而如果减少了一些区间,那么我们记减少了后对应的方案数为\(2^p\),新增的方案数仍然是二者的差\(2^k-2^p\),我们只需维护这个过程即可,总复杂度\(O(n)\)

\(\mathcal{Code}\)

#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 5e5 + 10;
const int mod = 1e9 + 7;
int n, k, ans;
int num[maxn], mi[maxn];
vector <int> in[maxn], out[maxn];
int mo (int x)
{
    if (x >= mod)   return x - mod;
    return x;
}
int main ()
{
    scanf("%d", &n);
    mi[0] = 1;
    for (int i = 1; i <= n; ++i)    mi[i] = mo(mi[i - 1] << 1);
    for (int i = 1, l, r; i <= n; ++i) {
        scanf("%d%d", &l, &r);
        in[l].push_back(i), out[r + 1].push_back(i);
        scanf("%d%d", &l, &r);
        in[l].push_back(i), out[r + 1].push_back(i);
    }
    int tot = 0, mx = 500000, lst = mx + 1;
    for (int i = 1; i <= mx; ++i) {
        for (int v : out[i]) {
            if (num[v] == 2)    --k;
            --num[v];
            if (!num[v])    --tot;
        }
        if (tot < n)	lst = mx + 1;
        else	lst = k;
        for (int v : in[i]) {
            if (!num[v])    ++tot;
            ++num[v];
            if (num[v] == 2)    ++k;
            if (tot == n) {
				if(lst == mx + 1 || k > lst)    ans = mo(mo(ans + mod - mi[lst]) + mi[k]);
				lst = k;
			}
        }
    }
    printf("%d\n", ans);
    return 0;
}

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

标签:方案,Non,23,int,Puzzle,mi,maxn,区间,mod
From: https://www.cnblogs.com/Morning-Glory/p/17629472.html

相关文章

  • 云原生周刊:Kubernetes v1.28 新特性一览 | 2023.8.14
    推荐一个GitHub仓库:Fast-Kubernetes。Fast-Kubernetes是一个涵盖了Kubernetes的实验室(LABs)的仓库。它提供了关于Kubernetes的各种主题和组件的详细内容,包括Kubectl、Pod、Deployment、Service、ConfigMap、Volume、PV、PVC、Daemonset、Secret、Affinity、Taint-Tolerati......
  • 【专题】2023年Z世代新母婴人群消费洞察报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33430原文出处:拓端数据部落公众号我国出生人口数量在2022年为956万人,比去年减少了10%。多种因素影响了这一趋势,包括育龄人口减少、生育观念改变以及婚育年龄推迟。然而,与此同时,由于母婴人群消费水平不断提高,以及精细化喂养逐渐成为育儿的主流方式,......
  • Nep2023的wp
    0x00闲言碎语2023.8.14记录11-13的紧张刺激。46名结赛。非常高兴能够参加NepCTF2023,以一个初出茅庐的新人的身份参加。ctf的乐趣在于学习和探索,同时我也有想证明自己的成分。连续两天的凌晨四点睡觉,让我体会着比赛的魅力。每当我纠结一道题(code是第一晚,陌生的语言和login是第......
  • 高频SQL 50题(基础版): 进店却未进行过交易的顾客 | 2023-08-14
    问题表:Visits+-------------+---------+|ColumnName|Type|+-------------+---------+|visit_id|int||customer_id|int|+-------------+---------+visit_id是该表中具有唯一值的列。该表包含有关光临过购物中心的顾客的信息。表:Transact......
  • DP vs Non DP
    我们对知识的探究来源于探寻规律,而许多规律性的问题可以分出阶段进行递推解决,这样就形成了DP。DP非常有用,但它并不能取代找规律的过程。即使是多阶段决策问题,发现一些规律可能比直接使用DP更加简单。例子:你有\(n\)个字母A,\(m\)个字母B,你可以将这些字母组成成为一个字......
  • [YsOI2023] 广度优先遍历 逆向输出路径(分层建树拓扑序. LCA)
    今天的模板测试是无向图上的广度优先遍历,【数据删除】马上写好了代码:1#include<cstdio>2#include<cstring>3#include<iostream>4#include<algorithm>5#include<vector>6#include<queue>7usingnamespacestd;8constintmaxn=100005;......
  • 删数问题 洛谷p1323
    决定做一系列贪心,贪心真的,最早学的算法,到现在还有时候不太敢贪,还贪不来,一直挺逃避贪心问题的。。 删除前的数字可以先用优先队列对所有数字进行预处理,数据范围是3e4,也不是很大,直接全部处理了吧。constintN=1e5+10,inf=0x3f3f3f3f3f3f3f3f,MAX=3e4+10;inta[N]......
  • DS CATIA Composer R2023(3D辅助设计软件) HF3中文永久使用
    DSCATIAComposerR2023是一款功能强大的3D辅助设计软件。点击获取DSCATIAComposerR2023 下面是对DSCATIAComposerR2023的800字详细介绍:DSCATIAComposerR2023是由达索系统(DassaultSystèmes)开发的一款专业的3D辅助设计软件。它为用户提供了创新的工具和功能,旨在......
  • 阿里云微服务引擎 MSE 2023 年 7 月产品动态
    ......
  • 2023年8月中国数据库排行榜:TiDB 重夺榜眼,PolarDB 再进一位
    斗力频催鼓、争都更少筹。2023年8月的 墨天轮中国数据库流行度排行 在炎炎夏日中火热出炉,本月共有286个数据库参与排名。本月排行榜前十中,头部变动加剧。TiDB发奋图强重夺榜眼,阿里云PolarDB排名连续上升,其余数据库稳居原位显魄力。本月排行榜解读文章「专家观点」板块邀......