题目传送门

注意

同性必定不同色

必有一个同色异性,且不相互不喜欢

Solution

我们发现,我们问题比较大的就是如何确定性别问题。我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系,这个可以用线段树上二分找到。

设找到的集合为 \(S\),元素为 \(S_0,S_1,...\),那么你可以发现 \(|S|\) 只有两种情况。

  1. \(|S|=1\)

这种时候说明 \(L_{L_x}=x\),所以 \(S_0\) 就是与 \(x\) 同色的。

  1. \(|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」变态龙之色 题解的更多相关文章

  1. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  2. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  3. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  4. bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直 ...

  5. LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS

    这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...

  6. LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA

    非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...

  7. 「JOISC 2020 Day4」首都城市

    题目   点这里看题目. 分析   做法比较容易看出来.我们对于每个城市,找出那些 " 如果这个城市在首都内,则必须在首都内的其它城市 " ,也就是为了让这个城市的小镇连通而必须选 ...

  8. 「JOISC 2020 Day1」汉堡肉

    我终于学会打开机房的LOJ了! description LOJ3272 有\(n(n<=2*10^5)\)个矩形,让你找\(k(k<=4)\)个点可以覆盖所有矩形(点可重复),输出一种方案 ...

  9. 「JOISC 2019 Day3」穿越时空 Bitaro

    「JOISC 2019 Day3」穿越时空 Bitaro 题解: ​ 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. ​ 问题变成二维平面上 ...

随机推荐

  1. OVN入门

    参考链接 如何借助 OVN 来提高 OVS 在云计算环境中的性能 OVN简介 Open vSwitch Documentation OVSDB介绍及在OpenDaylight中的调用 OpenDayl ...

  2. 一. Go微服务--隔离设计

    1. 前言 隔离设计源于船舶行业,一般而言无论大船还是小船,都会有一些隔板,将船分为不同的空间,这样如果有船舱漏水一般只会影响这一小块空间,不至于把整个船都给搞沉了. 同样我们的软件服务也是一个道理, ...

  3. redis 《scan命令》

    此命令十分奇特建议参考文档:http://redisdoc.com/database/scan.html#scan     222222222222222并非每次迭代都要使用相同的 COUNT 值. ...

  4. ES6扩展——数组的新方法(Array.from、Array.of、Array.fill、Array.includes、keys values entries 、find)

    1.Array.from(objec,回调函数)将一个ArrayLike对象或者Iterable对象(类数组对象)转换成一个数组 1)该类数组对象必须具有length属性,用于指定数组的长度.如果没有 ...

  5. 笔记本+ubuntu18.04 关闭触摸板touchpad

    方法1: Settings -> Devices -> Mouse&Touchpad -> Touchpad OFF 方法2: 终端运行如下命令 touchpad off:  ...

  6. iGuard和NFS文件同步的解决方案

    一般来说,从文件系统中获得文件变化信息,调用操作系统提供的 API 即可.Windows 操作系统上有个名为 ReadDirectoryChangesW 的 API 接口,只要监视一个目录路径就可以获 ...

  7. Python之telnetlib模块

    telnetlib是python标准库中的一员,我们可以使用该模块以telnet的方式与服务器交互.请观察下面示例了解它的用法: import telnetlib def run_telnet(hos ...

  8. 洛谷P1083 借教室 题解

    题目 [NOIP2012 提高组] 借教室 题解 这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了.但这道题还运用了差分数组这个思想,所 ...

  9. Linux--MySQL 日志管理、备份与恢复

    MySQL 日志管理.备份与恢复一.MySQL 日志管理二.数据库备份的重要性与分类  1.数据备份的重要性  2.从物理与逻辑的角度,备份分为  3.从数据库的备份策略角度,备份可分为三.常见的备份 ...

  10. MongoDB 常见问题 - 解决 brew services list 查看 MongoDB 服务 status 显示 error 的问题

    问题背景 将 MongoDB 作为服务运行 brew services start mongodb-community@4.4 也显示运行成功了,但是查看服务列表的时候,发现 MongoDB 服务的还 ...