正解 TLE 60分求助
查看原帖
正解 TLE 60分求助
482452
Bamboo_Day楼主2023/7/17 16:18

TLE on #6 #13 #14 #17 #18 #19 #20

对着题解第一篇打的

#include <bits/stdc++.h>
const int N = 1e6+10;
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
inline void write(int x){
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int n, m;
int h1[N], ne1[N], node1[N],val1[N];
int idx1 = 0;
void add1(int u, int v, int w){
    node1[++idx1] = v;
    val1[idx1] = w;
    ne1[idx1] = h1[u];
    h1[u] = idx1;
}
int h2[N*2], ne2[N], node2[N];
int idx2 = 0;
void add2(int u, int v){
    node2[++idx2] = v;
    ne2[idx2] = h2[u];
    h2[u] = idx2;
}

struct Node{
    int ans,h;
}node[N*2];
struct edge{
    int u,v,h;
}e[N];
bool cmp(edge x, edge y){
    return x.h > y.h;
}

int dis[N];
bool vis[N];
void dij(){
    fill(dis,dis+n+1,1e9);
    fill(vis,vis+1+n,0);
    dis[1] = 0;
    priority_queue<pair<int,int> > q;
    q.push(make_pair(-dis[1],1));
    while(!q.empty()){
        int t = q.top().second;
        q.pop();
        if(vis[t]) continue;
        vis[t] = 1;
        for(int i = h1[t]; i; i = ne1[i]){
            int v = node1[i];
            if(dis[v] > dis[t]+val1[i]){
                dis[v] = dis[t] + val1[i];
                q.push(make_pair(-dis[v],v));
            }
        }
    }
    for(int i =1 ;i <= n; i++){
        node[i].ans = dis[i];
    }
}

int fa[N*2];
int get(int x){
    return fa[x] == x ? x : get(fa[x]);
}
int kruskal(){
    int cnt = n,tot = 0;
    for(int i =1; i <= n*2; i++) fa[i] = i;
    sort(e+1,e+1+m, cmp);
    for(int i =1 ; i <= m; i++){
        int u = e[i].u, v = e[i].v, h = e[i].h;
        int fu = get(u),fv = get(v);
        if(fu != fv){
            fa[fu] = fa[fv] = ++cnt;
            node[cnt].h = h;
            add2(cnt,fu),add2(cnt,fv);
            tot++;
        }
        if(tot == n-1) return cnt;
    }
    return cnt;
    
}

int dep[N*2],f[N*2][25];
void dfs(int pos, int father){
    dep[pos] = dep[father]+1;
    f[pos][0] = father;
    for(int i = 1; i <= 19; i++){
        f[pos][i] = f[f[pos][i-1]][i-1];
    }
    for(int i = h2[pos]; i; i= ne2[i]){
        int to = node2[i];
        dfs(to,pos);
        node[pos].ans = min(node[pos].ans,node[to].ans);
    }
}

void solve(){
    n=read(),m=read();
    fill(h1,h1+n+1,0);
    fill(h2,h2 + n*2+1, 0);
    idx1 = idx2 = 0;
    for(int i = 0; i <= n*2+1; i++) node[i].ans = 1e9;
    memset(f,0,sizeof f);
    memset(e,0,sizeof e);
    for(int i = 1; i <= m; i++){
        int u, v, l, a;
        u=read(), v=read(), l=read() , a=read();
        add1(u,v,l);
        add1(v,u,l);
        e[i].u = u,e[i].v = v,e[i].h = a;
    }
    dij();
    int cnt = kruskal();
    dfs(cnt,0);
    int q, k, s;
    int lastans = 0;
    q=read() ,k =read(), s = read();
    while(q--){
        int v0,p0;
        v0 =read(), p0 = read();
        int st = (v0+k*lastans-1)%n+1,p = (p0+k*lastans)%(s+1);
        for(int i = 19; i >=0 ; i--){
            if(dep[st] - (1 << i) > 0 && node[f[st][i]].h > p) st = f[st][i];
        }
        write(lastans = node[st].ans);
        puts("");
    }
}
int main(){
    int t;
    t = read();
    while(t--) solve();
    return 0;
}
2023/7/17 16:18
加载中...