社区讨论
WA#9找不出bug求调
P6007[USACO20JAN] Springboards G参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo2i6kej
- 此快照首次捕获于
- 2023/10/23 14:14 2 年前
- 此快照最后确认于
- 2023/10/23 14:14 2 年前
代码如下
CPP#include <iostream>
#include <math.h>
#include <map>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
const int N = 100001;
const ull INF = 1000000000;
int dp[N];
map<ull, ull>shadow;
map<ull, int>ans;
int n, p;
struct pt {
int x, y;
friend bool operator !=(const pt&a, const pt&b) {
if (a.x == b.x && a.y == b.y)return false;
return true;
}
} all[N * 2 + 50], now[N * 2 + 50];
int cnt = 0;
struct node {
int rnd, x, y, num, minn;
node *ch[2];
void init(int xin, int yin) {
x = xin, y = yin;
num = minn = 0;
rnd = rand();
ch[0] = ch[1] = nullptr;
}
void upd() {
minn = num;
if (ch[0] != nullptr) {
minn = min(ch[0]->minn, minn);
}
if (ch[1] != nullptr) {
minn = min(ch[1]->minn, minn);
}
}
}*root;
bool cm_p(pt a, pt b) {
if (a.x == b.x)return a.y < b.y;
return a.x < b.x;
}
typedef pair<node*, node *> pr;
pr split(node *cur, int val) {
if (cur == nullptr)return {nullptr, nullptr};
if (cur->y <= val) {
auto ntr = split(cur->ch[1], val);
cur->ch[1] = ntr.first;
cur->upd();
return {cur, ntr.second};
} else {
auto ntr = split(cur->ch[0], val);
cur->ch[0] = ntr.second;
cur->upd();
return {ntr.first, cur};
}
}
node *merge(node *cur1, node *cur2) {
if (cur1 == nullptr || cur2 == nullptr) {
if (cur1 == nullptr)return cur2;
return cur1;
}
if (cur1->rnd <= cur2->rnd) {
cur1->ch[1] = merge(cur1->ch[1], cur2);
cur1->upd();
return cur1;
} else {
cur2->ch[0] = merge(cur1, cur2->ch[0]);
cur2->upd();
return cur2;
}
}
void insert(int x, int y) {
int val = 0;
ull toval = x * INF * 10ull + y;
if (shadow.find(toval) != shadow.end())
if (ans.find(shadow[toval]) != ans.end()) {
ull tmp = shadow[toval];
int xt = shadow[toval] / 10ull / INF, yt = shadow[toval] % (10ull * INF);
val = ans[shadow[x * INF * 10 + y]] - x - y + xt + yt;
}
auto ntr1 = split(root, y);
if (ntr1.first != nullptr)
val = min(val, ntr1.first->minn);
auto ntr2 = split(ntr1.first, y - 1);
node*cur = new node;
cur->init(x, y);
cur->num = ans[toval] = val;
ntr2.second = merge(ntr2.second, cur);
auto ntr = merge(ntr2.first, ntr2.second);
root = merge(ntr, ntr1.second);
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> p;
for (int i = 1; i <= p * 2; i += 2) {
cin >> all[i].x >> all[i].y >> all[i + 1].x >> all[i + 1].y;
ull t1 = all[i + 1].x * INF * 10ull + all[i + 1].y, t2 = all[i].x * INF * 10ull + all[i].y;
shadow[t1] = t2;
}
all[p * 2 + 1].x = 0, all[p * 2 + 1].y = 0, all[p * 2 + 2].x = n, all[p * 2 + 2].y = n;
sort(all + 1, all + 1 * 2 * p + 2, cm_p);
for (int i = 1; i <= 2 * p + 2; i++) {
if (all[i] != all[i + 1] ) {
now[++now[0].x] = all[i];
}
}
for (int i = 1; i <= now[0].x; i++) {
insert(now[i].x, now[i].y);
// cout << now[i].x << " " << now[i].y << " " << ans[now[i].x * 10ull * INF + now[i].y] << "\n";
}
cout << ans[n * INF * 10 + n] + n + n << "\n";
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...