传送门

题目看一半:"woc 裸的 $2-sat$ 白给??"

看完以后:"...???"

如果没有 $f$ 的限制,那就是个白给的 $2-sat$ 问题,但是现在有这个限制...

直接枚举 $f$ 显然不行,考虑把 $f$ 也纳入我们构建的 $2-sat$ 模型

对于某个限制在 $[l,r]$ 的站,如果我们选择了它,那么所有 $r'$ 小于 $l$ 的站和 $l'$ 大于 $r$ 的站都不能选择

所以一种暴力就是两两枚举看看是否冲突,显然还是会 $T$ 飞

考虑到对于某个 $ri>rj$ ,和 $ri$ 冲突的站一定同样和 $rj$ 冲突,考虑构建虚节点链 $np[]$,$np[i]$ 连向 $np[i+1]$

对于 $ri$ ,虚链上对应的节点为 $np[ri]$,那么对于每个点 $x$ 的 $rx$ ,连边 $x$ 到 $np[rx+1]$,对于每个点 $x$ 的 $lx$ 连边 $np[lx]$ 到 $m+x$

(这里的 $m$ 和题目的 $m$ 不一样,显然 $m+x$ 表示 $x$ 不选,$x$ 表示 $x$ 选)

这样构图以后,如果 $x$ 选了,那么所有 $li$ 大于 $rx$ 的节点 $i$,一定会连到 $m+i$ (即不选)

对于 $l$ 的限制也是差不多的构造,自己画一画吧

具体代码实现参考 DTSBT ,代码实现的时候操作比较骚,要看懂得仔细想想(对我来说...)

数组大小要稍微注意一下,别像我一样乱开

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e6+;
int n,m,p,q,L[N],R[N];
vector <int> Tl[N],Tr[N];
int fir[N],from[N<<],to[N<<],cntt;
inline void add(int a,int b) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; }
int dfn[N],low[N],dfs_clock,bel[N],tot,st[N],Top;
void Tarjan(int x)
{
dfn[x]=low[x]=++dfs_clock; st[++Top]=x;
for(int i=fir[x];i;i=from[i])
{
int &v=to[i];
if(!dfn[v]) Tarjan(v),low[x]=min(low[x],low[v]);
else if(!bel[v]) low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x])
{
tot++;
while(st[Top]!=x) bel[st[Top--]]=tot;
bel[st[Top--]]=tot;
}
}
int main()
{
n=read(),m=read(),p=read(),q=read(); int a,b;
for(int i=;i<=n;i++)
{
a=read(),b=read();
add(m+a,b); add(m+b,a);
}
for(int i=;i<=m;i++)
{
L[i]=read(),R[i]=read();
Tl[L[i]].push_back(i); Tr[R[i]].push_back(i);
}
for(int i=;i<=q;i++)
{
a=read(),b=read();
add(a,m+b); add(b,m+a);
}
int cnt=m*,ta=++cnt,tb=++cnt;
for(int i=;i<=p;i++)
{
for(auto x: Tl[i]) add(x,ta),add(tb,m+x);
for(auto x: Tr[i])
{
cnt++; add(cnt,ta); add(cnt,m+x); ta=cnt;
cnt++; add(tb,cnt); add(x,cnt); tb=cnt;
}
}
for(int i=;i<=*m;i++) if(!dfn[i]) Tarjan(i);
for(int i=;i<=m;i++) if(bel[i]==bel[m+i]) { printf("-1\n"); return ; }
int ans=; vector <int> V;
for(int i=;i<=m;i++)
if(bel[i]<bel[i+m]) ans=max(ans,L[i]),V.push_back(i);
printf("%d %d\n",int(V.size()),ans);
for(auto x: V) printf("%d ",x); printf("\n");
return ;
}

Codeforces 1215F. Radio Stations的更多相关文章

  1. CodeForces - 762E:Radio stations (CDQ分治||排序二分)

    In the lattice points of the coordinate line there are n radio stations, the i-th of which is descri ...

  2. 【题解】Radio stations Codeforces 762E CDQ分治

    虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ ...

  3. Radio stations CodeForces - 762E (cdq分治)

    大意: 给定$n$个三元组$(x,r,f)$, 求所有对$(i,j)$, 满足$i<j, |f_i-f_j|\le k, min(r_i,r_j)\ge |x_i-x_j|$ 按$r$降序排, ...

  4. CodeForces - 796D Police Stations bfs

    思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能k棵.其实就是以每个警局为根结点,把整棵树划分为以警局为根结点的k棵树,说明要删除的边的数量就是k-1条,即 ...

  5. Codeforces 343E Pumping Stations

    Description 题面 题目大意:求一个排列 \(P\),使得 \(\sum_{i=1}^{n-1}maxflow(P_i,P_{i+1})\) 尽量大 Solution 构造出最小割树,那么第 ...

  6. CF762E Radio Stations

    题目戳这里. 我还以为是KDtree呢,但是KDtree应该也可以做吧. 这是一道数据结构好题.考虑到由于\(K \le 10\),所以我们用两个大vector--\(Left,Right\),\(L ...

  7. 【CF1215F】 Radio Stations

    题目 比较精妙的\(\text{2-sat}\)建图了 还是按照套路把每个电台拆成\((0/1,i)\)表示不选/选 前两种连边是板子就不解释了 考虑如何限制选择一个唯一的\(f\),并且还能限制不选 ...

  8. [cf1215F]Radio Stations

    这道题如果没有功率的限制,显然就是一个裸的2-sat 考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可 但是这样建图的边数是o(n^2),需要优化 将功率区间分 ...

  9. Codeforces Round 585

    Codeforces Round 585 浅论如何发现自己是傻子的-- 反正今天是完全蒙的,水了签到题就跑了-- A. Yellow Cards 签到题. 众所周知,CF的签到题一般是一道神神奇奇的数 ...

随机推荐

  1. JS Module

    JS Module Summary I. Why we need to use the Module? In the past, Javascript can execute independentl ...

  2. unittest详解(四) 批量执行用例(discover)

    前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...

  3. 导数与微分简单总结(updated)

    只讲一些导数在OI中的简单应用,特别基础的东西,不会很详细也不会很全面. 导数的定义 设函数\(y=f(x)\)在点\(x_0\)的某个邻域内有定义,当自变量\(x\)在\(x_0\)处有增量\(Δx ...

  4. Mysql启动报错 The server quit without updating PID

    [root@db mysql]# service mysql restartMySQL server PID file could not be found![失败]Starting MySQL... ...

  5. python学习之路(8)

    定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_ ...

  6. [JZOJ5398]:Adore(状压DP+记忆化搜索)

    题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...

  7. 套接字选项 之 SO_REUSEADDR && SO_REUSEPORT

    说明 本文下面内容基本上是截取自stackoverflow,针对这两个选项,在另外一篇文章中做了总结,请移步<Linux TCP套接字选项 之 SO_REUSEADDR && S ...

  8. Mysql : Maximum execution time of 30 seconds exceeded

    在向Mysql数据库中插入数据时,提示Maximum execution time of 30 seconds exceeded.......翻译:最大运行时间超过30秒. 最后在php.ini中找到 ...

  9. Oracle9i的详细安装与卸载步骤(有图解)

       Oracle9i的安装和卸载详解      本章将以Windows操作系统为例讲述Oracle9i数据库的安装                                           ...

  10. c# 单元测试 ,对静态方法(static)和私有方法(private) 进行单元测试

    利用反射: /// <summary> /// 调用静态方法 /// </summary>akf /// <param name="t">类全名 ...