首页 > 其他分享 >CF1956F Nene and the Passing Game 题解

CF1956F Nene and the Passing Game 题解

时间:2024-04-30 15:12:48浏览次数:18  
标签:CF1956F ch fa Nene 题解 rbegin int read event

题目链接

点击打开链接

题目解法

首先答案为连边之后连通块的个数

把限制中的 \(i,j\) 分开,则 \(i,j\) 能传球当且仅当 \(i+l_i\le j-l_j\) 且 \(j-r_j\le i+r_i\)
这是一个二维偏序的形式
先考虑怎么暴力做,考虑将 \((i+l_i,0),\;(i-l_i,1)\) 排序,然后按顺序加入

  1. 如果碰到操作 \((i+l_i,0)\),就把 \(i+r_i\) 加入 \(set\)
  2. 如果碰到操作 \((i-l_i,1)\),就把所有 \(set\) 中 \(\ge i-r_i\) 的人都与 \(i\) 合并

如何优化这个过程?
考虑优化连边数量
一个发现是若 \(set\) 中的两人 \(x,y\),满足 \(x_r+x<y+r_y\) 且 \(x,y\) 连通,则 \(x\) 没有保留的必要,理由显然
那么我们每一次碰到 \((...,1)\) 操作时,把除了最大的且需要合并的人都删除即可

时间复杂度 \(O(n\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;
}
typedef tuple<int,int,int> tup;
const int N=2000010;
int l[N],r[N],fa[N];
bool vis[N];
tup event[N<<1];
#define fi first
#define se second
set<pii> S;
int gfa(int x){ return x==fa[x]?x:fa[x]=gfa(fa[x]);}
void merge(int x,int y){ fa[gfa(x)]=gfa(y);}
void work(){
    S.clear();
    int n;read(n);
    F(i,1,n) read(l[i]),read(r[i]);
    int len=0;
    F(i,1,n) event[++len]={i-l[i],1,i},event[++len]={i+l[i],0,i};
    sort(event+1,event+len+1);
    F(i,1,n) fa[i]=i;
    F(i,1,len){
        auto [t,type,x]=event[i];
        if(!type) S.insert({r[x]+x,x});
        else if(!S.empty()&&(*S.rbegin()).fi>=x-r[x]){
            pii rec=*S.rbegin();
            while(!S.empty()&&(*S.rbegin()).fi>=x-r[x]) merge(x,(*S.rbegin()).se),S.erase(*S.rbegin());
            S.insert(rec);
        }
    }
    F(i,1,n) vis[gfa(i)]=1;
    int ans=0;F(i,1,n) ans+=vis[i],vis[i]=0;
    printf("%d\n",ans);
}
int main(){
    int T;read(T);
    while(T--) work();
    return 0;
}

标签:CF1956F,ch,fa,Nene,题解,rbegin,int,read,event
From: https://www.cnblogs.com/Farmer-djx/p/18168045

相关文章

  • npm下载包时报错 Unexpected token '.'问题解决
    1.出现问题当通过nvm切换nodejs版本为16以上时,npminstall[package]报错:Unexpectedtoken'.'2.问题原因该问题不是npm的问题,也不是nodejs的问题,是nvm-windows的问题。3.解决问题nvm-windows已经更新版本解决了这个问题我是通过更新nvm-windows到版本1.19解决了这个问题......
  • Atcoder ABC 351 全题解
    乾岩我:G题来咯!!!大火:这G题,大家都不敢做,说是有人在里面放了毒瘤。我:做,做,为什么不做!不做也别想活着!!!(两天后)我:我的G题完成辣!!!!!!AB不讲C显然$2^a*2=2^{a+1}$。考虑用一个栈存球的大小是$2$的多少次方,每次插入球后,不断取出后面两个球,大小相同则合并,否则插入下一个......
  • XYCTF pwn部分题解 (部分题目详解)
    hello_world(签到)思路:✅这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shellwp:invisible_flag思路:✅题目提示orw,那我们先看看是否开了沙盒那么是开了沙盒的,试试orw读取flag虽然保护全开但是程序会执行我们写的shellcdoe那么就可......
  • 二叉树笔试题解题思路
    数据结构二叉树笔试题:解题思路:1.判断是否为空树,若为空树,则返回0;2.定义两个指针备份根结点地址,定义两个整型变量a,b并初始化为0,记录左右子树的深度;先对根结点的左子树进行遍历,若根结点的左结点不为NULL,则a++,把根结点的左结点赋值为新的根结点,再进行上述操作,若根结点的左结点......
  • AtCoder-abc350_g 题解
    原题链接题意简述有一个无向图,初始时没有边。接下来有一些操作:将\(u,v\)连边。询问\(u,v\)的距离是否为\(2\),如果是,则输出中间的那个点的编号,否则输出0。每次询问后,更新\(lastans\)为询问的答案,初始时为\(0\)。每次操作的\(opt,u,v\)使用\(lastans\)解码,......
  • AtCoder-abc350_f 题解
    原题链接题意简述给定一个字符串\(S\),对于每个匹配的括号,将括号内的字符左右翻转并大小写反转,然后删除括号。输出最后的序列。思路本题为文艺平衡树的模板题。扫一遍字符串进行括号匹配,每次把最内层的括号进行操作。最后遍历一遍平衡树,将不为括号字符的字符输出。FHQ_Treap......
  • 【题解】 量化交易1
    题目描述applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:......
  • 【题解】 量化交易2
    题目描述applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:......
  • 问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare inter
    大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误“错误:Failedtodownloadmetadataforrepo‘AppStream’:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist”1、进入yum的repos目录代码语言:javascript复制cd/etc/yum......
  • git - git 问题解决方案汇总
    git命令行相关问题汇总记录如下:在本地创建git仓库并关联远程仓库后,无法正常拉取远程更新报错信息:fatal:refusingtomergeunrelatedhistories解决方案:gitpulloriginmaster--allow-unrelated-histories解决git使用ssh无法访问服务器的问题报错信息:Error:Unab......