比赛 2024暑期C班集训3 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 不是一道路径查询问题 最终得分 100
用户昵称 darkMoon 运行时间 2.835 s
代码语言 C++ 内存使用 12.98 MiB
提交时间 2024-07-03 10:44:12
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define fi first
  4. #define se second
  5. #define mp make_pair
  6. using namespace std;
  7. ifstream fin("Paths.in");
  8. ofstream fout("Paths.out");
  9. auto mread = [](){
  10. int x;
  11. fin >> x;
  12. return x;
  13. };
  14. const int N = 5e5 + 5;
  15. int n = mread(), m = mread(), q = mread(), v = mread();
  16. struct node{
  17. int u, v, w;
  18. }s[N];
  19. struct Node{
  20. int u, v, ans;
  21. }a[N];
  22. int fa[N];
  23. int findfa(int x){
  24. if(fa[x] == x)
  25. return x;
  26. return fa[x] = findfa(fa[x]);
  27. }
  28. void add(int x, int y){
  29. int a = findfa(x), b = findfa(y);
  30. if(a != b){
  31. fa[a] = b;
  32. }
  33. return;
  34. }
  35. void check(int x){
  36. // cout << (bitset<62>)x << "\n";
  37. for(int i = 1; i <= n; i ++)
  38. fa[i] = i;
  39. for(int i = 1; i <= m; i ++){
  40. if((s[i].w | x) == s[i].w){
  41. add(s[i].u, s[i].v);
  42. }
  43. }
  44. for(int i = 1; i <= q; i ++){
  45. if(findfa(a[i].u) == findfa(a[i].v)){
  46. a[i].ans = 1;
  47. }
  48. }
  49. }
  50. signed main(){
  51. for(int i = 1; i <= m; i ++){
  52. s[i].u = mread();
  53. s[i].v = mread();
  54. s[i].w = mread();
  55. }
  56. for(int i = 1; i <= q; i ++){
  57. a[i].u = mread(), a[i].v = mread();
  58. }
  59. for(int i = 0; i <= 61; i ++){
  60. if((v >> i) & 1){
  61. check(v);
  62. }
  63. else{
  64. int x = v;
  65. x |= (1ll << i);
  66. x &= ~((1ll << i) - 1);
  67. check(x);
  68. }
  69. }
  70. for(int i = 1; i <= q; i ++){
  71. if(a[i].ans){
  72. fout << "Yes\n";
  73. }
  74. else{
  75. fout << "No\n";
  76. }
  77. }
  78. }