[树状数组] hdu 5372 Segment Game
来源:互联网 发布:nginx负载均衡配置 编辑:程序博客网 时间:2024/06/05 00:50
题目分析
记录左端点、右端点两棵线段树。在添加某线段时,其完全所覆盖的前面的线段数量为:
其中,tot为总线段数,numl为小于当前线段左端点的左端点数,r为大于当前线段右端点的右端点数,numl和r都是没有被覆盖的线段数量,用总数-不合题意数得到的就是合题数。(由于前面的线段长度短,因此无重复)。
记小于等于当前线段右端点的右端点数为numr,则
故
另外数据范围太大,需要离散化,由于需要的是左、右端点分别的对应大小关系,故只需分别离散化即可。
代码
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<map>#include<algorithm>#define lson l,mid,cur<<1#define rson mid+1,r,cur<<1|1typedef long long ll;using namespace std;const int maxn = 2e5+7;int maxb;int n;int btl[maxn], btr[maxn];inline int lowbit(int x){return x & -x;}void add(int bit[], int x, int val){for(int i = x; i <= maxb; i+=lowbit(i)) bit[i] += val;}int query(int bit[], int x){ int res = 0; for(int i = x; i > 0; i -= lowbit(i)) res += bit[i]; return res;}int del[maxn],x[maxn],y[maxn],z[maxn];int ld,ly;int sub[maxn];void disc(int y[], const int &n){ for(int i=1;i<= n; i++) sub[i] = y[i]; sort(sub+1, sub+1 + n); int *t = unique(sub+1, sub+1+n); for(int i = 1; i <= n; i++) y[i] = lower_bound(sub+1, t, y[i]) - sub;}int main(){ int cnt = 1; while(cin>>n) { ld=ly=0; printf("Case #%d:\n", cnt++); for(int i = 1; i <= n; i++) { scanf("%d",&x[i]); if(x[i]) scanf("%d", &del[++ld]); else { scanf("%d", &y[++ly]); z[ly] = y[ly] + ly; } } maxb = ly; for(int i = 0; i <= maxb; i++) btl[i] = btr[i] = 0; disc(y,ly); disc(z,ly); int p1 = 0, p2 = 0; for(int i = 1; i <= n; i++) { if(x[i]) { add(btl, y[del[++p2]], -1); add(btr, z[del[p2]], -1); } else { int l=y[++p1],r=z[p1]; printf("%d\n",query(btr,r)-query(btl,l-1)); add(btl,l,1); add(btr,r,1); } } } return 0;}
0 0
- HDU 5372 Segment Game 树状数组
- 【树状数组】 HDU 5372 Segment Game
- hdu 5372 Segment Game(树状数组)
- HDU 5372 - Segment Game(树状数组)
- 【HDU 5372】Segment Game(树状数组)
- HDU 5372 Segment Game 树状数组
- HDU 5372 Segment Game(树状数组)
- [HDU 5372] Segment Game (树状数组)
- [树状数组] hdu 5372 Segment Game
- Segment Game (hdu 5372 树状数组+离散化)
- hdu 5372 Segment Game(树状数组+离散化)
- hdu 5372 Segment Game (树状数组+离散化)
- HDU 5372 Segment Game (树状数组+离散化)
- HDU 5372 Segment Game (MUT#7 树状数组+离散化)
- HDU 5372 Segment Game - 离散化&树状数组
- 树状数组,离散化,突破口(Segment Game,HDU 5372)
- hdu5372 Segment Game 树状数组
- hdu5372 Segment Game (树状数组)
- word------word怎么让复制以后的图片居中(word2003)
- RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载
- 10个用好模糊效果的超实用设计技巧
- 编程练习(2)
- Linux操作系统rpm包安装方式步骤
- [树状数组] hdu 5372 Segment Game
- 版本管理工具:Gitlab
- mysql事物处理
- C#入门3.4——数据类型之引用类型
- react native use map function
- 复数类的完整实现(C++版)
- c++之STL(13) STL 算法 - 查找算法(1)
- UVA725 UVALive5362 Division
- C++拷贝构造函数(深拷贝,浅拷贝)