HDU 4325 线段树离散化

谁都会走 提交于 2020-01-05 03:07:14

 线段树离散化

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;  
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!