社区讨论
0pts玄关求条(能过样例)
P11232[CSP-S 2024] 超速检测参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3t3xw
- 此快照首次捕获于
- 2025/11/03 20:16 4 个月前
- 此快照最后确认于
- 2025/11/03 20:16 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
int d[100005], v[100005], a[100005], p[100005], b[100005], e[100005], bin[100005][3], zh[100005][3];
int main() {
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
for (int i = 1; i <= t; i++) {
int n, m, l, v0, ans = 0, sum = 1;
cin >> n >> m >> l >> v0;
for (int j = 1; j <= n; j++) {
cin >> d[j] >> v[j] >> a[j];
}
for (int j = 1; j <= m; j++) cin >> p[j];
for (int j = 1; j <= n; j++) {
if (a[j] >= 0 && v[j] > v0 && d[j] <= p[m]) {
int l = 1, r = m, mid;
ans++;
while (l <= r) {
mid = (l + r) / 2;
if (p[mid] <= d[j]) {
l = mid + 1;
} else
r = mid - 1;
} //二分
b[ans] = l;
e[ans] = m;
} else if (a[j] < 0 && v[j] > v0 && d[j] <= p[m]) {
long double s = (v0 * v0 - v[j] * v[j] + 0.0) / (2 * a[j] + 0.0) + (d[j] + 0.0);
ans++;
int l = 1, r = m, mid;
long double ccc = s - (int(s) + 0.0);
s -= ccc;
int s1 = s;
while (l <= r) {
mid = (l + r) / 2;
if (p[mid] <= s1)
l = mid + 1;
else
r = mid - 1;
}
e[ans] = r;
l = 1;
r = m;
while (l <= r) {
mid = (l + r) / 2;
if (p[mid] <= d[j])
l = mid + 1;
else
r = mid - 1;
}
b[ans] = l;
if (e[ans] < b[ans]) {
b[ans] = 0;
e[ans] = 0;
ans--;
}
} else if (a[j] > 0 && v[j] < v0 && d[j] <= p[m]) {
ans++;
long double s = (v0 * v0 - v[j] * v[j] + 0.0) / (2 * a[j] + 0.0) + (d[j] + 0.0);
long double ccc = s - (int(s) + 0.0);
s -= ccc;
int s1 = s; // cout<<s1<<'\n';
int l = 1, r = m, mid;
while (l <= r) {
mid = (l + r) / 2;
if (p[mid] <= s1)
l = mid + 1;
else
r = mid - 1;
}
b[ans] = l;
e[ans] = m;
if (e[ans] < b[ans]) {
b[ans] = 0;
e[ans] = 0;
ans--;
}
}
}
//第一问,cout<<ans;
if (ans == 0) {
continue;
}
int shu = 1;
bin[1][1] = b[1];
bin[1][2] = e[1];
for (int j = 2; j <= ans; j++) {
int ll, rr;
if (shu == 1) {
int l = max(b[j], bin[1][1]), r = min(e[j], bin[1][2]);
if (l > r) {
sum++;
if (l - 1 == r) {
bin[1][1] = min(b[j], bin[1][1]);
bin[1][2] = max(e[j], bin[1][2]);
} else {
shu++;
bin[shu][1] = b[j];
bin[shu][2] = e[j];
}
} else {
bin[1][1] = l;
bin[1][2] = r;
}
} else if (shu > 1) {
for (int k = 1; k <= shu - 1; k++) {
bool ok = 0;
for (int f = 1; f <= shu - k; f++) {
if (bin[f][1] > bin[f + 1][1]) {
swap(bin[f][1], bin[f + 1][1]);
swap(bin[f][2], bin[f + 1][2]);
ok = 1;
}
}
if (!ok)
break;
}
int l = 1, r = shu, mid, biaob, biaoe;
bool panb = 1, pane = 1;
while (l <= r) {
mid = (l + r) / 2;
if (bin[mid][1] < b[j])
l = mid + 1;
else
r = mid - 1;
}
if (bin[r][2] < b[j])
ll = bin[l][1], biaob = l, panb = 0;
else
ll = b[j], biaob = r;
l = 1;
r = shu;
while (l <= r) {
mid = (l + r) / 2;
if (bin[mid][2] < e[j])
l = mid + 1;
else
r = mid - 1;
}
if (bin[l][1] <= e[j])
rr = e[j], biaoe = l;
else
rr = bin[r][2], biaoe = r, pane = 0;
if (ll <= rr) {
zh[1][1] = ll;
zh[1][2] = bin[biaob][2];
int f = 2;
if (pane) {
for (int k = biaob + 1; k < biaoe; k++) {
zh[f][1] = bin[k][1];
zh[f][2] = bin[k][2];
f++;
}
zh[f][1] = bin[biaoe][1];
zh[f][2] = rr;
} else {
for (int k = biaob + 1; k < biaoe; k++) {
zh[f][1] = bin[k][1];
zh[f][2] = bin[k][2];
f++;
}
}
shu = f;
for (int k = 1; k <= f; k++) {
bin[k][1] = zh[k][1];
bin[k][2] = zh[k][2];
}
} else {
shu++;
sum++;
bin[shu][1] = b[j];
bin[shu][2] = e[j];
}
}
}
// for(int j=1;j<=ans;j++)cout<<b[j]<<' '<<e[j]<<'\n';
cout << ans << ' ' << n - sum << '\n';
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...