# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1124197 | jitic22514 | 늑대인간 (IOI18_werewolf) | C++17 | 0 ms | 0 KiB |
#include "werewolf.h"
#include<bits/stdc++.h>
#define ll long long
#define pir pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn = 2e5 + 5;
template <class t1,class t2> inline void mini(t1 &x,t2 y){if (x > y) x = y;}
template <class t1,class t2> inline void maxi(t1 &x,t2 y){if (x < y) x = y;}
template <class t1> inline void print_(vector <t1> v){
for (t1 x : v) cout << x << " ";cout << "\n";
}
struct query{
int u,v,l,r,id;
};
vector <int> vec[maxn];
query Q[maxn];
namespace subtask1{
bool subtask1(int n,int q){
return (n <= 100 && q <= 100);
}
struct dsu{
int par[maxn];
void init(int n){
for (int i = 1 ; i <= n ; i++) par[i] = i;
}
int findp(int x){
return (x == par[x]) ? x : par[x] = findp(par[x]);
}
void add(int u,int v){
par[findp(u)] = findp(v);
}
bool is_connected(int u,int v){
return findp(u) == findp(v);
}
} dsu;
bool mark[maxn];
int solve(int n,int source,int sink,int l,int r){
dsu.init(n);
bool kt = 0;
for (int i = l ; i <= r ; i++) mark[i] = 0;
//for source
for (int u = l ; u < n ; u++)
for (int v : vec[u])
if (v >= l)
dsu.add(u,v);
for (int i = l ; i <= r ; i++)
mark[i] = dsu.is_connected(source,i);
dsu.init(n);
for (int u = r ; u >= 0 ; u--)
for (int v : vec[u])
if (v <= r)
dsu.add(u,v);
for (int i = l ; i <= r ; i++)
kt |= (mark[i] && dsu.is_connected(sink,i));
return kt;
}
vector <int> solve(int n,int q){
vector <int> res;
for (int i = 1 ; i <= q ; i++)
res.push_back(solve(n,Q[i].u,Q[i].v,Q[i].l,Q[i].r));
return res;
}
}
void get_input(int n,vector <int> X,vector <int> Y,
vector <int> S,vector <int> E,vector <int> L,
vector <int> R){
for (int i = 0 ; i < X.size() ; i++){
int u = X[i],v = Y[i];
vec[u].push_back(v);
vec[v].push_back(u);
}
for (int i = 0 ; i < S.size() ; i++)
Q[i] = {S[i],E[i],L[i],R[i]};
}
vector <int> check_validity(int n,vector <int> X,vector <int> Y,
vector <int> S,vector <int> E,vector <int> L,
vector <int> R){
get_input(n,X,Y,S,E,L,R);
int q = S.size();
// if (subtask1::subtask1(n,q))
return subtask1::solve(n,q);
}
void input(int n,int m,int q){
while (m--){
int u,v;
cin >> u >> v;
vec[u].push_back(v);
vec[v].push_back(u);
}
for (int i = 1 ; i <= q ; i++){
int u,v,l,r;
cin >> u >> v >> l >> r;
Q[i] = {u,v,l,r};
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m,q;
/* cin >> n >> m >> q;
input(n,m,q);
if (subtask1::subtask1(n,q)){
vector <int> r = subtask1::solve(n,q);
print_(r);
}*/
return 0;
}