线段树离散化
1.输入完所有数据,对开花时间离散化
2.区间更新,点查询,LAZY操作。。
View Code#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> using namespace std; #define MAXN 51000 struct node { int left, right; int num; int sum; int lazy; }seg[500010]; int N, M; struct flower { int a,b; }p[101000]; int v[200010]; int hashx[201000]; void build(int l, int r, int root) { int mid = (l + r) / 2; seg[root].left = l; seg[root].right = r; seg[root].num = 0; seg[root].lazy = 0; seg[root].sum = 0; if( l == r ) { return; } build(l,mid,root*2); build(mid+1,r,root*2+1); seg[root].sum = seg[root*2].sum + seg[root * 2 + 1].sum; } void update(int x) { seg[x * 2].lazy += seg[x].lazy; seg[x * 2].sum += (seg[x * 2].right - seg[x * 2].left + 1 ) * seg[x].lazy; seg[x * 2 + 1].lazy += seg[x].lazy; seg[x * 2 + 1].sum += (seg[x * 2 + 1].right - seg[x * 2 + 1].left + 1 ) * seg[x].lazy; seg[x].lazy = 0; } void add( int root, int u, int v, int val) { int mid = (seg[root].left + seg[root].right) / 2; if( seg[root].left == u && v == seg[root].right ) { seg[root].lazy += val; seg[root].sum += (v - u + 1) * val; return; } if( seg[root].lazy != 0 ) update( root ); if( u > mid ) add( root * 2 + 1, u, v, val); else if( v <= mid ) add( root * 2, u, v, val); else { add( root * 2, u, mid, val); add( root * 2 + 1, mid + 1, v,val); } seg[root].sum = seg[root*2].sum + seg[root * 2 + 1].sum; } int sum( int root,int u, int v) { int mid = (seg[root].left + seg[root].right) / 2; if( seg[root].left == u && v == seg[root].right ) { return seg[root].sum; } if( seg[root].lazy != 0 ) update(root); int st = 0; if( u > mid ) return sum( root * 2 + 1, u, v); else if( v <= mid ) st += sum( root * 2, u, v); else { st += sum( root * 2, u, mid); st += sum( root * 2 + 1, mid + 1, v); } return st; } int main( ) { int t,T, abc = 0; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); int cnt = 0; for(int i = 1; i <= N; i++) { scanf("%d%d",&p[i].a,&p[i].b); v[cnt++] = p[i].a; v[cnt++] = p[i].b; } for( int i = 1; i <= M; i++) { scanf("%d",&hashx[i]); v[cnt++] = hashx[i]; } sort(v, v + cnt); cnt = unique(v, v + cnt) - v; build(0,cnt,1); for( int i = 1; i <= N; i++) { int x = lower_bound(v, v + cnt, p[i].a) - v; int y = lower_bound(v, v + cnt, p[i].b) - v; add( 1, x, y, 1); } printf("Case #%d:\n",++abc); for( int i = 1; i <= M; i++) { int tt = lower_bound(v, v + cnt, hashx[i]) - v; printf("%d\n",sum(1,tt,tt)); } } return 0; }
来源:https://www.cnblogs.com/tangcong/archive/2012/07/31/2617319.html