线段树离散化
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
