博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 10 D. Nested Segments 树状数组
阅读量:5311 次
发布时间:2019-06-14

本文共 1227 字,大约阅读时间需要 4 分钟。

链接:

题意:

给你n条线段,输出每条线段包含多少条线段,线段端点不重复

题解:

先把线段的所有端点放到一个vector里面,同时还要记下是哪条线段的起点或终点,所以用pair

id为正表示起点,id为负表示终点,然后遍历vector遇到为正的就加入到树状数组中,负的就减去,同时更新答案

怎么更新树状数组呢,需要用cnt和map来记下这条线段是第几个被加入进来的,详细的看代码

题解:

31 int n;32 int ans[MAXN];33 int bit[MAXN];34 35 void add(int i, int x) {36     while (i <= n)     bit[i] += x, i += i&-i;37 }38 39 int sum(int i) {40     int s = 0;41     while (i) s += bit[i], i -= i&-i;42     return s;43 }44 45 int main() {46     ios::sync_with_stdio(false), cin.tie(0);47     cin >> n;48     vector
v;49 rep(i, 1, n + 1) {50 int l, r;51 cin >> l >> r;52 v.pb(mp(l, i));53 v.pb(mp(r, -i));54 }55 sort(all(v));56 int cnt = 1;57 map
mmp;58 rep(i, 0, v.size()) {59 int x = v[i].first;60 int id = v[i].second;61 if (id > 0) {62 mmp[id] = cnt;63 add(cnt++, 1);64 }65 else {66 id = -id;67 int pos = mmp[id];68 add(pos, -1);69 ans[id] = cnt - 1 - pos - sum(cnt - 1) + sum(pos);70 }71 }72 rep(i, 1, n + 1) cout << ans[i] << endl;73 return 0;74 }

 

转载于:https://www.cnblogs.com/baocong/p/7390478.html

你可能感兴趣的文章
任务二:零基础HTML及CSS编码(一)
查看>>
树和图的一些算法
查看>>
oracle创建表空间和用户
查看>>
进度条06
查看>>
阅读笔记01
查看>>
《未来简史》八、我就是我自己的神,在我活的地方
查看>>
再谈依赖注入(依赖注入的简单实现)
查看>>
Oracle数据库恢复
查看>>
hdu 1873 看病要排队
查看>>
Java 多线程Socket编程通讯--实现聊天室代码
查看>>
Topcoder SRM 597
查看>>
dubbo 负载均衡中策略决策
查看>>
Apache Shiro 简介
查看>>
详谈字符编码[二]代码页和一个乱码案例
查看>>
Call C# in powershell
查看>>
spring jdbc.property的配置与使用
查看>>
sql练习
查看>>
hdu 1106 排序
查看>>
Promise 执行时序
查看>>
Web中的积累:外观模式 Facade
查看>>