0pts cdq 求助/kel

P3810 【模板】三维偏序(陌上花开)

为了防止有人说马蜂问题,可以看这个 ``` #include <iostream> #include <algorithm> using namespace std; struct TLEWA { int a, b, c, v, id; } a[1000005], b[1000005]; int f[1000005], ans[1000005]; long long pref[1000005] ; void addd(int x, long long v) { for (int j=x; j<=1000000; j+=j&-j) pref[j] += v; } long long query(int x) { long long summ=0; for (int j=x; j; j-=j&-j) summ += pref[j]; return summ; } void seele(int l, int r) { if (l == r) return; int mid = (l + r) / 2; seele(l, mid); seele(mid+1, r); sort(b+l, b+r+1, [](TLEWA x, TLEWA y) { return x.b < y.b; } ); for (int i=l; i<=r; i++) if (b[i].id <= mid) addd(b[i].c, b[i].v); else f[b[i].id] += query(b[i].c); for (int i=l; i<=r; i++) if (b[i].id <= mid) addd(b[i].c, -b[i].v); } int main() { int n, k, cnt=0; cin >> n >> k; for (int i=1; i<=n; i++) cin >> a[i].a >> a[i].b >> a[i].c; sort(a+1, a+1+n, [](TLEWA x, TLEWA y) { return x.a != y.a ? x.a < y.a : (x.b != y.b ? x.b < y.b : x.c < y.c); } ); for (int i=1; i<=n; i++) if (a[i].a != a[i-1].a || a[i].b != a[i-1].b || a[i].c != a[i-1].c) b[++cnt] = a[i], b[cnt].id = cnt, b[cnt].v = 1; else b[cnt].v++; seele(1, cnt); for (int i=1; i<=cnt; i++) ans[f[i]]++; for (int i=0; i<n; i++) cout << ans[i] << endl; } ```
by LuoTianyi_Official @ 2023-10-31 14:12:27


你这个代码好像不能处理 ``` 1 1 1 1 1 1 1 1 1 ``` 这样三个点一起的吧
by xyzfrozen @ 2023-10-31 14:16:45


@[LuoTianyi_Official](/user/424089) 楼上正解。 如果多个点叠在一起,那么显然它们互相满足条件,并且也应当当作多个点来加,而不是一个。 所以统计答案时 `for (int i=1; i<=cnt; i++) ans[f[i]]++;` 应该改成 `for (int i = 1; i <= cnt; ++i) ans[f[b[i].id] + b[i].v - 1] += b[i].v;`
by ATZdhjeb @ 2023-10-31 14:37:34


~~以及你谷怎么两个天依~~
by ATZdhjeb @ 2023-10-31 14:38:29


@[xyzfrozen](/user/749714) @[ATZdhjeb](/user/483317) 谢谢。我的代码还有一个问题是排序需要按照 c 和 a 作为第二和第三关键字排序。现在过了。 ~~我是洛谷的洛天依唯一官方号。其他洛天依都是高仿我的。~~
by LuoTianyi_Official @ 2023-10-31 16:04:43


|