社区讨论

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 条回复,欢迎继续交流。

正在加载回复...