Why TLE?
查看原帖
Why TLE?
527212
邓不利多_henry楼主2024/8/6 15:19
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const ll N = 2e5+5;
ll n,m;
struct edge{
	ll v,l,a;
};
vector<edge> G[N];

//dij
ll dis[N],vis[N];
void dij(){
	priority_queue<P> q;
	memset(dis,0x3f3f3f3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	q.push(make_pair(0,1));
	dis[1] = 0;
	while(q.size()){
		ll x = q.top().second;q.pop();
		if(vis[x])continue;
		vis[x] ++;
		for(int i = 0;i < G[x].size();i ++){
			ll y = G[x][i].v;
			if(vis[y])continue;
			if(dis[y] > dis[x] + G[x][i].l){
				dis[y] = dis[x] + G[x][i].l;
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}
//Krus
ll f[N*4];
ll find(ll x){
	return x == f[x]?x:f[x] = find(f[x]);
}
struct E{
	ll u,v,a;
}e[N*4];
bool cmp(E x,E y){
	return x.a > y.a;
}
ll W[N*4],cnt;
ll ans[N*4][30],son[N*4][2];
ll father[N*4][30];
void krus(){
	memset(W,0x3f3f,sizeof(W));
	W[0] = 0;
	sort(e+1,e+1+m,cmp);
	cnt = n;
	for(int i = 1;i <= m;i ++){
		ll u = find(e[i].u),v = find(e[i].v);
		if(u != v){
			f[u] = f[v] = ++cnt;
			W[cnt] = e[i].a;
			f[cnt] = cnt;
			father[u][0] = father[v][0] = cnt;
			son[cnt][0] = u,son[cnt][1] = v;
///			printf("The Father of %lld and %lld is %lld\n",u,v,cnt);
		}
	}
}
//endKrus
ll maxbit = 0;
ll query(ll v,ll p){
	for(maxbit = 0;(1<<maxbit) <= cnt;maxbit ++);maxbit--;
//	cout<<"mxbit = "<<maxbit<<endl;
	for(int i = maxbit;i >= 0;i --){
		if(W[father[v][i]] > p){
//			cout<<i<<" "<<W[father[v][i]]<<" "<<father[v][i]<<" p = "<<p<<" ans = "<<ans[v][i]<<endl;
			v = father[v][i];
		}
	}
//	cout<<"v = "<<v<<endl;
	return ans[v][0];
}
ll solve(){
	scanf("%lld%lld",&n,&m);
	for(int i = 1;i <= n;i ++){
		f[i] = i;
		G[i].clear();
	}
	for(int i = 1;i <= m;i ++){
		ll u,v,l,a;
		scanf("%lld%lld%lld%lld",&u,&v,&l,&a);
		G[u].push_back(edge{v,l,a});
		G[v].push_back(edge{u,l,a});
		e[i] = E{u,v,a};
	}
//	cout<<"YES\n";
	dij();
	krus();
	for(int i = 1;i <= n;i ++){
		ans[i][0] = dis[i];
//		cout<<ans[i][0]<<" ";
	}
	for(int i = n+1;i <= cnt;i ++){
		ans[i][0] = min(ans[son[i][0]][0],ans[son[i][1]][0]);
//		cout<<ans[i][0]<<" ";
	}//cout<<endl;
	for(int i = 1;i <= cnt;i ++){
		for(int j = 1;(1<<j) <= cnt;j ++){
			father[i][j] = father[father[i][j-1]][j-1];
			ans[i][j] = min(ans[father[i][j-1]][j-1],ans[i][j-1]);
		}
	}
	ll Q,K,S;
	scanf("%lld%lld%lld",&Q,&K,&S);
	ll lastans = 0;
	while(Q--){
		ll v0,p0,v,p;
		scanf("%lld%lld",&v0,&p0);
		v = (v0 + K*lastans - 1)%(n)+1;
		p = (p0 + K*lastans)%(S+1);
		lastans = query(v,p);
		printf("%lld\n",lastans);
	}
}
int main(){
	ll T;
	scanf("%lld",&T);
	while(T--){
		solve();
	}
}

就是这份代码,第一个点都TLE,本地测试没问题,一上传就TLE

已测试过关掉O2,切到C++98,C++17等

2024/8/6 15:19
加载中...