結果
| 問題 |
No.2319 Friends+
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-25 16:41:10 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,088 bytes |
| コンパイル時間 | 2,460 ms |
| コンパイル使用メモリ | 192,792 KB |
| 実行使用メモリ | 13,888 KB |
| 最終ジャッジ日時 | 2024-09-27 14:29:08 |
| 合計ジャッジ時間 | 8,574 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | TLE * 1 -- * 44 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define ar array
#define ll long long
typedef int uci;
#define int long long
#define F first
#define S second
typedef complex<double> cd;
seed_seq seq{
(uint64_t) chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now().time_since_epoch()).count(),
(uint64_t) __builtin_ia32_rdtsc(),
(uint64_t) (uintptr_t) make_unique<char>().get()
};
mt19937 rng(seq);
// mt19937_64 lrng(seq);
struct debugger{
template <typename T>
debugger& operator<<(T &a){
#ifdef DEBUG
cerr << a;
#endif
return *this;
}
template <typename T>
debugger& operator<<(T &&a){
#ifdef DEBUG
cerr << a;
#endif
return *this;
}
} deb;
const double PI = acos(-1.0);
const int MAX_N = 1e5 + 1;
const int MOD = 1e9 + 7;
const int INF = 1e9;
const ll LINF = 1e18;
//! function insert
//THINK FIRST, CODE SECOND
//DON'T GET STUCK ON ONE STRATEGY
//CALM DOWNNN FOR ONCE IN YOUR LIFE
//REDUCE
//COUGH E??!?!?!! O.O
//uwu i see you ryan
void solve() {
int n, m;
cin >> n >> m;
vector<unordered_set<int>> a(n);
vector<ar<int, 2>> edges(m);
vector<int> curr(n);
for(int i{}; i < n; ++i)
cin >> curr[i];
for(int i{}; i < m; ++i){
cin >> edges[i][0] >> edges[i][1];
edges[i][0]--, edges[i][1]--;
a[edges[i][0]].insert(edges[i][1]);
a[edges[i][1]].insert(edges[i][0]);
}
int q;
cin >> q;
vector<ar<int, 2>> qs(q);
for(int i{}; i < q; ++i){
cin >> qs[i][0] >> qs[i][1];
qs[i][0]--, qs[i][1]--;
}
int sq = sqrt(q);
vector<int> from_room(sq);
vector<int> to_room(sq);
string out(q, '0');
for(int i{}; i < q; i += sq){
int last = min(q, i+sq);
unordered_map<int, int> counts;
for(int j{}; j < m; ++j){
counts[(edges[j][0]<<16)|curr[edges[j][1]]]++;
counts[(edges[j][1]<<16)|curr[edges[j][0]]]++;
}
for(int j = i; j < last; ++j){
int f_room = curr[qs[j][0]];
int t_room = curr[qs[j][1]];
if(f_room == t_room)
continue;
int st = counts[(qs[j][0]<<16)|t_room];
for(int k = i; k < j; ++k){
if(out[k] == '1' && a[qs[j][0]].count(qs[k][0])){
if(from_room[k-i] == t_room)
st--;
else if(to_room[k-i] == t_room)
st++;
}
}
if(st > 0){
out[j] = '1';
from_room[j-i] = f_room;
to_room[j-i] = t_room;
curr[qs[j][0]] = t_room;
}
}
}
for(int i{}; i < q; ++i){
if(out[i] == '0')
cout << "No\n";
else
cout << "Yes\n";
}
}
uci main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
// cout << "Case #" << t << ": ";
solve();
}
/*
random number generator stuff
num = rng(); gives integer number
num = uniform_int_distribution<int>(a, b)(rng); -> bounds [a, b]
num = uniform_real_distribution<double>(a, b)(rng); -> bounds [a, b)
can also instantiate distributions and call on generator:
uniform_int_distribution<int> thing(a, b);
num = thing(rng);
*/
// struct custom_hash {
// static uint64_t splitmix64(uint64_t x) {
// // http://xorshift.di.unimi.it/splitmix64.c
// x += 0x9e3779b97f4a7c15;
// x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
// x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
// return x ^ (x >> 31);
// }
// size_t operator()(uint64_t x) const {
// static const uint64_t FIXED_RANDOM = lrng();
// return splitmix64(x + FIXED_RANDOM);
// }
// };