首页 > 其他分享 >CF1774G Segment Covering 题解

CF1774G Segment Covering 题解

时间:2024-04-25 16:33:06浏览次数:19  
标签:ch int 题解 CF1774G up st ed Segment 线段

题目链接

点击打开链接

题目解法

这么牛的题!!!

我第一眼看到 偶\(-\)奇 想到的是 LGV /xk

有一堆线段的题先考虑有没有线段之间的特殊关系
这道题中,如果有线段 \(x\) 包含线段 \(y\),则线段 \(x\) 是无用的,因为如果选了 \(x\),那么选不选 \(y\) 无所谓,因为是 偶\(-\)奇,所以贡献抵消了

现在的线段已经是互补包含的了
考虑拎出所有属于 \([l,r]\) 之间的线段(令左端点为 \(l\) 的线段为 \(st\),右端点为 \(r\) 的线段为 \(ed\))
若有 \(l_{st}<l_{st+1}<l_{st+2}<r_{st}\),则线段 \(st+2\) 是无用的,为什么?

  1. 角度1
    如果同时选线段 \(st,st+2\),则线段 \(st+1\) 可选可不选,贡献抵消了
  2. 角度2
    用朴素的 \(dp\) 解释,令 \(f_i\) 为以线段 \(i\) 为结尾的贡献
    转移式为 \(f_i=\sum\limits_{j<i,l_i\le r_j}f_j\)
    显然 \(f_{st}=1,f_{st+1}=-1,f_{st+2}=0\)

把无用的线段去掉之后,我们选择的方案是唯一的,这个往后手推一下角度 2 中的 \(f\) 可以得出

上面的做法看起来不太能上 \(ds\) 优化
考虑换个角度看这个做法
假设当前的线段为 \(x\),则下次的下次的线段是满足 \(l_y>r_x\) 的最小的 \(y\)
我们从 \(st\) 和 \(st+1\) 分别往后跳,能跳到 \(ed\) 答案就 \(\neq 0\),至于到底是 \(-1\) 还是 \(1\) 就看路径长度的奇偶性
往后跳的过程可以用倍增优化

