社区讨论
60 pts #6 9 10 13 14 18 19 20 TLE 求条
P11230[CSP-J 2024] 接龙参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3jbwc
- 此快照首次捕获于
- 2025/11/03 20:08 4 个月前
- 此快照最后确认于
- 2025/11/03 20:08 4 个月前
是我的时间复杂度有问题还是常数太大了,有没有什么好的优化方法
CPP#include <bits/stdc++.h>
using namespace std;
typedef int ll;
typedef unsigned long long ull;
const ll MAXN = 2e5 + 5, MAXR = 1e2 + 3;
ll n, K, q;
vector <ll> word[MAXN];
vector <ll> vis[2][MAXN];
vector <pair <ll, ll>> queries[MAXR];
bool ans[MAXN];char *p1,*p2,buf[100000];
ll mod;
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
int x=0,f=1;
char ch=nc();
while(ch<48||ch>57)
{
if(ch=='-')
f=-1;
ch=nc();
}
while(ch>=48&&ch<=57)
x=x*10+ch-48,ch=nc();
return x*f;
}
void updans(ll x) {
for(pair <ll, ll> it:queries[x]) {
ans[it.second] = (vis[(x + 1) % 2][it.first].size() > 0);
}
queries[x].clear();
return ;
}
void work() {
n = read();
K = read();
q = read();
for(int i = 1; i <= n; ++i) {
word[i].clear();
ll wil;
wil = read();
while(wil--) {
ll x;
x = read();
word[i].emplace_back(x);
}
}
ll zdr = 0;
for(int i = 1; i <= q; ++i) {
ll r, c;
r = read();
c = read();
zdr = max(zdr, r);
queries[r].push_back({c, i});
}
vis[1][1].emplace_back(0);
for(int i = 0; i <= zdr; ++i) {
mod = i % 2;
// if(vis[(i + 1) % 2][99485].size())
// cout << i << " : " << vis[(i + 1) % 2][164903].size() << endl;
// for(int j = 1; j <= 7; j++)
// cout << vis[(i + 1) % 2][j].size() << " ";
// cout << endl;
updans(i);
for(int j = 1; j <= n; ++j) {
ll sum = 0;
for(int k = 1; k < word[j].size(); ++k) {
if(k > 0) {
if(vis[mod ^ 1][word[j][k - 1]].size() > 1)
sum++;
else if(vis[mod ^ 1][word[j][k - 1]].size() == 1)
sum += vis[mod ^ 1][word[j][k - 1]][0] != j;
}
if(k >= K){
if(vis[mod ^ 1][word[j][k - K]].size() > 1)
sum--;
else if(vis[mod ^ 1][word[j][k - K]].size() == 1)
sum -= vis[mod ^ 1][word[j][k - K]][0] != j;
}
// cout << k << " : " << sum << " " << word[j][k - 1] << "\n";
if(sum > 0 && (vis[mod][word[j][k]].size() == 0 || vis[mod][word[j][k]][vis[mod][word[j][k]].size() - 1] != j))
vis[mod][word[j][k]].emplace_back(j);
}
}
for(int j = 1; j <= n; ++j)
for(int k = 0; k < word[j].size(); ++k)
vis[mod ^ 1][word[j][k]].clear();
}
for(int j = 1; j <= n; ++j)
for(int k = 0; k < word[j].size(); ++k)
vis[zdr % 2][word[j][k]].clear();
for(int i = 1; i <= q; ++i)
if(ans[i])
puts("1");
else
puts("0");
return ;
}
int main() {
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
ll t;
cin >> t;
while(t--)
work();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...