ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#453 | #85. 「NOIP2018」保卫王国 | ryp | 100 | 2911ms | 41624kb | C++14 | 5.5kb | 2025-04-24 13:51:13 | 2025-04-24 13:51:14 |
answer
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <numeric>
#include <limits>
#include <functional>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#define LOG(FMT...) fprintf(stderr, FMT)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct Edge {
int v;
Edge *next;
};
ll ad(ll x, ll y) {
if (~x & ~y)
return x + y;
return -1;
}
bool cmp(ll x, ll y) {
return x != -1 && (x < y || y == -1);
}
struct Mat {
ll gr[2][2];
Mat() { memset(gr, -1, sizeof(gr)); }
Mat(const Mat& rhs) { memcpy(gr, rhs.gr, sizeof(gr)); }
ll* operator[](int k) { return gr[k]; }
const ll* operator[](int k) const { return gr[k]; }
void dbg() const {
for(int i = 0; i < 2; ++i) {
for(int j = 0; j < 2; ++j) {
LOG("%lld ", gr[i][j]);
}
LOG("\n");
}
}
Mat operator*(const Mat& rhs) const {
Mat m = Mat();
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j) {
for (int k = 0; k < 2; ++k)
m[i][j] = min(m[i][j], ad(gr[i][k], rhs.gr[k][j]), cmp);
}
// dbg();
// rhs.dbg();
// m.dbg();
return m;
}
};
const int N = 100010;
int n, m;
char s[5];
bool vis[N];
int p[N], f[N], qa[N], qx[N], qb[N], qy[N], lca[N];
Mat dt[N];
ll ans[N];
ll dp[N][2], tmp[N][2];
Edge* g[N];
vector<pair<int, int> > ql[N];
vector<int> qr[N];
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
int find2(int x) {
if (f[x] == x)
return x;
int prt = f[x];
f[x] = find2(prt);
dt[x] = dt[prt] * dt[x];
return f[x];
}
void adde(int u, int v);
void tarjan(int u);
void dfs(int u);
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
int nol_cl = clock();
#endif
scanf("%d%d%s", &n, &m, s);
for (int i = 1; i <= n; ++i)
scanf("%d", &p[i]);
for (int rep = 1; rep < n; ++rep) {
int u, v;
scanf("%d%d", &u, &v);
adde(u, v);
adde(v, u);
}
for (int i = 1; i <= m; ++i) {
scanf("%d%d%d%d", &qa[i], &qx[i], &qb[i], &qy[i]);
ql[qa[i]].push_back(make_pair(qb[i], i));
ql[qb[i]].push_back(make_pair(qa[i], i));
}
tarjan(1);
for (int i = 1; i <= m; ++i)
qr[lca[i]].push_back(i);
memset(vis, 0, sizeof(vis));
memset(f, 0, sizeof(f));
{
Mat model = Mat();
model[0][0] = model[1][1] = 0;
fill(dt + 1, dt + n + 1, model);
}
dfs(1);
for (int i = 1; i <= m; ++i) {
int lc = lca[i];
find2(lc);
ans[i] = -1;
// LOG("%d: %lld %lld\n", i, tmp[i][0], tmp[i][1]);;
for (int k = 0; k < 2; ++k)
for (int j = 0; j < 2; ++j)
ans[i] = min(ans[i], ad(dt[lc][k][j], tmp[i][j]), cmp);
printf("%lld\n", ans[i]);
}
#ifndef ONLINE_JUDGE
LOG("Time: %dms\n", int((clock() - nol_cl) / (double)CLOCKS_PER_SEC * 1000));
#endif
return 0;
}
void dfs(int u) {
vis[u] = true;
f[u] = u;
dp[u][1] = p[u];
for (Edge* p = g[u]; p; p = p->next)
if (!vis[p->v]) {
dfs(p->v);
dp[u][0] += dp[p->v][1];
dp[u][1] += min(dp[p->v][0], dp[p->v][1]);
}
for (int i = 0; i < qr[u].size(); ++i) {
int id = qr[u][i];
int &a = qa[id], &x = qx[id], &b = qb[id], &y = qy[id];
if (u == b) {
swap(a, b);
swap(x, y);
}
if (u != a) {
find2(a);
find2(b);
for (int k = 0; k < 2; ++k) {
tmp[id][k] = -1;
ll sub = dp[u][k];
if (k == 0)
sub -= dp[f[a]][1] + dp[f[b]][1];
else
sub -= min(dp[f[a]][0], dp[f[a]][1]) + min(dp[f[b]][0], dp[f[b]][1]);
if (k == 0)
tmp[id][0] = ad(dp[a][x] + dp[b][y], ad(sub, ad(dt[a][1][x], dt[b][1][y])));
else
tmp[id][1] = ad(dp[a][x] + dp[b][y] + sub, ad(min(dt[a][1][x], dt[a][0][x], cmp), min(dt[b][1][y], dt[b][0][y], cmp)));
}
}
}
for (Edge* p = g[u]; p; p = p->next)
if (!vis[p->v]) {
f[p->v] = u;
dt[p->v][0][0] = -1;
dt[p->v][0][1] = dp[u][0] - dp[p->v][1];
dt[p->v][1][0] = dt[p->v][1][1] = dp[u][1] - min(dp[p->v][0], dp[p->v][1]);
}
for (int i = 0; i < qr[u].size(); ++i) {
int id = qr[u][i];
int a = qa[id], x = qx[id], b = qb[id], y = qy[id];
if (u == a) {
find2(b);
// LOG("%d(from %d)%d %d\n", f[b], b, f[f[b]], u);
tmp[id][x] = ad(dt[b][x][y], dp[b][y]);
// LOG("%lld\n", dt[b][x][y]);
tmp[id][!x] = -1;
}
}
vis[u] = false;
}
void tarjan(int u) {
static bool vis[N];
vis[u] = true;
f[u] = u;
for (Edge* p = g[u]; p; p = p->next)
if (!vis[p->v]) {
tarjan(p->v);
f[p->v] = u;
}
for (int i = 0; i < ql[u].size(); ++i)
if (f[ql[u][i].first])
lca[ql[u][i].second] = find(ql[u][i].first);
}
void adde(int u, int v) {
static Edge pool[N * 2];
static Edge* p = pool;
p->v = v;
p->next = g[u];
g[u] = p;
++p;
}
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 4
Accepted
time: 1ms
memory: 16776kb
input:
10 10 A3 63506 94509 47931 36299 43399 72971 71326 26897 33860 49557 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9...
output:
302616 260022 264536 264536 260022 260022 280233 260022 308965 260022
result:
ok 10 tokens
Test #2:
score: 4
Accepted
time: 3ms
memory: 17172kb
input:
10 10 A3 76660 70069 93798 89578 65296 77676 39212 94829 27329 87909 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9...
output:
303864 420061 380524 379393 302295 420061 379393 -1 397124 291484
result:
ok 10 tokens
Test #3:
score: 4
Accepted
time: 0ms
memory: 16328kb
input:
10 10 C3 89815 45628 39661 42853 87193 82381 7097 62758 20798 26257 2 1 3 1 4 1 5 4 6 3 7 6 8 6 9 7 ...
output:
224254 218795 231321 280187 218795 238418 292743 292743 292743 231321
result:
ok 10 tokens
Test #4:
score: 4
Accepted
time: 2ms
memory: 17300kb
input:
10 10 C3 2965 21188 85527 96131 9086 87085 74986 30686 14267 64609 2 1 3 1 4 1 5 2 6 3 7 4 8 6 9 6 1...
output:
282126 225953 320617 238662 216910 238731 217517 252998 229619 217517
result:
ok 10 tokens
Test #5:
score: 4
Accepted
time: 5ms
memory: 16492kb
input:
100 100 A3 29274 72311 77257 2681 52879 96494 10756 66547 1205 41308 29018 71254 9864 68500 23973 93...
output:
1968725 2109802 1947500 2030928 1986270 2046906 2008159 2053710 2117956 1947500 1989327 1987134 1958...
result:
ok 100 tokens
Test #6:
score: 4
Accepted
time: 3ms
memory: 16636kb
input:
100 100 A3 42428 47871 23120 55960 74776 1195 78645 34475 94678 79660 80961 54350 13321 73846 76945 ...
output:
2130259 2042004 2218645 2107260 2055793 2059681 2042004 2130259 2113171 2171255 2044635 2071597 2129...
result:
ok 100 tokens
Test #7:
score: 4
Accepted
time: 2ms
memory: 16372kb
input:
100 100 C3 55582 23430 68987 9235 96673 5900 46531 2404 88147 18008 32901 37446 16779 79193 29913 27...
output:
1535240 1579038 1535240 1535240 1535240 1555070 1770122 1582046 1669212 1535240 1535240 1566802 1591...
result:
ok 100 tokens
Test #8:
score: 4
Accepted
time: 6ms
memory: 17136kb
input:
2000 2000 A3 68736 98994 14850 62514 18566 10604 14416 70336 81616 56359 84845 20542 20236 84539 828...
output:
40622025 40653695 40652286 40642946 40680346 40623425 40777137 40636817 40680770 40635434 40630127 4...
result:
ok 2000 tokens
Test #9:
score: 4
Accepted
time: 13ms
memory: 17604kb
input:
2000 2000 A3 81891 74553 60717 15789 40462 15309 82305 38264 75085 94711 36784 3637 23693 89885 3585...
output:
41550791 41489330 41550424 41484187 41566526 41611054 41596221 41484187 41526929 41546693 41506738 4...
result:
ok 2000 tokens
Test #10:
score: 4
Accepted
time: 12ms
memory: 16780kb
input:
2000 2000 C3 95045 50113 6580 69067 62359 20014 50190 6193 68554 33059 88728 86737 27151 95232 88826...
output:
33320143 33361265 33392690 33344461 33388020 33320143 33327872 33328722 33357908 33320143 33320143 3...
result:
ok 2000 tokens
Test #11:
score: 4
Accepted
time: 10ms
memory: 16596kb
input:
2000 2000 C3 8195 25672 52446 22342 84256 24718 18075 74125 62023 71410 40668 69833 30608 574 41794 ...
output:
32949293 32930769 32903180 32958740 32903180 32997858 33004297 32903180 32918433 32981668 32922245 3...
result:
ok 2000 tokens
Test #12:
score: 4
Accepted
time: 159ms
memory: 39828kb
input:
100000 100000 A1 21350 1232 98313 75621 6149 29423 85965 42053 55492 9758 92612 52929 34065 5921 947...
output:
2072566246 2072578780 2072599127 2072566246 2072566246 2072566246 2072571189 2072595651 2072578155 2...
result:
ok 100000 tokens
Test #13:
score: 4
Accepted
time: 171ms
memory: 39884kb
input:
100000 100000 A1 60813 27915 35906 35450 71839 43537 89624 45842 35899 24809 48435 2217 44437 21960 ...
output:
2069385899 2069413015 2069385899 2069385899 2069405728 2069385899 2069385899 2069418021 2069462155 2...
result:
ok 100000 tokens
Test #14:
score: 4
Accepted
time: 212ms
memory: 41412kb
input:
100000 100000 A2 87121 79038 27635 42003 15629 52946 25395 81703 22837 1509 52318 68412 51352 32652 ...
output:
-1 -1 2066343840 -1 2066254007 2066280305 2066271815 2066297969 2066244251 -1 2066244251 -1 20662442...
result:
ok 100000 tokens
Test #15:
score: 4
Accepted
time: 209ms
memory: 41352kb
input:
100000 100000 A2 26580 5717 65232 1832 81319 67060 29054 85492 3244 16560 8141 17700 61724 48692 185...
output:
2066183936 -1 2066098753 2066111054 2066159395 2066128509 2066115845 -1 2066163881 2066158056 206616...
result:
ok 100000 tokens
Test #16:
score: 4
Accepted
time: 205ms
memory: 41624kb
input:
100000 100000 A2 52889 56840 56962 8386 25109 76470 64828 21349 90186 93264 12025 83896 68639 59384 ...
output:
-1 -1 -1 2062035559 2062090967 2062035559 2062129835 -1 2062070659 2062035559 -1 -1 2062070827 20621...
result:
ok 100000 tokens
Test #17:
score: 4
Accepted
time: 276ms
memory: 41556kb
input:
100000 100000 A3 79197 7959 48691 14939 68902 85879 599 57210 77124 69963 15908 50087 75554 70077 30...
output:
2062834862 2062824918 2062818669 2062766000 2062905582 2062809539 2062766000 2062766000 2062771812 2...
result:
ok 100000 tokens
Test #18:
score: 4
Accepted
time: 185ms
memory: 19564kb
input:
100000 100000 B1 18656 34641 86288 74772 34589 99993 4258 60999 57531 85014 71735 99379 85926 86116 ...
output:
1634488457 1634488457 1634506941 1634535767 1634488457 1634488457 1634576087 1634488457 1634555630 1...
result:
ok 100000 tokens
Test #19:
score: 4
Accepted
time: 161ms
memory: 19500kb
input:
100000 100000 B1 44965 85764 78018 81326 78382 9398 40033 96859 44470 61714 75619 65571 92840 96809 ...
output:
1637107548 1637130428 1637107548 1637182618 1637107548 1637107548 1637112035 1637121799 1637107548 1...
result:
ok 100000 tokens
Test #20:
score: 4
Accepted
time: 157ms
memory: 28552kb
input:
100000 100000 C1 84428 12443 15610 41154 44069 23512 43692 645 24877 76765 31442 14858 3208 12844 54...
output:
1679007220 1679025466 1679040750 1679007220 1679150261 1679007220 1679034770 1679036976 1679007220 1...
result:
ok 100000 tokens
Test #21:
score: 4
Accepted
time: 171ms
memory: 28560kb
input:
100000 100000 C1 10732 63566 7340 47708 87862 32921 79467 36505 11815 53465 35325 81054 10123 23537 ...
output:
1680967956 1681035266 1680967956 1680967956 1681003690 1681006189 1680999057 1681048071 1681062564 1...
result:
ok 100000 tokens
Test #22:
score: 4
Accepted
time: 189ms
memory: 30200kb
input:
100000 100000 C2 37041 14685 99073 54262 31652 42331 15237 72366 98757 30164 39209 47246 17038 34230...
output:
1680377801 1680405569 1680424915 1680438043 1680408899 1680377801 1680471138 -1 1680474070 168038863...
result:
ok 100000 tokens
Test #23:
score: 4
Accepted
time: 250ms
memory: 30068kb
input:
100000 100000 C3 76504 41368 36666 14090 97342 56445 18897 76155 79164 45215 95036 96537 27410 50269...
output:
1673790266 1673780949 1673709444 1673729625 1673697220 1673728191 1673776736 1673779088 1673710935 1...
result:
ok 100000 tokens
Test #24:
score: 4
Accepted
time: 247ms
memory: 30016kb
input:
100000 100000 C3 2809 92491 28396 20644 41132 65854 54671 12012 66102 21915 98919 62729 34324 60961 ...
output:
1677406872 1677282430 1677461415 1677345064 1677344370 1677360941 1677317367 1677253195 1677364484 1...
result:
ok 100000 tokens
Test #25:
score: 4
Accepted
time: 262ms
memory: 30032kb
input:
100000 100000 C3 42271 19170 65992 80476 6818 79968 58331 15801 46509 36966 54742 12016 44697 77001 ...
output:
1681834308 1681753299 1681826393 1681763417 1681920680 1681784380 1681775694 1681823847 1681797694 1...
result:
ok 100000 tokens