The 2019 China Collegiate Programming Contest Harbin Site
感觉这场好简单,去年场上做的CCPC都好难,嘤嘤嘤
这场的题目都挺卡的。
L. LRU Algorithm
只能说这个时间非常的卡。
写了哈希和散列表T掉了,然后改成暴力for询问判断,这下时间正常了,然后一直wa。最后发现询问全\(0\)的时候也要输出\(\text{Yes}\),是不是有一点点坑。
哈希需要注意:
-
哈希是将字符串看成\(n\)进制数,选取的\(base\)必须\(\geq\)字符集大小。
-
散列表这东西就是看上去很快,真正卡常的时候是不是应该看作一个\(\log\)。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair <int, int> pin;
typedef pair <ll, ll> pll;
#ifndef ONLINE_JUDGE
bool MEMORY_ST;
#endif
const int N = 5005;
int T, n, qn, a[N], s[N], hq1[N], hq2[N], pos[N];
bool ans[N];
vector <int> q[N];
inline void inc(int &x, int y, int P) {
if (!(y >= 0 && y < P)) y = (y % P + P) % P;
x += y;
if (x >= P) x -= P;
}
namespace HashTable {
int b1 = 8209, b2 = 7307, P1 = 999749, P2 = 10001659;
}
using HashTable::b1;
using HashTable::b2;
using HashTable::P1;
using HashTable::P2;
namespace Fread {
const int L = 1 << 15;
char buffer[L], *S, *T;
inline char Getchar() {
if(S == T) {
T = (S = buffer) + fread(buffer, 1, L, stdin);
if(S == T) return EOF;
}
return *S++;
}
template <class T>
inline void read(T &X) {
char ch; T op = 1;
for(ch = Getchar(); ch > '9' || ch < '0'; ch = Getchar())
if(ch == '-') op = -1;
for(X = 0; ch >= '0' && ch <= '9'; ch = Getchar())
X = (X << 1) + (X << 3) + ch - '0';
X *= op;
}
} using Fread::read;
#ifndef ONLINE_JUDGE
bool MEMORY_ED;
#endif
int main() {
#ifndef ONLINE_JUDGE
freopen("sample.in", "r", stdin);
freopen("test.out", "w", stdout);
clock_t st_clock = clock();
#endif
read(T);
for (; T--; ) {
read(n), read(qn);
for (int i = 1; i <= n; i++) {
read(a[i]);
s[i] = pos[i] = 0;
}
for (int i = 1; i <= qn; i++) ans[i] = 0;
for (int m, i = 1; i <= qn; i++) {
read(m);
int cur1 = 0, cur2 = 0;
for (int ix, j = 1; j <= m; j++) {
read(ix);
cur1 = 1LL * cur1 * b1 % P1;
inc(cur1, ix, P1);
cur2 = 1LL * cur2 * b2 % P2;
inc(cur2, ix, P2);
}
q[m].emplace_back(i);
hq1[i] = cur1, hq2[i] = cur2;
if (cur1 == 0 && cur2 == 0) ans[i] = 1;
}
for (int i = 1; i <= n; i++) {
int p = pos[a[i]];
if (!p) {
for (int j = n - 1; j >= 1; j--) s[j + 1] = s[j];
} else {
for (int j = p - 1; j >= 1; j--) s[j + 1] = s[j];
}
s[1] = a[i];
int cur1 = 0, cur2 = 0;
for (int j = 1; j <= n; j++) {
if (s[j] != 0) pos[s[j]] = j;
cur1 = 1LL * cur1 * b1 % P1;
inc(cur1, s[j], P1);
cur2 = 1LL * cur2 * b2 % P2;
inc(cur2, s[j], P2);
for (int k = 0; k < q[j].size(); k++) {
int id = q[j][k];
if (hq1[id] == cur1 && hq2[id] == cur2) {
ans[id] = 1;
}
}
}
// for (int j = 1; j <= n; j++)
// printf("%d%c", s[j], " \n"[j == n]);
}
for (int i = 1; i <= qn; i++) puts(ans[i] ? "Yes" : "No");
for (int i = 1; i <= n; i++) q[i].clear();
}
#ifndef ONLINE_JUDGE
clock_t ed_clock = clock();
printf("time = %f ms\n", (double)(ed_clock - st_clock) / CLOCKS_PER_SEC * 1000);
printf("memory = %.2f MB\n", (&MEMORY_ED - &MEMORY_ST) / 1024.0 / 1024.0);
#endif
return 0;
}