原题链接

题面

(为啥这题没有题面……

给出\(N\)个人,和年龄\(age_{i},skill_{i}\)

然后给出\(M\)个询问,就是年龄在\(a\)以下选不超过\(k\)个人

要求选择的人水平排序后不相邻

题解

这个就是如果动态加点,然后从大往小能选的就选

我们把人从大往小排序

设\(g[0/1]\)表示如果左边选了或者没选,那么最右边的点选或没选

\(c[0/1]\)表示如果左边选了或者没选,那么这一段能选多少个

\(q[0/1]\)表示如果左边选了或者没选,这一段的最大价值是多少

我们把询问按年龄排序,然后把人按年龄一个个加进去,就可以直接查询了

加一个人这个人所在的点\(g[0] = 1,c[0] = 1,q[0] = val\)

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 300005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,M,id[MAXN];
struct node {
int a,s;
}p[MAXN];
struct qry_node {
int a,k,id;
}qry[MAXN];
struct tr_node {
int l,r;
int c[2],g[2];
int64 q[2];
}tr[MAXN * 4];
int64 ans[MAXN];
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;
if(l == r) return;
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
}
void update(int u) {
for(int i = 0 ; i < 2 ; ++i) {
tr[u].c[i] = tr[u << 1].c[i] + tr[u << 1 | 1].c[tr[u << 1].g[i]];
tr[u].g[i] = tr[u << 1 | 1].g[tr[u << 1].g[i]];
tr[u].q[i] = tr[u << 1].q[i] + tr[u << 1 | 1].q[tr[u << 1].g[i]];
}
}
void Change(int u,int pos) {
if(tr[u].l == tr[u].r) {
tr[u].g[0] = 1;tr[u].g[1] = 0;
tr[u].c[0] = 1;tr[u].c[1] = 0;
tr[u].q[0] = p[pos].s;tr[u].q[1] = 0;
return;
}
int mid = (tr[u].l + tr[u].r) >> 1;
if(pos <= mid) Change(u << 1,pos);
else Change(u << 1 | 1,pos);
update(u);
}
int64 Query(int u,int k,int r) {
if(tr[u].c[r] <= k) return tr[u].q[r];
if(!k) return 0; if(tr[u << 1].c[r] > k) {
return Query(u << 1,k,r);
}
else {
int t = tr[u << 1].g[r];
return tr[u << 1].q[r] + Query(u << 1 | 1,k - tr[u << 1].c[r],t);
}
}
bool cmp1(node c,node d) {
return c.s > d.s;
}
bool cmp2(int a,int b) {
return p[a].a < p[b].a;
}
bool cmp3(qry_node s,qry_node t) {
return s.a < t.a;
}
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) {
read(p[i].a);read(p[i].s);
}
sort(p + 1,p + N + 1,cmp1);
for(int i = 1 ; i <= N ; ++i) {
id[i] = i;
}
sort(id + 1,id + N + 1,cmp2);
read(M);
for(int i = 1 ; i <= M ; ++i) {
read(qry[i].a);read(qry[i].k);qry[i].id = i;
}
sort(qry + 1,qry + M + 1,cmp3);
int t = 1;
build(1,1,N);
for(int i = 1 ; i <= M ; ++i) {
while(t <= N && qry[i].a >= p[id[t]].a) {
Change(1,id[t]);
++t;
}
ans[qry[i].id] = Query(1,qry[i].k,0);
}
for(int i = 1 ; i <= M ; ++i) {
out(ans[i]);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【BZOJ】3022: [Balkan2012]The Best Teams的更多相关文章

  1. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  2. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  3. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  4. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  5. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  6. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  7. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  8. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  9. 【BZOJ】【3170】【TJOI2103】松鼠聚会

    切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...

随机推荐

  1. 【转】C++拷贝构造函数详解

    一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对象拷贝 ...

  2. 题解 SP26045 【GCDMAT2 - GCD OF MATRIX (hard)】

    承接一下洛咕上的题解,这里基本就是谈谈优化,放个代码的 我们发现这里的常数主要来自于除法,那么我们优化除法次数,把所有的 \(n/1...n/s\) (\(s=\sqrt n\))存下来,然后归并排( ...

  3. Unity-Rigidbody碰撞穿透

    首先,说说碰撞的条件:1.rigidbody(刚体),一般用在主动移动的物体上,比如角色.2.collider,碰撞器,一般用于受力物体上,比如障碍块. 发生概率即触发方式: 1.刚体速度足够快,被撞 ...

  4. 032_nginx配置文件安全下载

    一. server { listen 8866; server_name _; access_log /usr/local/etc/nginx/log/download.access.log main ...

  5. ASP.NET 验证码绘制

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. Java 的 Api 文档生成工具 JApiDocs 程序文档工具

    JApiDocs 详细介绍 简介 JApiDocs 是一个符合 Java 编程习惯的 Api 文档生成工具.最大程度地利用 Java 的语法特性,你只管用心设计好接口,添加必要的注释,JApiDocs ...

  7. Confluence 6 Windows 中以服务方式自动重启为服务手动安装 Confluence 分发包

    在 Windows: 打开一个命令输入框,然后修改目录到 <CONFLUENCE-INSTALL>/bin 目录中.你需要以管理员权限运行这个命令行输入框(Run as administr ...

  8. NIO(二)

    Mark和reset的使用 package com.cppdy.nio; import java.nio.ByteBuffer; //Mark和reset的使用 public class NIOBuf ...

  9. Redis持久化概念

    redis持久化概念 Author:SimpleWu GitHub-redis 什么是持久化? 概念:把内存的数据保存在磁盘的过程. Redis的持久化? redis是内存数据库,它把数据存储在内存中 ...

  10. Mybaits动态Sql

    什么是动态SQL? MyBatis的强大之处便是它的动态SQL,如果你使用JDBC那么在根据不同条件查询时,拼接SQL语句是多么的痛苦. 比如查询一个学生信息,可以根据学生的姓名,性别,班级,年龄,学 ...