2695: 旅游胜地
题目大意
中文题,大意就剩略了吧。
解题思路
这也题看了以后感觉是二分+2-SAT但是不知道具体的怎么去建图。一直卡着。后来看了大佬的博客后突然明白了,电子竞技菜是原罪呀! 我们对于每一条边,分别判断如果 u 取a数组的值, v 取b数组的值。判断下这差值是否大于 二分枚举的值,如果大于就选择建这个边对于另外的点之间建边。每次建完图以后,判断是否满足2-SAT的情况。这样枚举下去即可。具体的建边可以看代码。
代码
#include<bits/stdc++.h>
using namespace std;
const int mx=200100;
#define ll long long
int u[mx],v[mx];
vector<int> ve[mx];
int dfn[mx],low[mx];
int col[mx];
int sum,cnt,n,m;
int a[mx],b[mx];
bool vis[mx];
stack<int> st;
void tarjon(int x){
dfn[x]=low[x]= cnt++;
st.push(x);
vis[x]=1;
for(int v:ve[x]){
if(!dfn[v]){
tarjon(v);
low[x]=min(