1. 程式人生 > >NOI2018 DAY1T1 歸程

NOI2018 DAY1T1 歸程

spa ctype getch tor nod sin inf isdigit name

  一個極其傻逼得重構樹,然而我數組開小了

  

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cctype>
using namespace std;
const int N = 4e5 + 10, M = 1e6 + 10, inf = 0x7fffffff;
int v[M], to[M], head[N], pos[M], p;
void build(int a, int b, int c) { v[++ p] = b; to[p] = head[a]; head[a] = p; pos[p] = c; }
void link(int a, int b, int c) { build(a, b, c); build(b, a, c); } int pre[N], far[N], n; int find(int x) { return pre[x] == x ? x : pre[x] = find(pre[x]); } struct point { int d, f; point (int d, int f) : d(d), f(f) {} point () {} bool operator < (const point &a) const {
return f > a.f; } }; priority_queue<point> tp; void dijkstra() { for ( int i = 2; i <= n; ++ i) far[i] = inf; tp.push(point(1, 0)); while( !tp.empty()) { int u = tp.top().d; tp.pop(); for ( int i = head[u]; i; i = to[i]) if( far[v[i]] > far[u] + pos[i]) { far[v[i]]
= far[u] + pos[i]; tp.push(point(v[i], far[v[i]])); } } } int POS[N], T[N][30], cnt; int query(int a, int P) { for ( int i = 20; i >= 0; -- i) if( POS[T[a][i]] > P) a = T[a][i]; return far[a]; } struct node { int u, v, val; node ( int u, int v, int val) : u(u), v(v), val(val) {} node () {} bool operator < (const node &a) const { return val > a.val; } }tc[M]; int lastans, Case, m, q, K, s; inline void G(int &x) { x = 0; char o = getchar(); int f = 1; for ( ; !isdigit(o); o = getchar()) if( o == -) f = -1; for ( ; isdigit(o); o = getchar()) x = (x << 1) + (x << 3) + (o & 15); x *= f; } int TP[30]; int main() { freopen("return1.in", "r", stdin); freopen("return.out", "w", stdout); G(Case); while( Case -- ) { G(n), G(m); for ( int i = 1; i <= n; ++ i) head[i] = 0; for ( int i = 1, a, b, c, d; i <= m; ++ i) G(a), G(b), G(c), G(d), tc[i] = node(a, b, d), link(a, b, c); sort(tc+1, tc+1+m); dijkstra(); for ( int i = 1; i <= n; ++ i) pre[i] = i, POS[i] = inf; cnt = n; for ( int i = 1; i <= m; ++ i) { if( find(tc[i].u) == find(tc[i].v)) continue; int A = find(tc[i].u), B = find(tc[i].v); ++ cnt; POS[cnt] = tc[i].val; far[cnt] = min(far[A], far[B]); T[A][0] = T[B][0] = cnt; pre[cnt] = pre[A] = pre[B] = cnt; } T[cnt][0] = T[cnt][1] = cnt; for ( int i = 1; i <= 20; ++ i) for ( int k = 1; k <= cnt; ++ k) T[k][i] = T[T[k][i-1]][i-1]; G(q); G(K); G(s); cnt = 0; for ( int i = 1, v0, p0; i <= q; ++ i) { G(v0); G(p0); if( K) v0 = (v0 + K * lastans - 1) % n + 1, p0 = (p0 + K * lastans) % (s + 1); lastans = query(v0, p0); int t = lastans; do TP[++ cnt] = t % 10, t /= 10; while( t); for( ; cnt; -- cnt) putchar(0+TP[cnt]); puts(""); } } return 0; }

NOI2018 DAY1T1 歸程