BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3022
【题目大意】
给定n个球员,第i个球员年龄为AGEi,水平为SKILLi。
没有任何两个球员的水平相同。将这些球员按水平排序,
对于一次比赛,你需要选择若干个球员去比赛,但不能同时选择两个水平相邻的球员。
m次询问,每次给定a和k,表示要在年龄不超过a的球员中选择不超过k个球员,
请计算skill和的最大值。
【题解】
对于询问年龄的限制,我们可以通过扫描线来处理。
我们将所有人的水平映射到线段上,随着线扫描在相应的位置更新上水平,
那么问题就转化为在权值线段树上求解k个不相邻的位置,使得权值和最大,
我们维护g[0/1]数组表示r+1不选/选的时候,l位置选不选
c[0/1]数组表示r+1不选/选的时候,中间选了几个。
s[0/1]数组表示r+1不选/选的时候,中间选的和。
查询则类似权值线段树上的k大数查询。
学习了一下Claris的非递归线段树写法。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=300010,M=N<<2;
int n,m,disc[N];
LL ans[N];
struct E{int x,y,id;}a[N],b[N];
bool cmp(E a,E b){return a.x<b.x;}
namespace Segment_Tree{
int pos[N];
struct data{bool g[2];int c[2];LL s[2];}T[M];
void build(int x,int l,int r){
if(l==r){pos[l]=x;return;}
int mid=(l+r)>>1;
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
}
void change(int x,int y){
x=pos[x];
T[x].g[0]=T[x].c[0]=1,T[x].s[0]=y;
for(x>>=1;x;x>>=1)for(int i=0;i<2;i++){
bool j=T[x<<1|1].g[i];
T[x].g[i]=T[x<<1].g[j];
T[x].c[i]=T[x<<1].c[j]+T[x<<1|1].c[i];
T[x].s[i]=T[x<<1].s[j]+T[x<<1|1].s[i];
}
}
LL ask(int k){
int x=1,l=1,r=n,u=0;
LL res=0;
while(k){
if(k>=T[x].c[u]){res+=T[x].s[u];break;}
if(l==r)break;
int mid=(l+r)>>1;
x=x<<1|1;
if(k<=T[x].c[u])l=mid+1;
else{
k-=T[x].c[u];
res+=T[x].s[u];
u=T[x].g[u];
r=mid;
x--;
}
}return res;
}
}
int remark(int x){
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(disc[mid]<x)l=mid+1;
else if(disc[mid]==x)return mid;
else r=mid-1;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),disc[i]=a[i].y;
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d%d",&b[i].x,&b[i].y),b[i].id=i;
sort(a+1,a+n+1,cmp); sort(b+1,b+m+1,cmp); sort(disc+1,disc+n+1);
Segment_Tree::build(1,1,n);
for(int i=1,j=1;i<=m;i++){
while(j<=n&&a[j].x<=b[i].x)Segment_Tree::change(remark(a[j].y),a[j].y),j++;
ans[b[i].id]=Segment_Tree::ask(b[i].y);
}for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
return 0;
}
BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)的更多相关文章
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】
题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ...
- BZOJ 2584: [Wc2012]memory(扫描线+线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2584 题意:给出平面n个线段,任意两个线段严格不相交,且每个线段不平行于坐标轴.移 ...
随机推荐
- jq_常用方法
//获取兄弟元素 $('.class').siblings() 当前元素所有的兄弟节点 $('.class').prev() 当前元素前一个兄弟节点 $('.class').prevaAll() 当前 ...
- 空间数据库系列一:geomesa&sparksql 分析环境搭建
geomesa sparksql 分析环境搭建 1.安装hbase-1.3.2.1 standlone版本,作为geomesa的store a.修改配置文件:hbase-1.3.2.1/conf/hb ...
- perl6 修改文件并覆盖
use v6; my $filename = 'data.txt'; my $data = slurp $filename; say $data; $data ~~ s/'4'/'ABC'/; say ...
- mongodb-linux-x86_64
卷 DataDisk 的文件夹 PATH 列表卷序列号为 4A8E-D95CD:.│ 1.txt│ GNU-AGPL-3.0│ MPL-2│ README│ THIRD-PARTY-NOTI ...
- spark 环境搭建坑
spark的新人会有什么坑 spark是一个以java为基础的,以Scala实现的,所以在你在安装指定版本的spark,需要检查你用的是对应spark使用什么版本的scala,可以通过spark-sh ...
- 破解 myeclipse 2014 professional,步骤很重要
网易 博客 GACHA-动漫萌妹汇集地 LOFTER-最美图片社交 印像派-我的照片书 这些小语种最有前途,免费学 注册登录 加关注 日志 Windows下解决PostgreSQL8 ...
- mysql 安装和配置
mysql 安装: 在命令行输入 sudo apt-get install mysql-server 安装过程中会跳出来一个窗口,输入数据库root用户的密码(必须输入密码) 安装完成后 通过 my ...
- [ Python ] 基本数据类型及属性(上篇)
1. 基本数据类型 (1) 数字 - int (2) 字符串 - str (3) 布尔值 - bool 2. int 类型中重要的方法 (1) int 将字符串转 ...
- leetcode 之Copy List with Random Pointer(23)
深拷贝一个链表,不同的是这个链表有个额外的随机指针.参考:http://blog.csdn.net/ljiabin/article/details/39054999 做法非常的巧妙,分成三步,一是新建 ...
- java.util.ConcurrentModification并发修改异常
在运行下面这段代码时出现了并发修改异常java.util.ConcurrentModification: public static void main(String[] args) { List l ...