时间复杂度 \(O((n+m)\log n)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=400010;
int n,m,up[N][20];
int disc[N],cnt;
#define lowbit(x) x&-x
struct fenwick{
    int tr[N];
    void add(int x){ for(;x<=cnt;x+=lowbit(x)) tr[x]++;}
    int ask(int x){ int res=0;for(;x;x-=lowbit(x)) res+=tr[x];return res;}
}tr;
#define l first
#define r second
pii org[N],seg[N],rvs[N];
vector<int> range[N];
int jump(int x,int ed){ DF(i,18,0) if(up[x][i]<=ed) x=up[x][i];return x;}
int main(){
    read(n),read(m);
    F(i,1,n){
        read(org[i].l),read(org[i].r);
        disc[++cnt]=org[i].l,disc[++cnt]=org[i].r;
    }
    sort(disc+1,disc+cnt+1);
    cnt=unique(disc+1,disc+cnt+1)-disc-1;
    F(i,1,n){
        org[i].l=lower_bound(disc+1,disc+cnt+1,org[i].l)-disc;
        org[i].r=lower_bound(disc+1,disc+cnt+1,org[i].r)-disc;
        range[org[i].l].pb(org[i].r);
    }
    int len=0;
    DF(l,cnt,1){
        sort(range[l].begin(),range[l].end());
        for(int r:range[l]){
            if(!tr.ask(r)) seg[++len]={disc[l],disc[r]},rvs[len]={disc[r],disc[l]};
            tr.add(r);
        }
    }
    reverse(seg+1,seg+len+1),reverse(rvs+1,rvs+len+1);
    int j=len+1;
    DF(i,len,1){
        while(seg[j-1].l>seg[i].r) j--;
        up[i][0]=j;
    }
    F(j,0,18) up[len+1][j]=len+1;
    F(j,1,18) F(i,1,len) up[i][j]=up[up[i][j-1]][j-1];
    while(m--){
        int lo,hi;read(lo),read(hi);
        int st=lower_bound(seg+1,seg+len+1,pair{lo,-1})-seg;
        int ed=lower_bound(rvs+1,rvs+len+1,pair{hi,-1})-rvs;
        if(seg[st].l!=lo||seg[ed].r!=hi){ puts("0");continue;}
        int cur1=jump(st,ed),cur2=jump(st+1,ed);
        if(cur1==cur2) puts("0");
        else if(cur1==ed) puts("998244352");
        else if(cur2==ed) puts("1");
        else puts("0");
    }
    return 0;
}

标签:ch,int,题解,CF1774G,up,st,ed,Segment,线段
From: https://www.cnblogs.com/Farmer-djx/p/18157991

相关文章

  • 重庆软航H5 PDF签章产品经nginx代理之后在浏览器中在线打开PDF盖章时提示:签章失败:网络
    问题现象:问题描述:在系统中集成了软航H5PDF签章产品,软航H5PDF签章产品的对应服务是通过nginx代理的,在奇安信浏览器中在线打开PDF点击产品的工具栏上的盖章按钮:选定印章之后,在PDF文档上选定盖章位置之后,提示:签章失败:网络错误。最近在做这个软航H5PDF电子签章产品的测试,就简......
  • CF518F 题解
    观察到一条管道的拐点数量只有\(3\)种可能的取值:没有拐点,即管道呈现一条直线。有\(1\)个拐点。有\(2\)个拐点。分别对应了下面三种情况:....#....#.*..#*********..***...#....#*...#*.#.........
  • 2023CPCC河南省赛题解+总结
    2023CPCC河南省赛题解+总结比赛链接:https://codeforces.com/gym/104354答题情况:答题情况开题顺序是:A-F-H-K-E-B-G题面链接:https://codeforces.com/gym/104354/attachments/download/20061/statements_2.pdfProblemA.小水獭游河南签到题,队友写的题意:  给你一个字符......
  • git命令下,mac环境下载依赖相关报错问题解决方案
    1.安装fundry框架curl-Lhttps://foundry.paradigm.xyz|bash2.写入环境变量source/Users/xx/.bashrc3.foundryup问题1报错:致命错误:无法访问'https://github.com/foundry-rs/forge-std解决方案:设置hosts文件:添加指定url的ip地址:140.82.112.4github.com185.1......
  • 【题解】A566.三点共线
    题目大意,给定在平面直角坐标系中的多个点,判断有多少个三元组\((A,B,C)\)满足共线性质。题目链接:A566.三点共线。大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可。其实还有其他方法可以做,我个人感觉用斜率法最简单。有几点需要注意:在计算斜率的时候,如果多......
  • ABC350 E - Toward 0 题解
    AtCoderBeginnerContest350E-Toward0原题地址题意给定四个数NAXY,你可以对N进行以下两种操作。花费X的代价将N变成\(\lfloor\cfrac{N}{A}\rfloor\)花费Y的代价掷一颗骰子,设掷出结果是i,将N变成\(\lfloor\cfrac{N}{i}\rfloor\)你需要执行若干次......
  • 前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法
    目录1.引言2.跨源资源共享和实现方法3.在Django项目中配置django-cors-headers库Reference1.引言在进行后端API开发时,有时会遇到“跨域资源共享(CORS)请求...被阻止“的错误,如图1所示。本文讲解如何在使用DRF(DjangoRESTFramework)的后端API开发项目中解决这个问题。Ac......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23 题解
    CodeforcesRound940(Div.2)andCodeCraft-23题解题目链接A.Stickogon贪心#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebu......
  • [HNOI2005] 星际贸易 题解
    [HNOI2005]星际贸易将问题分为两次dp。题面有:“只有一种获得最大贸易额的方法”所以直接说明了贸易额与那些费用无关。有考虑到无论干啥都要维护,第二次\(dp\)直接以暗物质为核心即可对于这里\(R\)与\(n*2\)取\(min\)的一些细节理解。我们设计状态,因为观察到了暗......
  • 洛谷 P8989 [北大集训 2021] 随机游走 题解
    前言又是随机游走?题目分析看到加边,可能性太多了。但是为了让步数最大化,我们可以贪心地想,肯定要往前面连,而且越前面要走的期望步数肯定越大。并且,我们不会浪费边在终点上。于是,题目转变成了\(1\simn-1\)连向起点\(1\)连若干条边,使得随机游走到终点的期望步数最大。那要......