Edu41

1|0基本情况

D卡太久了,第一次搞计算几何没经验

2|0D. Pair Of Lines

Problem - D - Codeforces

思路不难,重要的是以后计算这种叉乘一定要开longlong

3|0E. Tufurama

Problem - E - Codeforces

  1. 我们维护一个存储下标数据的树状数组,先将 1n 插入树状数组。

  2. a 表示原数组,b 表示按照 ai 排序后的数组。

  3. 我们从 1 开始统计,直到 n,统计时:

    • i 删除,不能把自己算进去。

    • 为了排除 aj<i 的部分,可以从前往后扫描 b,一直删,直到 bcuri

      因为 b 单调不下降,所以 i 都用不着了, i+1 也用不着了。

    • 调查 aij 的部分,调用 query(ai) 即可。

    • 注意:排除的时候用 b,这样就不用遍历整个 a 数组来排除 aj<i 的部分;

      而询问的时候要用 a,因为询问的是 aij 的部分。

void solve() { int n; std::cin >> n; std::vector<int> a(n); for (auto& x : a) std::cin >> x, --x; std::vector<std::pair<int, int>> b(n); for (int i = 0; i < n; i++) { b[i].first = a[i], b[i].second = i; } Fenwick<i64> T(n); for (int i = 0; i < n; i++) { T.add(i, 1); } std::sort(all(b)); int cur(0); i64 ans(0); std::vector<bool> del(n); for (int i = 0; i < n; i++) { if (not del[i]) {//先把当前删了 del[i] = true; T.add(i, -1); } while(cur < n and b[cur].first < i) {//把所有不符合条件(a_j < i)的都删了 if (not del[b[cur].second]) { del[b[cur].second] = true; T.add(b[cur].second, -1); } cur++; } ans += T.sum(std::min(n, a[i] + 1));//查找所有小于等于a_i的元素 } std::cout << ans << '\n'; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/18099069.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示