社区讨论
求助速度问题
学术版参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mhjfceij
- 此快照首次捕获于
- 2025/11/04 01:39 4 个月前
- 此快照最后确认于
- 2025/11/04 01:39 4 个月前
这是array代码 3200ms TLE
CPP#include<bits/stdc++.h>
using namespace std;
int T = 0 , n = 0 , d = 0 , l = 0 , r = 0 , _ = 0;
array<int , 1000100> delta , ans , res;
array<bool , 1000100> vis;
array<vector<int> , 1000100> G;
queue<int> q;
void init()
{
while(!q.empty()) q.pop();
for(int i = 0;i < n;++ i) G[1ll * i * d % n].emplace_back(i);
q.push(0);
while(!q.empty())
{
int x = q.front() , p = 0;
q.pop();
delta[(x - l + 1 + n) % n] = max(delta[(x - l + 1 + n) % n] , r - l + 2);
for(int i = l;i <= r;)
{
int nxt = (x - i + n) % n;
p = delta[nxt];
delta[nxt] = max(delta[nxt] , r - i + 1);
if(vis[nxt]) continue;
res[nxt] = ans[x];
vis[nxt] = true;
for(auto to : G[nxt])
{
if(ans[to] != 1e9) continue;
ans[to] = ans[x] + 1;
q.push(to);
}
i += p;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while(T --)
{
cin >> n >> d >> l >> r >> _;
for(int i = 0;i < n;++ i) vis[i] = false;
for(int i = 1;i < n;++ i) ans[i] = 1e9;
for(int i = 0;i < n;++ i) res[i] = 1e9;
for(int i = 0;i < n;++ i) delta[i] = 1;
init();
while(_ --)
{
int pos = 0;
cin >> pos;
cout << (res[pos] == 1e9 ? -1 : res[pos]) << '\n';
}
for(int i = 0;i < n;++ i) G[i].clear();
}
cout << endl;
return 0;
}
这是数组 13.2ms 通过
CPP#include<bits/stdc++.h>
using namespace std;
int T = 0 , n = 0 , d = 0 , l = 0 , r = 0 , _ = 0 , cnt = 0;
int delta[1000100] , ans[1000100] , res[1000100];
bool vis[1000100];
struct Node{
int to;
int nxt;
}edge[1000100];
int head[1000100] , q[1000100];
int h = 0 , t = -1;
inline void new_line(const int a , const int b)
{
edge[++ cnt].to = b;
edge[cnt].nxt = head[a];
head[a] = cnt;
return;
}
inline void init()
{
h = 0 , t = -1;
for(int i = 0;i < n;++ i) new_line(1ll * i * d % n , i);
q[++ t] = 0;
while(h <= t)
{
int x = q[h ++];
delta[(x - l + 1 + n) % n] = max(delta[(x - l + 1 + n) % n] , r - l + 2);
for(int i = l , p = 0;i <= r;i += p)
{
int nxt = (x - i + n) % n;
p = delta[nxt];
delta[nxt] = max(delta[nxt] , r - i + 1);
if(vis[nxt]) continue;
res[nxt] = ans[x];
vis[nxt] = true;
for(int e = head[nxt];e;e = edge[e].nxt)
{
int to = edge[e].to;
if(ans[to] != 1e9) continue;
ans[to] = ans[x] + 1;
q[++ t] = to;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while(T --)
{
cin >> n >> d >> l >> r >> _;
cnt = 0;
for(int i = 0;i < n;++ i) vis[i] = false , head[i] = 0;
for(int i = 1;i < n;++ i) ans[i] = 1e9;
for(int i = 0;i < n;++ i) res[i] = 1e9;
for(int i = 0;i < n;++ i) delta[i] = 1;
init();
while(_ --)
{
int pos = 0;
cin >> pos;
cout << (res[pos] == 1e9 ? -1 : res[pos]) << '\n';
}
}
cout << endl;
return 0;
}
我知道array慢,竟然慢这么多?!
回复
共 7 条回复,欢迎继续交流。
正在加载回复...