QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#429753 | #4887. Fast Bridges | SampsonYW | AC ✓ | 1290ms | 32920kb | C++14 | 4.8kb | 2024-06-02 20:25:02 | 2024-06-02 20:25:03 |
Judging History
answer
#include <bits/stdc++.h>
#define db double
#define il inline
#define re register
#define ll long long
#define ui unsigned
#define ull ui ll
#define i128 __int128
#define pii pair<int, int>
#define fi first
#define se second
#define eb emplace_back
#define SZ(v) (int)v.size()
#define ALL(v) v.begin(), v.end()
#define mems(v, x) memset(v, x, sizeof(v))
#define memc(a, b) memcpy(a, b, sizeof(a))
#define FOR(i, L, R) for(re int i = (L); i <= (R); ++i)
#define ROF(i, R, L) for(re int i = (R); i >= (L); --i)
#define LS i << 1, l, mid
#define RS i << 1 | 1, mid + 1, r
#define popc(x) __builtin_popcount(x)
#define popcll(x) __builtin_popcountll(x)
using namespace std;
#define N 505
#define M 1000000000
#define P 998244353
il int add(int x, int y) {return x + y < P ? x + y : x + y - P;}
il void addr(int &x, int y) {(x += y) >= P && (x -= P);}
il int qpow(int p, int n = P - 2) {
int s = 1;
while(n) {
if(n & 1) s = 1ll * s * p % P;
p = 1ll * p * p % P, n >>= 1;
}
return s;
}
il void chkmin(int &x, int y) {(x > y) && (x = y);}
il void chkmax(int &x, int y) {(x < y) && (x = y);}
int n, m;
struct edge {
int a, b, c, d;
} e[N];
int X[N * 2], LX;
int Y[N * 2], LY;
int dp[N][N];
vector<int> pos[N * 2][N * 2];
int f[2][N * 2][N];
int val[N];
il int solve(vector<edge> e) {
// if(e.empty()) return 0;
sort(ALL(e), [](edge A, edge B) {return A.c < B.c;});
LX = LY = 0; int K = SZ(e), ans = 0;
for(auto [a, b, c, d] : e) X[++LX] = a, X[++LX] = c, Y[++LY] = b, Y[++LY] = d;
X[++LX] = Y[++LY] = m + 1;
sort(X + 1, X + 1 + LX), LX = unique(X + 1, X + 1 + LX) - X - 1;
sort(Y + 1, Y + 1 + LY), LY = unique(Y + 1, Y + 1 + LY) - Y - 1;
auto idX = [](int v) {return lower_bound(X + 1, X + 1 + LX, v) - X;} ;
auto idY = [](int v) {return lower_bound(Y + 1, Y + 1 + LY, v) - Y;} ;
for(auto &[a, b, c, d] : e) a = idX(a), c = idX(c), b = idY(b), d = idY(d);
// for(auto [a, b, c, d] : e) cout << "(" << a << ", " << b << ") -> (" << c << ", " << d << ")\n";
// FOR(i, 1, LX) cout << X[i] << " \n"[i == LX];
// FOR(i, 1, LY) cout << Y[i] << " \n"[i == LY];
auto chk = [&](int i, int j) {--i, --j; if(e[i].c > e[j].a || e[i].d > e[j].b) return 0; return 1;} ;
FOR(i, 1, K) FOR(j, 1, K) if(i != j && chk(i, j)) dp[i][j] = 2; else dp[i][j] = (i == j);
FOR(k, 1, K) FOR(i, 1, K) FOR(j, 1, K) if(chk(i, k) && chk(k, j)) chkmax(dp[i][j], dp[i][k] + dp[k][j] - 1);
// mems(dp, 0);
// FOR(i, 1, n) dp[i][i] = 1;
// FOR(L, 2, n) FOR(i, 1, n - L + 1) {
// int j = i + L - 1; if(!chk(i, j)) continue; dp[i][j] = 2;
// FOR(k, i + 1, j - 1) if(chk(i, k) && chk(k, j)) chkmax(dp[i][j], dp[i][k] + dp[k][j] - 1);
// }
// FOR(i, 1, K) FOR(j, 1, K) cout << dp[i][j] << " \n"[j == K];
FOR(i, 1, LX) FOR(j, 1, LY) vector<int>().swap(pos[i][j]);
FOR(i, 0, K - 1) pos[e[i].a][e[i].b].eb(i + 1);
int now = 0, cur = 1; mems(f, 0);
ROF(x, LX - 1, 1) {
swap(now, cur), mems(f[now], 0);
ROF(y, LY - 1, 1) {
FOR(i, 1, K) {
f[now][y][i] = max(f[now][y + 1][i], f[cur][y][i]);
for(auto id : pos[x][y]) chkmax(f[now][y][i], dp[id][i]);//, cerr << x << " " << y << " " << i << " " << id << " val = " << dp[id][i] << "\n";
}
ll s = 0;
FOR(i, 1, K) val[i] = m + 1;
FOR(i, 1, K) {
int v = f[now][y][i];
// cerr << x << " " << y << " " << i << " " << v << "\n";
if(!v || Y[e[i - 1].d] >= val[v]) continue;
// cerr << "OK\n";
// cerr << "goto = " << e[i - 1].c << " " << e[i - 1].d << " " << val[v] << " and s = " << s << "\n";
// addr(s, 1ll * (m - X[e[i - 1].c] + 1) * (val[v] - Y[e[i - 1].d]) % P);
s += 1ll * (m - X[e[i - 1].c] + 1) * (val[v] - Y[e[i - 1].d]);
if(i % 8 == 0) s %= P;
val[v] = Y[e[i - 1].d];
}
s %= P;
// cerr << "A plane = " << s << "\n";
// cout << x << " " << y << " " << s << "\n";
addr(ans, 1ll * (X[x] - X[x - 1]) * (Y[y] - Y[y - 1]) % P * s % P);
}
}
// cout << "-----------------------------------------------\n";
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
FOR(i, 1, n) {
auto &[a, b, c, d] = e[i];
cin >> a >> b >> c >> d;
}
vector<edge> A, B;
FOR(i, 1, n) if(e[i].b < e[i].d) A.eb(e[i]); else B.eb(e[i]);
for(auto &[a, b, c, d] : B) {
a = m - a + 1, c = m - c + 1, swap(a, c), swap(b, d);
// b = m - b + 1, d = m - d + 1;
}
int ans = add(1ll * m * (m + 1) % P * (m * 2 + 1) % P * qpow(3) % P, P - 1ll * m * (m + 1) / 2 % P * (m + 1) % P);
ans = 2ll * m * m % P * ans % P;
// cerr << ans << " " << solve(A) << " " << solve(B) << "\n";
cout << add(ans, P - add(solve(A), solve(B)));
cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 32156kb
input:
2 2 1 1 2 2 1 2 2 1
output:
6
result:
ok answer is '6'
Test #2:
score: 0
Accepted
time: 0ms
memory: 32448kb
input:
0 1000000000
output:
916520226
result:
ok answer is '916520226'
Test #3:
score: 0
Accepted
time: 3ms
memory: 31860kb
input:
5 5 1 1 3 3 3 3 5 1 3 3 4 5 3 3 5 4 1 5 3 3
output:
946
result:
ok answer is '946'
Test #4:
score: 0
Accepted
time: 5ms
memory: 32436kb
input:
200 5 1 1 4 2 2 5 4 4 2 3 4 2 2 4 3 5 1 4 4 2 2 5 4 2 1 2 4 4 1 2 2 4 1 4 5 1 3 4 5 1 4 2 5 1 2 2 5 4 3 2 5 1 3 1 5 2 4 2 5 3 1 3 5 1 3 4 4 5 2 2 4 3 2 3 5 4 1 4 5 3 2 2 3 1 2 5 3 3 1 1 5 3 4 4 5 5 1 3 4 4 4 3 5 1 2 3 3 4 3 4 4 2 1 4 4 5 2 1 4 4 1 3 5 2 1 1 3 3 1 5 3 1 1 1 3 5 1 4 3 5 4 5 5 4 1 1 4 ...
output:
708
result:
ok answer is '708'
Test #5:
score: 0
Accepted
time: 23ms
memory: 32532kb
input:
500 10 5 6 7 10 1 3 8 10 3 3 4 9 2 10 10 2 9 4 10 10 5 4 7 8 7 1 10 7 3 1 7 10 5 2 8 9 6 3 7 10 3 10 7 9 4 9 5 1 2 5 3 3 7 10 8 2 7 7 9 8 6 6 8 3 5 10 8 8 1 1 5 5 3 3 10 5 5 5 7 6 3 8 4 7 6 7 7 5 7 3 10 9 5 3 9 4 4 6 10 5 1 5 9 10 5 6 9 7 3 10 10 3 1 2 5 7 4 6 5 1 3 1 8 5 5 8 8 9 1 8 4 3 6 4 7 10 7 ...
output:
27373
result:
ok answer is '27373'
Test #6:
score: 0
Accepted
time: 27ms
memory: 32548kb
input:
500 30 3 13 20 29 14 5 16 25 2 29 9 15 23 30 24 9 1 18 24 28 4 16 5 2 3 29 30 25 4 8 24 19 8 26 10 24 20 14 26 25 15 8 25 25 5 13 18 28 3 30 29 10 14 26 25 11 11 19 16 4 9 4 29 30 15 10 16 8 2 29 12 2 11 22 20 28 4 10 28 1 24 17 30 1 8 26 27 9 15 25 30 14 16 20 24 17 9 23 12 13 9 16 25 28 2 15 8 16 ...
output:
7717993
result:
ok answer is '7717993'
Test #7:
score: 0
Accepted
time: 45ms
memory: 32304kb
input:
500 100 25 55 55 43 14 22 84 5 57 7 79 15 63 9 86 23 22 3 53 97 2 22 64 65 32 52 66 30 76 37 79 22 46 100 76 22 21 78 78 44 29 41 92 55 43 14 46 3 14 97 42 1 16 7 35 64 15 27 29 3 11 92 92 70 4 13 66 2 3 38 55 82 41 94 83 44 52 90 100 82 6 100 99 70 18 38 24 22 74 17 98 20 17 94 44 82 33 97 48 19 12...
output:
291628571
result:
ok answer is '291628571'
Test #8:
score: 0
Accepted
time: 77ms
memory: 32880kb
input:
500 8 2 4 8 2 3 7 5 4 2 6 8 1 4 8 5 5 6 6 7 5 2 6 5 5 1 6 8 5 6 5 7 3 4 8 5 7 5 7 6 5 1 6 4 5 2 3 4 2 2 8 8 6 3 8 4 3 5 6 7 2 7 8 8 3 1 8 4 7 1 6 6 1 1 8 7 1 1 4 3 3 2 3 3 1 1 4 5 1 1 8 5 4 7 7 8 5 2 7 4 1 3 7 4 3 2 3 5 1 3 7 8 1 4 7 5 5 6 6 8 3 2 7 5 1 2 5 4 3 5 4 8 2 4 5 8 3 2 3 4 1 2 8 3 2 5 6 8 ...
output:
9321
result:
ok answer is '9321'
Test #9:
score: 0
Accepted
time: 345ms
memory: 32424kb
input:
500 1000000000 228604634 522874974 789854111 585676486 340802063 175643637 661594207 749079321 490078806 844144515 583746323 707696611 833939453 901516824 867397264 848066012 553537526 886003963 679012061 187030606 351500555 847099665 751201742 855105070 169763646 729114554 248951243 211939611 17040...
output:
230090667
result:
ok answer is '230090667'
Test #10:
score: 0
Accepted
time: 1177ms
memory: 32708kb
input:
500 1000000000 536804949 618264275 757262973 133194920 206604343 420304040 244005624 331707206 64548973 877773848 685024560 565782395 13572244 271309598 835979107 128627415 128103153 561746493 703898577 9276472 209282309 997406956 216339996 279878227 386095652 999498735 908610032 582414132 232191790...
output:
404991176
result:
ok answer is '404991176'
Test #11:
score: 0
Accepted
time: 1173ms
memory: 32720kb
input:
500 1000000000 435165109 887707979 541968631 834720917 43164344 595179931 731392283 541750474 51147932 885859385 525997101 813310992 581745995 569929983 666239343 349298365 720599913 330436249 751561895 84593980 254142704 924477087 706739688 760929039 282091849 414650019 853811117 121534462 21407507...
output:
174105246
result:
ok answer is '174105246'
Test #12:
score: 0
Accepted
time: 1175ms
memory: 32788kb
input:
500 1000000000 334968963 60182667 683993047 330063742 372714145 727060351 391638535 972082352 15288009 443033033 549932294 626507494 551292358 201286324 844192128 989162325 138957062 834473180 233314539 840742618 774917762 293038146 784290713 868100668 88362426 108423246 90763875 635080794 197409326...
output:
819654628
result:
ok answer is '819654628'
Test #13:
score: 0
Accepted
time: 1180ms
memory: 32752kb
input:
500 1000000000 407797655 600906761 451028876 557753318 739109786 505834673 914488662 267694229 21613693 815099602 741520301 86754775 749426136 864500481 989644055 760004108 97929570 281277866 645537954 194083134 386298407 900097354 590149576 876589970 225981751 604462892 313700311 201620926 13512935...
output:
704804476
result:
ok answer is '704804476'
Test #14:
score: 0
Accepted
time: 347ms
memory: 32396kb
input:
500 1000000000 136588729 322381152 198423052 586895024 146201252 78771798 320963978 33171878 103014217 582579333 112482565 472327049 363500012 171569343 779799989 210605961 916348434 897403875 958218658 848653603 81959275 288412262 293263271 877464982 155884974 409342051 490632310 353856648 42868173...
output:
701057894
result:
ok answer is '701057894'
Test #15:
score: 0
Accepted
time: 362ms
memory: 32268kb
input:
500 1000000000 70732466 818210159 101241592 180120566 551559764 430141447 558477026 919623562 842854549 898003264 988655980 690377539 365038538 842566580 988616538 612555368 119137999 522482797 776356145 341894154 134943863 753491473 621956497 857574689 860979233 313689040 912231580 819779431 253383...
output:
849305849
result:
ok answer is '849305849'
Test #16:
score: 0
Accepted
time: 347ms
memory: 32524kb
input:
500 1000000000 76067493 226360208 588463712 997370258 247139391 228988779 876938260 628658287 173490201 249999131 402004522 332729284 73514885 82656638 357464837 702514607 288650085 526722777 582817141 741491871 859774917 73498480 878952996 868608989 248586909 115745356 485233299 599896403 302539166...
output:
980753674
result:
ok answer is '980753674'
Test #17:
score: 0
Accepted
time: 423ms
memory: 32760kb
input:
500 919069957 742507159 740217847 742778031 741238898 320301045 312370945 321929532 313537690 344928356 347275650 349920032 348402734 128430402 156747983 128702472 159673979 89940237 122339622 90602165 123930504 638094551 604903042 638437986 606101004 118489244 152414022 121260981 154139858 41785067...
output:
347610358
result:
ok answer is '347610358'
Test #18:
score: 0
Accepted
time: 1290ms
memory: 32788kb
input:
500 975373400 777474465 198550754 778099765 197445181 19790862 954672658 20856536 953636596 827980256 147778510 829125529 145266113 619221505 350128003 619713737 347384388 495799407 482522585 498152766 482508636 228703 974561916 1215128 974398280 950927762 28239912 951166074 26737006 102318845 88350...
output:
486012810
result:
ok answer is '486012810'
Test #19:
score: 0
Accepted
time: 370ms
memory: 32860kb
input:
500 922966563 115641230 791820491 115936105 794899846 7441550 907396267 7640705 909366228 383643458 561813701 384786914 562843293 133648920 776892573 134236476 777454189 894069150 40941978 895005990 44397450 324914327 613839734 325458987 617562044 258873214 669542178 264432179 670706796 335542470 60...
output:
960969993
result:
ok answer is '960969993'
Test #20:
score: 0
Accepted
time: 746ms
memory: 32784kb
input:
500 910764856 264127592 56720470 264761335 57473399 300722985 26543922 302659371 27255052 138183869 187609080 138862190 187979768 291616311 30130902 293899822 30820363 695556094 694791215 698236353 694954089 467280215 445331996 467636970 445476250 284124881 43779602 284127311 44232664 41962007 25000...
output:
713510491
result:
ok answer is '713510491'
Test #21:
score: 0
Accepted
time: 942ms
memory: 32920kb
input:
500 979573708 609141204 607146721 610696466 608279394 823874084 817942635 824585371 820180663 489270955 514116219 489328036 516239321 495039861 510316151 496191240 510346356 93792698 99762142 96167488 101089313 728307491 743698364 728767609 744556149 699640438 714289051 701220727 714709191 969540246...
output:
48547907
result:
ok answer is '48547907'
Test #22:
score: 0
Accepted
time: 1274ms
memory: 32792kb
input:
500 916882629 21679409 888666976 22580401 887884682 513731805 430219378 514021683 429382029 874054006 41169282 874265838 40672160 809383100 112499436 809995521 112152965 64712081 846209768 65282651 843226386 714422089 200913113 714556860 200635656 75987513 837108705 76932484 835968220 476278326 4682...
output:
714815386
result:
ok answer is '714815386'
Test #23:
score: 0
Accepted
time: 373ms
memory: 32840kb
input:
500 931320321 72830776 877701462 74342638 877848750 636003037 264848119 639364997 265548058 193612336 779255620 194373620 779477385 578168121 322363324 578400968 326005388 38825805 898880469 40203263 905015988 756742998 170233022 757066250 172838258 755348271 172838258 756742998 172877853 736131026 ...
output:
213424131
result:
ok answer is '213424131'
Test #24:
score: 0
Accepted
time: 764ms
memory: 32784kb
input:
500 979329509 69821921 256609272 70469919 257627970 173525161 144611982 173899337 145831269 264626412 61699867 268907927 62176750 613984745 594054192 614512469 594959116 150079005 169783758 151275372 170290554 51722407 269582440 55377544 270942474 376727322 345350604 378115806 345466294 85020126 239...
output:
47584657
result:
ok answer is '47584657'
Test #25:
score: 0
Accepted
time: 918ms
memory: 32832kb
input:
500 1000000000 485693465 516211409 485912714 516973410 938324095 934537458 938706506 935778180 4795255 5758833 5876300 6592813 728990139 742791305 729114300 744227594 542623214 455296103 543512069 459370537 374403011 399544721 374963538 401727773 486887579 515784733 487983003 516142429 489364758 514...
output:
423919980
result:
ok answer is '423919980'
Test #26:
score: 0
Accepted
time: 1138ms
memory: 32784kb
input:
500 912341224 144379066 673547749 669384129 283688094 23539670 725882660 750816322 203471164 418803417 673520348 737628540 163908006 6270951 521384837 462562498 153003869 231214105 541803926 563975158 121930873 132842680 794459578 870125331 420287158 309019214 862048485 650635777 364090983 454187476...
output:
308116414
result:
ok answer is '308116414'
Test #27:
score: 0
Accepted
time: 1192ms
memory: 32784kb
input:
500 919106079 662409376 846520697 812881847 914305772 60175164 9168336 269816548 72403485 433232749 809076323 609707741 893898338 471320095 58738634 703241122 273784800 10443474 52298522 114422435 186769113 541534935 23031109 746778789 177929962 530526833 312365082 682290498 465863465 452230666 4859...
output:
248496841
result:
ok answer is '248496841'
Test #28:
score: 0
Accepted
time: 1229ms
memory: 32836kb
input:
500 988821311 38175266 941839724 110346184 854117993 921616860 850409881 955275599 781534551 145485381 244655421 222146780 179337186 716949607 227179374 814064624 143763255 294983411 237656071 389386161 187137616 386976403 129100041 439846988 49736308 257590835 130558630 331478953 51836827 890157300...
output:
727869974
result:
ok answer is '727869974'
Test #29:
score: 0
Accepted
time: 1272ms
memory: 32848kb
input:
500 962907135 127389469 484571955 127969761 485068566 307544943 749084814 308095025 750557986 752063848 56749023 754446068 56799256 646679554 782269328 647061587 786420413 888133292 376060790 889999988 376440333 574727751 36817586 575355564 38361342 856620318 945086092 857483465 946897975 909807323 ...
output:
353647678
result:
ok answer is '353647678'
Test #30:
score: 0
Accepted
time: 1265ms
memory: 32856kb
input:
500 975071090 745267943 143349830 745449998 143772866 870160763 254458675 872454160 259520494 703634471 738671840 704276263 738758463 343042933 201997565 350737009 203375886 959426775 111952749 960164748 114837129 524447125 816407 525095911 862505 705473426 638645947 707793077 639226335 647724798 63...
output:
452549048
result:
ok answer is '452549048'