Codeforces 1215F. Radio Stations
题目看一半:"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的更多相关文章
- 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 ...
- 【题解】Radio stations Codeforces 762E CDQ分治
虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ ...
- 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$降序排, ...
- CodeForces - 796D Police Stations bfs
思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能k棵.其实就是以每个警局为根结点,把整棵树划分为以警局为根结点的k棵树,说明要删除的边的数量就是k-1条,即 ...
- Codeforces 343E Pumping Stations
Description 题面 题目大意:求一个排列 \(P\),使得 \(\sum_{i=1}^{n-1}maxflow(P_i,P_{i+1})\) 尽量大 Solution 构造出最小割树,那么第 ...
- CF762E Radio Stations
题目戳这里. 我还以为是KDtree呢,但是KDtree应该也可以做吧. 这是一道数据结构好题.考虑到由于\(K \le 10\),所以我们用两个大vector--\(Left,Right\),\(L ...
- 【CF1215F】 Radio Stations
题目 比较精妙的\(\text{2-sat}\)建图了 还是按照套路把每个电台拆成\((0/1,i)\)表示不选/选 前两种连边是板子就不解释了 考虑如何限制选择一个唯一的\(f\),并且还能限制不选 ...
- [cf1215F]Radio Stations
这道题如果没有功率的限制,显然就是一个裸的2-sat 考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可 但是这样建图的边数是o(n^2),需要优化 将功率区间分 ...
- Codeforces Round 585
Codeforces Round 585 浅论如何发现自己是傻子的-- 反正今天是完全蒙的,水了签到题就跑了-- A. Yellow Cards 签到题. 众所周知,CF的签到题一般是一道神神奇奇的数 ...
随机推荐
- JS Module
JS Module Summary I. Why we need to use the Module? In the past, Javascript can execute independentl ...
- unittest详解(四) 批量执行用例(discover)
前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...
- 导数与微分简单总结(updated)
只讲一些导数在OI中的简单应用,特别基础的东西,不会很详细也不会很全面. 导数的定义 设函数\(y=f(x)\)在点\(x_0\)的某个邻域内有定义,当自变量\(x\)在\(x_0\)处有增量\(Δx ...
- Mysql启动报错 The server quit without updating PID
[root@db mysql]# service mysql restartMySQL server PID file could not be found![失败]Starting MySQL... ...
- python学习之路(8)
定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_ ...
- [JZOJ5398]:Adore(状压DP+记忆化搜索)
题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...
- 套接字选项 之 SO_REUSEADDR && SO_REUSEPORT
说明 本文下面内容基本上是截取自stackoverflow,针对这两个选项,在另外一篇文章中做了总结,请移步<Linux TCP套接字选项 之 SO_REUSEADDR && S ...
- Mysql : Maximum execution time of 30 seconds exceeded
在向Mysql数据库中插入数据时,提示Maximum execution time of 30 seconds exceeded.......翻译:最大运行时间超过30秒. 最后在php.ini中找到 ...
- Oracle9i的详细安装与卸载步骤(有图解)
Oracle9i的安装和卸载详解 本章将以Windows操作系统为例讲述Oracle9i数据库的安装 ...
- c# 单元测试 ,对静态方法(static)和私有方法(private) 进行单元测试
利用反射: /// <summary> /// 调用静态方法 /// </summary>akf /// <param name="t">类全名 ...