传送门

题目看一半:"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. LeetCode 141、142环形链表

    141题: 首先,先看141题,这个题是比较初级也是比较经典的环形链表题: 给定一个链表,判断链表中是否有环. 进阶:你能否不使用额外空间解决此题? 那么,什么是有环的链表呢: 这个就是有环的链表 题 ...

  2. HDU 6155 Subsequence Count (DP、线性代数、线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6155 题解 DP+线代好题.(考场上过多时间刚前两题,没怎么想这题--) 首先列出一个DP式: 设\( ...

  3. Oracle根据连续性日期的重复数据取最大或最小值日期

    原始数据: 结果数据: 对比两个图,要是不处理连续性中的重复值,我们直接可以用LEAD函数了事,但处理出来的结果貌似多余. 我的思路是先将原始数据中连续性日期有重复值的处理好,即选择最小的一个,比如2 ...

  4. 安装破解confluence6.7.1(插图丢了,一直懒得补)

      JIRA安装:https://www.cnblogs.com/wei9593/p/10194784.html 1环境: centos7.2 java-1.8https://www.cnblogs. ...

  5. mysql 查询每个分组的前几名

    按分组排序,并查出每个分组的前3名 单表 SELECT * FROM ( SELECT ZONEID, uid, NAME, fight, IF ( , ) AS rank, ( @zone := z ...

  6. Win10无法修改编辑hosts文件

    Win10无法修改编辑hosts文件 一.总结 一句话总结: 这里我的问题是windows的某次更新中把hosts文件或者上级目录设置成了只读,在文件属性中去掉这个只读就好 后文的操作相当于是给文件添 ...

  7. Python学习笔记:类

    类可以将数据与函数封装起来,用一个例子解释,先定义一个类: class athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.n ...

  8. ffmpeg静态库Windows版本

    GitHub上面有一个项目 提供了编译环境 以及编译好的静态库 https://github.com/ShiftMediaProject/FFmpeg

  9. javascript - 事件详解(阻止事件冒泡+阻止事件行为)

    一.事件流 1.事件流 描述的是在页面中接受事件的顺序 2.事件冒泡 由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点 (最具体 –> 最不具体) 3.事件捕获 最不具体的节点先接收事 ...

  10. 取长文本 READ_TEXT

    ****取长文本  FORM GET_TEXT USING TDID TDNAME. SELECT SINGLE mandt tdobject tdname tdid tdspras    INTO  ...