[cf1215F]Radio Stations
这道题如果没有功率的限制,显然就是一个裸的2-sat
考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可
但是这样建图的边数是o(n^2),需要优化
将功率区间分为两种,一种在这个点前面,另一种在这个点的后面
同样将功率也裂成两个点,分别连向这两种区间,因为功率i的第1种点一定是功率i+1的第一种点的子集,因此(i+1)1->i1和功率右区间恰好在i+1的点,同理(i-1)2->i2和功率左区间恰好为i-1的点
对图求强连通,如果裂成的两个点中在同一个强连通就不行,否则所有选1的区间都要选,功率是最大的i2

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1600005
4 struct ji{
5 int nex,to;
6 }edge[N<<2];
7 int E,n,m,m1,m2,x,y,ans,head[N],vis[N],dfn[N],low[N],s[N];
8 void add(int x,int y){
9 edge[E].nex=head[x];
10 edge[E].to=y;
11 head[x]=E++;
12 }
13 void dfs(int k){
14 dfn[k]=low[k]=++x;
15 s[++s[0]]=k;
16 for(int i=head[k];i!=-1;i=edge[i].nex){
17 int v=edge[i].to;
18 if (!dfn[v]){
19 dfs(v);
20 low[k]=min(low[k],low[v]);
21 }
22 else
23 if (!vis[v])low[k]=min(low[k],dfn[v]);
24 }
25 if (dfn[k]==low[k]){
26 vis[k]=++vis[0];
27 while (s[s[0]]!=k)vis[s[s[0]--]]=vis[0];
28 s[0]--;
29 }
30 }
31 int main(){
32 scanf("%d%d%d%d",&m1,&n,&m,&m2);
33 memset(head,-1,sizeof(head));
34 for(int i=1;i<=m1;i++){
35 scanf("%d%d",&x,&y);
36 add(2*x-1,2*y);
37 add(2*y-1,2*x);
38 }
39 for(int i=1;i<=n;i++){
40 scanf("%d%d",&x,&y);
41 add(2*i,2*n+2*x);
42 add(2*n+2*x-1,2*i-1);
43 if (y<m){
44 add(2*i,2*n+2*y+1);
45 add(2*n+2*y+2,2*i-1);
46 }
47 }
48 for(int i=1;i<=m2;i++){
49 scanf("%d%d",&x,&y);
50 add(2*x,2*y-1);
51 add(2*y,2*x-1);
52 }
53 for(int i=1;i<m;i++){
54 add(2*n+2*i+2,2*n+2*i);
55 add(2*n+2*i-1,2*n+2*i+1);
56 }
57 x=0;
58 for(int i=2;i<=2*(n+m);i+=2)
59 if (!dfn[i])dfs(i);
60 for(int i=1;i<=2*(n+m);i+=2)
61 if (!dfn[i])dfs(i);
62 for(int i=1;i<=n+m;i++)
63 if (vis[2*i-1]==vis[2*i]){
64 printf("-1");
65 return 0;
66 }
67 for(int i=1;i<=n;i++)ans+=(vis[2*i]<vis[2*i-1]);
68 for(int i=m;i;i--)
69 if (vis[2*n+2*i]<vis[2*n+2*i-1]){
70 printf("%d %d\n",ans,i);
71 for(int j=1;j<=n;j++)
72 if (vis[2*j]<vis[2*j-1])printf("%d ",j);
73 return 0;
74 }
75 }
[cf1215F]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 ...
- 【CF1215F】 Radio Stations
题目 比较精妙的\(\text{2-sat}\)建图了 还是按照套路把每个电台拆成\((0/1,i)\)表示不选/选 前两种连边是板子就不解释了 考虑如何限制选择一个唯一的\(f\),并且还能限制不选 ...
- 【题解】Radio stations Codeforces 762E CDQ分治
虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ ...
- CF762E Radio Stations
题目戳这里. 我还以为是KDtree呢,但是KDtree应该也可以做吧. 这是一道数据结构好题.考虑到由于\(K \le 10\),所以我们用两个大vector--\(Left,Right\),\(L ...
- 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 1215F. Radio Stations
传送门 题目看一半:"woc 裸的 $2-sat$ 白给??" 看完以后:"...???" 如果没有 $f$ 的限制,那就是个白给的 $2-sat$ 问题,但是 ...
- 2-SAT习题讲解
2-SAT习题讲解 讲在前面:下述例题不是按照难度顺序的,而且基本就只会讲解建图的过程.下面讲解中$A'$为$A$的反向状态. 一.bzoj习题 例一:$bzoj2199 奶牛议会$ 首先我们考虑本题 ...
- Hijacking FM Radio with a Raspberry Pi & Wire
转载:https://null-byte.wonderhowto.com/how-to/hack-radio-frequencies-hijacking-fm-radio-with-raspberry ...
- 【英语魔法俱乐部——读书笔记】 2 中级句型-复句&合句(Complex Sentences、Compound Sentences)
[英语魔法俱乐部——读书笔记] 2 中级句型-复句&合句(Complex Sentences.Compound Sentences):(2.1)名词从句.(2.2)副词从句.(2.3)关系从句 ...
随机推荐
- Java秘诀!零基础怎样快速学习Java?
对于零基础想学Java的朋友,其实一开始最应该做的就是定好学习目标和端正学习态度,切记不要三天打鱼两天晒网! 首先你是零基础,现在急需把Java学好,在保证学习质量的同时,用最短的时间学好Java应该 ...
- Sentinel-Go 源码系列(一)|开篇
大家好呀,打算写一个 Go 语言组件源码分析系列,一是为了能学习下 Go 语言,看下别人是怎么写 Go 的,二是也掌握一个组件. 本次选择了 Sentinel-Go,一是对 Java 版本的 Sent ...
- 内网渗透DC-2靶场通关(CTF)
为了更好的阅读体验,请在pc端打开我的个人博客 DC系列共9个靶场,本次来试玩一下DC-2,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware ...
- ORA-19815: WARNING: db_recovery_file_dest_size闪回区爆满问题处理
问题描述:有一个数据库起不来了,根据层层排查,是因为归档设置在了闪回区,文件的大小已经超出了闪回区限制.最后直接给数据库拖挂 环境:windows server2012 , oracle 19c,单机 ...
- Linux线程互斥学习笔记--详细分析
一.互斥锁 为啥要有互斥? 多个进程/线程执行的先后顺序不确定,何时切出CPU也不确定. 多个进程/线程访问变量的动作往往不是原子的. 1. 操作步骤 (1)创建锁 // 创建互斥锁mutex pth ...
- 小白自制Linux开发板 九. 修改开机Logo
许久不见啊,今天我们继续来修改我们的系统. 通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢 ...
- JVM:Hotspot虚拟机中的对象
在HotSpot虚拟机中,对象在内存中存储的布局可以被分为3个区域:对象头(Header).实例数据(Instance data)和对齐填充(Padding).对象头包括两部分信息,第一部分存储自身的 ...
- 树莓派-openeuler安装
一.安装准备 1.硬件安装 2.下载openeuler镜像 3.sd卡格式化 sd格式化工具 4.镜像校验 二.镜像烧写 选择树莓派官方烧写工具,耐心等待... 三.网络配置 1.寻找树莓派的ip地址 ...
- Git新建本地分支
作为一名码农,Git的使用就像家常便饭,时时刻刻都要用到. 通常我们在开发或者调试某个功能的时候,一般会从主分支新开一个单独的分支仅供自己使用,当我们开发完成后在提交合并请求给管理员,管理员进行代码审 ...
- pycharm软件安装和破解
pycharm安装 1. 进入pycharm的官网 --- 下载专业版的pycharm 2. 双击下载好的软件,下一步 3. 选择需要安装软件的路径 --- 注意: 尽量不要将软件装在C盘里 4. 默 ...