两颗线段树
2016-03-20 12:01
344 查看
大意:有n个操作(n<=10000),接下来有n行,分别为k,m,k==0为在m处插入一条从m到m+i的线段(i为第i次插入)。k==1为删除第m次的线段插入。问插入线段能完全的包含多少完整的线段。
思路:用1-m+i内有的端点数-1-m内的端点数=包含的线段数目。分别用两棵树来保存 点的数目。
思路:用1-m+i内有的端点数-1-m内的端点数=包含的线段数目。分别用两棵树来保存 点的数目。
#include<algorithm> #include<cmath> #include<queue> #include<map> #define ll long long #define inf 0x3f3f3f3f #include <vector> #include<cstdio> #include<cstring> #include<string> #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 using namespace std; struct node{ int a,b; bool vis; }q[100100]; int sum[100100*5],sum1[100010*5]; void Push(int rt){ sum[rt] = sum[ rt<<1]+ sum[rt<<1|1]; } void Push1(int rt){ sum1[rt] = sum1[ rt<<1]+ sum1[rt<<1|1]; } int Query(int a,int b,int l,int r,int rt){ if(a <= l&&b >= r){ return sum[rt]; } int mid=(l + r) / 2; int ans=0; if(a <= mid) ans += Query(a,b,ls); if(mid < b) ans += Query(a,b,rs); return ans; } int Query1(int a,int b,int l,int r,int rt){ if(a <= l&&b >= r){ return sum1[rt]; } int ans = 0; int mid = (l + r) / 2; if(a <= mid) ans += Query1(a,b,ls); if(b > mid) ans += Query1(a,b,rs); return ans; } void add(int a,int b,int l,int r,int rt){ if(l == r){ sum[rt] += b; return ; } int mid = (l + r) / 2; if(a <= mid ){ add(a,b,ls); } else add(a,b,rs); Push(rt); } void add1(int a,int b,int l,int r,int rt){ if(l == r){ sum1[rt] += b; return ; } int mid = (l + r) / 2; if(a <= mid ){ add1(a,b,ls); } else add1(a,b,rs); Push1(rt); } int main(){ int n,m,i,j,k,s; while(~scanf("%d",&n)){ s = 1; memset(q,false,sizeof(q)); memset(sum,0,sizeof(sum)); memset(sum1,0,sizeof(sum1)); for(i = 0;i < n;++ i){ scanf("%d%d",&k,&m); if(!k ){ q[s].a = m+1; q[s].b = m + s + 1; q[s].vis = true; ++ s; printf("%d\n",Query1(1,m + s + 1,1,20001,1 ) - Query(1,m,1,20001,1 )); add(m + 1,1,1,20001,1); add1(m + 1 + s,1,1,20001,1 ); } else{ if(q[m].vis){ add(q[m].a,-1,1,20001,1); add1(q[m].b,-1,1,20001,1); q[m].vis=false; } } } } return 0; }
相关文章推荐
- 线段树题集
- 线段树
- hdu1754
- HDU1394
- 敌兵布阵 (1)
- I Hate It (1)
- LCIS (2)
- A Simple Problem with Integers (2)
- Mayor's posters (3)
- Buy Tickets (3)
- 线段树
- UVA - 12532 Interval Product
- POJ 3264 Balanced Lineup
- hdu 1542 求矩形并的面积
- 关于数据结构之线段树
- poj 3225 关于集合运算
- poj 2352
- hihocoder #1069 线段树
- hdu1166敌兵布阵(线段树点修改)
- 【51nod 6级题目】XOR key 问题