传送门:【HDU】5140 Hun Gui Wei Company

题目分析:一般情况下,区间很大的话,第一反应就是离散,我也不例外,但是本题的区间很大!并且重要的是强制在线让人不能离散!但是这样就能阻挡我们AC的步伐吗?当然不能!注意到,我们将数从小到大排好序,将此时的下标作为主席树的下标,然后我们怎么为那么大的查询范围找到对应的区间呢?显然可以用二分啊~直接二分出查询的区间就好辣,因为此时数组有序满足二分的性质。

这个就是本题的技术难题。

而每次在(x,y)点插入一个权值为c的点,查询矩阵【x1,x2】【y1,y2】内所有点的权值和我们可以用主席树来做,即在下标为x的主席树上下标为y的位置插入点,查询下标【x1,x2】内主席树上【y1,y2】区间内点的和,这个比较基础,我就不熬述了。

PS:

1.注意处理好左右两边界。

2.注意数组大小。

3.区间是先加上或减去ans,然后如果左端点大于右端点就交换。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;typedef long long LL ;#define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define ls ( o << 1 )
#define rs ( o << 1 | 1 )
#define lson ls , l , m
#define rson rs , m + 1 , r
#define mid ( ( l + r ) >> 1 )const int MAXN = 100005 ;struct Node {Node* c[2] ;LL sum ;
} ;struct People {int s , l , a ;People () {}People ( int s , int l , int a ) : s ( s ) , l ( l ) , a ( a ) {}bool operator < ( const People& t ) const {return l < t.l ;}
} ;People p[MAXN] ;
Node pool[MAXN * 40] ;
Node* cur ;
Node* root[MAXN] ;int a[MAXN] ;
int b[MAXN] , cnt ;
int n , m ;int unique ( int n ) {int cnt = 1 ;sort ( b + 1 , b + n + 1 ) ;For ( i , 2 , n ) if ( b[i] != b[cnt] ) b[++ cnt] = b[i] ;return cnt ;
}int hash ( int x , int l = 1 , int r = cnt ) {while ( l < r ) {int m = mid ;if ( b[m] >= x ) r = m ;else l = m + 1 ;}return l ;
}int lower_bound ( int x , int a[] , int l , int r ) {while ( l < r ) {int m = ( l + r ) >> 1 ;if ( a[m] >= x ) r = m ;else l = m + 1 ;}return l ;
}int upper_bound ( int x , int a[] , int l , int r ) {while ( l < r ) {int m = ( l + r + 1 ) >> 1 ;if ( a[m] <= x ) l = m ;else r = m - 1 ;}return r ;
}void build ( Node* &o , int l , int r ) {o = cur ++ ;o->sum = 0 ;if ( l == r ) return ;int m = mid ;build ( o->c[0] , l , m ) ;build ( o->c[1] , m + 1 , r ) ;
}void insert ( Node* old , Node* &now , int x , int v , int l , int r ) {now = cur ++ ;if ( l == r ) {now->sum = old->sum + v ;return ;}int m = mid ;if ( x <= m ) {now->c[1] = old->c[1] ;insert ( old->c[0] , now->c[0] , x , v , l , m ) ;} else {now->c[0] = old->c[0] ;insert ( old->c[1] , now->c[1] , x , v , m + 1 , r ) ;}now->sum = now->c[0]->sum + now->c[1]->sum ;
}LL query ( Node* old , Node* now , int x , int l , int r ) {LL ans = 0 ;while ( l < r ) {int m = mid ;if ( x <= m ) {r = m ;old = old->c[0] ;now = now->c[0] ;} else {ans += now->c[0]->sum - old->c[0]->sum ;old = old->c[1] ;now = now->c[1] ;l = m + 1 ;}}ans += now->sum - old->sum ;return ans ;
}void scanf ( int& x , char c = 0 ) {while ( ( c = getchar () ) < '0' ) ;x = c - '0' ;while ( ( c = getchar () ) >= '0' ) x = x * 10 + c - '0' ;
}void scanf ( LL& x , char c = 0 , bool flag = 0 ) {while ( ( c = getchar () ) != '-' && c < '0' ) ;if ( c == '-' ) x = 0 , flag = 1 ;else x = c - '0' ;while ( ( c = getchar () ) >= '0' ) x = x * 10 + c - '0' ;if ( flag ) x = -x ;
}void solve () {LL ll , hl , la , ha ;LL ans = 0 ;cur = pool ;For ( i , 1 , n ) {scanf ( p[i].s ) ;scanf ( p[i].l ) ;scanf ( p[i].a ) ;//scanf ( "%d%d%d" , &p[i].s , &p[i].l , &p[i].a ) ;b[i] = p[i].a ;}p[n + 1] = People ( 0 , -1 , -1 ) ;p[n + 2] = People ( 0 , 1000000001 , 1000000001 ) ;b[n + 1] = -1 ;b[n + 2] = 1000000001 ;n += 2 ;sort ( p + 1 , p + n + 1 ) ;For ( i , 1 , n ) a[i] = p[i].l ;cnt = unique ( n ) ;build ( root[0] , 1 , cnt ) ;For ( i , 1 , n ) insert ( root[i - 1] , root[i] , hash ( p[i].a ) , p[i].s , 1 , cnt ) ;scanf ( "%d" , &m ) ;while ( m -- ) {scanf ( ll ) ;scanf ( hl ) ;scanf ( la ) ;scanf ( ha ) ;//canf ( "%I64d%I64d%I64d%I64d" , &ll , &hl , &la , &ha ) ;ll += ans ;hl -= ans ;la += ans ;ha -= ans ;if ( ll > hl ) swap ( ll , hl ) ;if ( la > ha ) swap ( la , ha ) ;ll = max ( -1LL , ll ) ;la = max ( -1LL , la ) ;hl = min ( 1000000001LL , hl ) ;ha = min ( 1000000001LL , ha ) ;ll = lower_bound ( ll , a , 1 , n ) ;hl = upper_bound ( hl , a , 1 , n ) ;la = lower_bound ( la , b , 1 , cnt ) ;ha = upper_bound ( ha , b , 1 , cnt ) ;//printf ( "%I64d %I64d %I64d %I64d\n" , ll , hl , la , ha ) ;ans = query ( root[ll - 1] , root[hl] , ha , 1 , cnt ) - query ( root[ll - 1] , root[hl] , la - 1 , 1 , cnt ) ;printf ( "%I64d\n" , ans ) ;}
}int main () {while ( ~scanf ( "%d" , &n ) ) solve () ;return 0 ;
}

【HDU】5140 Hun Gui Wei Company 主席树相关推荐

  1. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  2. HDU - 6704 K-th occurrence (后缀数组+主席树)

    题目链接 题意 QQQ次询问,每次询问求SSS的子串出现KKK次的位置 思路 刚开始想的是AC自动机,但是建自动机会超时,后来学长想到后缀数组+主席树的做法Orz...Orz...Orz... 出现K ...

  3. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  4. HDU 4348 To the moon(主席树区间修改)

    题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...

  5. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  6. hdu 4348 To the moon (主席树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4348 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q ...

  7. HDU 5919 Sequence II 主席树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5919 Sequence II Time Limit: 9000/4500 MS (Java/Othe ...

  8. HDU - 6621 K-th Closest Distance——主席树+二分

    [题目描述] HDU - 6621 K-th Closest Distance [题目分析] 因为看到第kkk大的要求,刚开始的时候一直都在想怎么运用第kkk大来解决问题,但是后来看其他人的博客才发现 ...

  9. HDU - 5919 Sequence II——主席树+区间种类++逆序建树

    [题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...

最新文章

  1. Silverlight开发历程—(绘制矢量图之Polyline 和 Polygon)
  2. 在Linux下配置TCP/IP
  3. 多线程基础-基本概念(一)
  4. solve mass matrix in matlab
  5. canvas 绘制贪吃蛇游戏 1
  6. dw中创建java程序_Java创建对象的过程简介
  7. gfsk调制频谱_gfsk调制方式
  8. java实现打开新窗口_[Java教程]javascript 打开新窗口(window.open)
  9. 收藏级干货——Auto CAD历史版本功能大盘点(上)
  10. vue3 + crypto-js加密解密(普通版本/TS版本)
  11. Python 分析电影《南方车站的聚会》
  12. 为什么打开CAD显示驱动该文件(.hdi)缺少或已损坏?
  13. 感知机算法(一)---原理
  14. 小论文格式要求(2010年版)
  15. go-stat-reporter(1):golang开发通用报表展示系统,设计数据结构
  16. C语言4位BCD码加法器,bcd码加法器
  17. 任天堂游戏服务器系统,买个服务器当电脑主机如何确保买到新版任天堂Switch游戏主机?...
  18. 中国IT教育培训年度评选颁奖
  19. 30. 主频和时钟配置实验
  20. 游戏服务器 linux windows,游戏服务器用windows还是linux的系统好?

热门文章

  1. linux下jexus搭配php环境
  2. 小红书2020校招测试开发后端笔试题卷一
  3. HTML5 Plus移动App(5+App)开发入门指南
  4. 青少年计算机表演赛27,第27届中国青少年计算机表演赛颁奖仪式在京举行
  5. 阿里云OSS归档/冷归档存储先解冻后下载(解冻收费)
  6. java中单精度浮点数和双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...
  7. 数据库MYSQL详细教程----千锋学习笔记
  8. win10系统下安装ubuntu18.04双系统,超详细教程
  9. iOS真机调试出错解决方法
  10. 【UE4】【C++】PlayerController、AIController获取玩家对应的Pawn