QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#429752 | #4887. Fast Bridges | SampsonYW | WA | 8ms | 31816kb | C++14 | 4.8kb | 2024-06-02 20:24:39 | 2024-06-02 20:24:40 |
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 1000000007
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 >> m >> n;
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 << 2ll * add(ans, P - add(solve(A), solve(B))) % P;
cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 8ms
memory: 31816kb
input:
2 2 1 1 2 2 1 2 2 1
output:
12
result:
wrong answer expected '6', found '12'