题目

比较精妙的\(\text{2-sat}\)建图了

还是按照套路把每个电台拆成\((0/1,i)\)表示不选/选

前两种连边是板子就不解释了

考虑如何限制选择一个唯一的\(f\),并且还能限制不选\(f\notin [l_i,r_i]\)的电台

考虑前缀优化建图,我们建\((0/1,i)\)表示在\([0,i]\)中不选/选某一个频率

对于这\(2\times m\)个点有一些显然的连边

\[(1,i)->(1,i+1)
\]

即\([0,i]\)内启用一个频率则\([0,i+1]\)中必启用一个频率

\[(0,i+1)->(0,i)
\]

即\([0,i+1]\)没有启用任何一个频率则\([0,i]\)必不会启用任何一个频率

注意到我们必须启用一个频率,所以连\((0,m)->(1,m)\),这样能强制使得\(m\)的拓扑序更靠后

之后对于一个电台\(i\),我们用\([0,l_i-1]\)和\([0,r_i]\)这两个前缀的关系来讨论一下

当\([0,l_i-1]\)内选择了一个频率时,电台\(i\)就没有办法被启用了,于是连\((1,l_i-1)->(0,i)\),以及对称边\((1,i)->(0,l_i-1)\)

当\([0,r_i]\)中没有任何一个频率被启用时,电台\(i\)也没有办法被启用,于是连\((0,r_i)->(0,i)\),以及对称边\((1,i)->(1,r_i)\)

