「JOISC 2020 Day2」变态龙之色 题解
注意
同性必定不同色
必有一个同色异性,且不相互不喜欢
Solution
我们发现,我们问题比较大的就是如何确定性别问题。我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系,这个可以用线段树上二分找到。
设找到的集合为 \(S\),元素为 \(S_0,S_1,...\),那么你可以发现 \(|S|\) 只有两种情况。
- \(|S|=1\)
这种时候说明 \(L_{L_x}=x\),所以 \(S_0\) 就是与 \(x\) 同色的。
- \(|S|=3\)
这个时候 \(S_0,S_1,S_2\) 就是喜欢 \(x\),被 \(x\) 喜欢的,以及与 \(x\) 同色的异性的。找到与 \(x\) 同色的很简单,直接选两个出来,如果 \(Query(p)=1\) 的话就说明剩下哪一个就是 \(x\) 喜欢的异性。
Code
#include "chameleon.h"
#include<bits/stdc++.h>
using namespace std;
#define Int register int
#define MAXN 1005
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &x,T y){x = max (x,y);}
template <typename T> inline void chkmin (T &x,T y){x = min (x,y);}
vector <int> G[MAXN];
bool b[MAXN],used[MAXN];
int n,t[2][MAXN],col[MAXN],lov[MAXN],siz[2];
void dfs (int x,int c){
col[x] = c;
for (Int to : G[x]) if (col[to] == -1) dfs (to,c ^ 1);
}
void getcol (int x){
for (Int i = 1;i < x;++ i) col[i] = -1;
for (Int i = 1;i < x;++ i) if (col[i] == -1) dfs (i,0);
siz[0] = siz[1] = 0;
for (Int i = 1;i < x;++ i) t[col[i]][++ siz[col[i]]] = i;
}
bool checkit (int c,int l,int r,int x){
vector <int> S;S.clear (),S.push_back (x);
for (Int i = l;i <= r;++ i) if (!b[t[c][i]]) S.push_back (t[c][i]);
return Query (S) < S.size();
}
int findit (int c,int l,int r,int x){
if (l == r) return t[c][l];
int mid = (l + r) >> 1;
return checkit (c,l,mid,x) ? findit (c,l,mid,x) : findit (c,mid + 1,r,x);
}
void makeit (int Sn){
int n = Sn << 1;
for (Int i = 1;i <= n;++ i){
getcol (i),memset (b,0,sizeof (b));
for (Int c = 0;c < 2;++ c){
while (checkit (c,1,siz[c],i)){
int pos = findit (c,1,siz[c],i);
G[i].push_back (pos),G[pos].push_back (i),b[pos] = 1;
}
}
}
vector <int> S;S.resize (3);
for (Int i = 1;i <= n;++ i){
if (G[i].size() == 1){
if (used[i]) continue;
used[i] = used[G[i][0]] = 1,Answer (i,G[i][0]);
continue;
}
S[0] = i,S[1] = G[i][0],S[2] = G[i][1];
if (Query (S) == 1){
swap (G[i][0],G[i][2]),lov[G[i][0]] = i;
continue;
}
S[2] = G[i][2];
if (Query (S) == 1){
swap (G[i][0],G[i][1]),lov[G[i][0]] = i;
continue;
}
lov[G[i][0]] = i;
}
for (Int i = 1;i <= n;++ i) if (!used[i]){
if (lov[i] == G[i][1]) Answer (i,G[i][2]),used[i] = used[G[i][2]] = 1;
else Answer (i,G[i][1]),used[i] = used[G[i][1]] = 1;
}
}
void Solve (int N){
makeit (N);
}
「JOISC 2020 Day2」变态龙之色 题解的更多相关文章
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]
题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...
- bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直 ...
- LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...
- LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...
- 「JOISC 2020 Day4」首都城市
题目 点这里看题目. 分析 做法比较容易看出来.我们对于每个城市,找出那些 " 如果这个城市在首都内,则必须在首都内的其它城市 " ,也就是为了让这个城市的小镇连通而必须选 ...
- 「JOISC 2020 Day1」汉堡肉
我终于学会打开机房的LOJ了! description LOJ3272 有\(n(n<=2*10^5)\)个矩形,让你找\(k(k<=4)\)个点可以覆盖所有矩形(点可重复),输出一种方案 ...
- 「JOISC 2019 Day3」穿越时空 Bitaro
「JOISC 2019 Day3」穿越时空 Bitaro 题解: 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. 问题变成二维平面上 ...
随机推荐
- Python语法之选择和循环(if、while)
前言:在程序开发中,一共有三种流程方式: 顺序:从上向下,顺序执行代码 分支:根据条件判断,决定执行代码的分支 循环:让特定代码重复执行(解决程序员重复工作) 1.判断的定义: 如果条件满足,才能做某 ...
- android activity pass data to accessibilityservice 数据传递
不同类型的 service 传递数据的方式不同,accessibilityservice 运行在独立进程,且被系统接管,比较特别 在 AccessibilityService 的 onCreate 内 ...
- volatile的基本原理
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
- 如何在RHEL7或CentOS 7系统下修改网卡名称(亲测有效~!)
亲测有效的更改RHEL7或CentOS 7的网卡名称的方法, 按照以下4步来操作就可以实现! Step 1 :网卡配置文件名称重命名为eth0[root@localhost ~]# ifconfige ...
- Python常见问题 - python3 requests库提示警告InsecureRequestWarning的问题
当使用 requests 库发送请求时报了以下警告 D:\python3.6\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequ ...
- AI:用软件逻辑做硬件爆款
"我们的野心不止那么一点点." 百度集团副总裁.百度智能生活事业群组(SLG)总经理.小度CEO景鲲曾多次对外表达过这样的观点. 在2021年百度世界大会上,小度又一口气发布了四款 ...
- Kubernetes-Pod介绍(二)-生命周期
前言 本篇是Kubernetes第五篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...
- Java中short和int的转换
例子[1]: 第一种情况: short a = 1; a = a + 1; // 这一步会报错 System.out.print(a); 编译器会报错,原因如下: 第二种情况: short a = 1 ...
- ecshop商品自定义销量(虚拟销量)实现方法
1.在sq执行语句 ALTER TABLE `ecs_goods` ADD `sales_volume_base` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0' ...
- Linux系列(29) - rpm包命名规则(1)
RPM包命名规则 例如包名:httpd-2.2.15-15.el6.centsos.1.i686.rpm 软件包名-httpd 软件版本-2.2.15 发布的次数-15 el6.centos适合的Li ...