QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#142635 | #3996. Race | chenxinyang2006 | WA | 1ms | 5736kb | C++14 | 2.3kb | 2023-08-19 15:38:38 | 2023-08-19 15:38:40 |
Judging History
answer
#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
//#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;
template <class T>
void chkmax(T &x,T y){
if(x < y) x = y;
}
template <class T>
void chkmin(T &x,T y){
if(x > y) x = y;
}
inline int popcnt(int x){
return __builtin_popcount(x);
}
inline int ctz(int x){
return __builtin_ctz(x);
}
/*ll power(ll p,int k = mod - 2){
ll ans = 1;
while(k){
if(k % 2 == 1) ans = ans * p % mod;
p = p * p % mod;
k /= 2;
}
return ans;
}*/
int n,m,k,q;
int cnt;
int head[200005];
struct eg{
int to,w,nxt;
}edge[400005];
void make(int u,int v,int w){
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
int ww[200005][32];
void insert(int id,int val){
per(i,k - 1,0){
if(((val >> i) & 1) == 0) continue;
if(!ww[id][i]){
ww[id][i] = val;
return;
}
val ^= ww[id][i];
}
}
int qry(int id,int val){
per(i,k - 1,0) chkmin(val,val ^ ww[id][i]);
return val;
}
int vis[200005],dep[200005];
void dfs(int u,int I,int c){
vis[u] = c;
for(int i = head[u];i;i = edge[i].nxt){
int v = edge[i].to;
if(i == (I ^ 1)) continue;
if(!vis[v]){
dep[v] = dep[u] ^ edge[i].w;
// printf("%d -> %d %d\n",u,v,dep[v]);
dfs(v,i,c);
}else{
// printf("simple cir %d\n",dep[u] ^ dep[v] ^ edge[i].w);
insert(c,dep[u] ^ dep[v] ^ edge[i].w);
}
}
}
int main(){
// freopen("test.in","r",stdin);
scanf("%d%d%d%d",&n,&m,&k,&q);
rep(i,1,m){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w == k) w = (1 << (k - 1)) - 1;
else w = (1 << (w - 1));
make(u,v,w);make(v,u,w);
}
rep(u,1,n){
if(vis[u]) continue;
dfs(u,0,u);
}
rep(i,1,q){
int u,v;
scanf("%d%d",&u,&v);
if(vis[u] != vis[v]){
printf("No\n");
continue;
}
if(!qry(vis[u],dep[u] ^ dep[v])) printf("Yes\n");
else printf("No\n");
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5712kb
input:
7 9 3 4 1 2 1 2 3 1 3 1 2 1 4 3 5 6 2 6 7 1 6 7 3 7 7 2 5 5 1 6 7 1 4 2 4 2 5
output:
Yes No Yes No
result:
ok 4 token(s): yes count is 2, no count is 2
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 5736kb
input:
9 10 3 5 7 2 2 4 2 1 7 1 1 2 8 1 1 7 2 2 7 3 2 8 1 7 2 1 7 5 1 8 1 2 6 4 6 7 8 4 5 1 8 6
output:
No No Yes No No
result:
wrong answer expected YES, found NO [4th token]