根据我们连得两条对称边,我们发现当启用电台\(i\)的时候能推出\([0,l_i-1]\)没有频率被启用,\([0,r_i]\)有一个频率被启用,即被启用的频率在\([l_i,r_i]\)内,这符合题目要求

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=2e6+1;
struct E{int v,nxt;}e[maxn*10];
int dfn[maxn],low[maxn],st[maxn],f[maxn],col[maxn],head[maxn],id[2][maxn>>1],l[maxn>>2],r[maxn>>2];
int n,m,A,B,num,__,cnt,top,col_num,ans,Ans[500005];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
void tarjan(int x) {
dfn[x]=low[x]=++__,st[++top]=x,f[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
if(!dfn[e[i].v]) tarjan(e[i].v),low[x]=min(low[x],low[e[i].v]);
else if(f[e[i].v]) low[x]=min(low[x],dfn[e[i].v]);
if(dfn[x]==low[x]) {
col_num++;int now;
do{now=st[top--];f[now]=0;col[now]=col_num;}while(x!=now);
}
}
int main() {
A=read(),n=read(),m=read(),B=read();
for(re int i=1;i<=n;i++) id[0][i]=++cnt,id[1][i]=++cnt;
for(re int i=0;i<=m;i++) id[0][i+1+n]=++cnt,id[1][i+1+n]=++cnt;
for(re int x,y,i=1;i<=A;i++) {
x=read(),y=read();
add(id[0][x],id[1][y]);
add(id[0][y],id[1][x]);
}
for(re int i=1;i<=n;i++) l[i]=read(),r[i]=read();
for(re int x,y,i=1;i<=B;i++) {
x=read(),y=read();
add(id[1][x],id[0][y]);
add(id[1][y],id[0][x]);
}
add(id[1][n+1],id[0][n+1]);
for(re int i=1;i<=m;i++) {
int x=i+1+n;
add(id[0][x],id[0][x-1]);
add(id[1][x-1],id[1][x]);
}
add(id[0][n+m+1],id[1][n+m+1]);
for(re int i=1;i<=n;i++) {
int li=l[i]+n,ri=r[i]+n+1;
add(id[1][li],id[0][i]);
add(id[1][i],id[0][li]);
add(id[0][ri],id[0][i]);
add(id[1][i],id[1][ri]);
}
for(re int i=1;i<=cnt;++i) if(!dfn[i]) tarjan(i);
for(re int i=1;i<=n+1+m;i++) if(col[id[0][i]]==col[id[1][i]]) {puts("-1");return 0;}
for(re int i=1;i<=n;i++)
if(col[id[1][i]]<col[id[0][i]]) Ans[++ans]=i;
for(re int i=1;i<=m;i++) if(col[id[1][i+n+1]]<col[id[0][i+n+1]]) {
printf("%d %d\n",ans,i);
for(re int j=1;j<=ans;j++) printf("%d ",Ans[j]);
return 0;
}
}

【CF1215F】 Radio Stations的更多相关文章

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

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

  2. 【KMP】Radio Transmission

    问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...

  3. 【HDOJ】Power Stations

    DLX.针对每个城市,每个城市可充电的区间构成一个plan.每个决策由N*D个时间及N个精确覆盖构成. /* 3663 */ #include <iostream> #include &l ...

  4. 【bzoj1335】Radio Transmission

    给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 因为这个字符串是不断自匹配形成的我们可以很容易的想到,除了第一个字符串外,从第二个字符串 ...

  5. 【BZOJ】1355 [Baltic2009]Radio Transmission

    [算法]KMP [题解]KMP中n-next[n]得到最小循环节的性质. 考虑一个循环串(最后一个循环节可能残缺),它最长的[后缀=前缀]一定是以第二个循环节为起始位置的后缀. 正着考虑的话假设后缀T ...

  6. 【codeforces 796D】Police Stations

    [题目链接]:http://codeforces.com/contest/796/problem/D [题意] 在一棵树上,保证每个点在距离d之内都有一个警察局; 让你删掉最多的边,使得剩下的森林仍然 ...

  7. 【HDU 3663】 Power Stations

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3663 [算法] 先建图,然后用Dancing Links求解精确覆盖,即可 [代码] #inclu ...

  8. 【Codeforces Round #459 (Div. 2) B】 Radio Station

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map模拟一下映射就好了. [代码] #include <bits/stdc++.h> using namespace ...

  9. 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 ...

随机推荐

  1. Go语言中接口组合的实现方法

    在Go语言中,可以在接口A中组合其它的一个或多个接口(如接口B.C),这种方式等价于在接口A中添加接口B.C中声明的方法. 代码如下: //接口中可以组合其它接口,这种方式等效于在接口中添加其它接口的 ...

  2. GitHub 万星推荐:黑客成长技术清单

    GitHub 万星推荐:黑客成长技术清单 导语:如果你需要一些安全入门引导,“Awesome Hacking”无疑是最佳选择之一. 最近两天,在reddit安全板块和Twitter上有个GitHub项 ...

  3. 清理Visual Studio解决方案临时文件:Clean Visual Studio Solution Temporary File Build20160418

    复制保存到任意文件名.bat,放置在Visual Studio Solution目录下. 当Visual Studio Solution目录过于庞大或打算拷贝移动Visual Studio Solut ...

  4. Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则

    文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...

  5. HDU 6695 Welcome Party (贪心)

    2019 杭电多校 10 1005 题目链接:HDU 6695 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...

  6. PAT_A1012#The Best Rank

    Source: PAT A1012 The Best Rank (25 分) Description: To evaluate the performance of our first year CS ...

  7. MySQL数据库(二)——库相关操作、表相关操作(一)、存储引擎、数据类型

    库相关操作.表相关操作(一).存储引擎.数据类型 一.库相关操作 1.创建数据库 (1)语法 create database 数据库 charset utf8; (2)数据库命名规范 可以由字母.数字 ...

  8. Lambda表达式底层分析

    一.我们先看下C#代码下Lamdba表达式的写法 // <summary> /// 写入日志委托 /// </summary> /// <param name=" ...

  9. hql 跟 sql 区别

    hql 跟 sql 区别  1.hql与sql的区别 sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 类名+类对象 where 后 用对象的属性做条件 sql: fro ...

  10. Hexo使用攻略-添加分类及标签

    创建"分类"选项 生成"分类"页并添加tpye属性 打开命令行,进入博客所在文件夹.执行命令 hexo new page categories 成功后会提示: ...