把一个人看成二维平面上的一个点,把一个K[i]看成左上角为(0,+max),右下角为(K[i],K[i])的一个矩阵,那么可以很好地描述人对于询问是否合法(我也不知道他怎么想到这东西的)

然后把一组询问排序,按照K[i]从小到大依次处理,定义一个取点的方式为尽量取纵坐标小的点,那么可以构造出一种方案使得对于每一块区域不能取的点的最大纵坐标递减

(我也不知道他怎么想到这东西的)

单调栈维护每一块被取过的点的最大纵坐标,那么随着K[i]的增大,区域会被合并

二维平面数点,主席树

#include<cstdio>
#include<algorithm>
using namespace std;
int N,n,cnt,tree[10000005],sz[200005],h[200005],stack[200005],K[200005],root[500005],ls[10000005],rs[10000005];
struct node{
int x,y;
}e[1000005];
bool cmp(node a,node b){
return a.x<b.x;
}
void insert(int pre,int &now,int l,int r,int ID){
now=++cnt;
tree[now]=tree[pre]+1;
ls[now]=ls[pre];
rs[now]=rs[pre];
if (l==r) return;
int mid=(l+r)>>1;
if (ID<=mid) insert(ls[pre],ls[now],l,mid,ID);
else insert(rs[pre],rs[now],mid+1,r,ID);
}
int query_K(int pre,int now,int l,int r,int K){
if (l==r) return l;
int mid=(l+r)>>1;
int ANS=tree[rs[now]]-tree[rs[pre]];
if (ANS>=K) return query_K(rs[pre],rs[now],mid+1,r,K);
else return query_K(ls[pre],ls[now],l,mid,K-ANS);
}
int query(int pre,int now,int l,int r,int K){
if (!now) return 0;
if (l==r) return tree[now]-tree[pre];
int mid=(l+r)>>1;
if (K<=mid) return tree[rs[now]]-tree[rs[pre]]+query(ls[pre],ls[now],l,mid,K);
else return query(rs[pre],rs[now],mid+1,r,K);
}
int main(){
scanf("%d",&n);
for (int i=1; i<=n; i++) scanf("%d%d",&e[i].x,&e[i].y);
sort(e+1,e+n+1,cmp);
N=n+1;
int head=1;
for (int i=1; i<=N; i++){
root[i]=root[i-1];
while (head<=n && e[head].x==i) insert(root[i],root[i],1,N,e[head++].y);
}
int q;
scanf("%d",&q);
while (q--){
int m;
scanf("%d",&m);
for (int i=1; i<=m; i++) scanf("%d",&K[i]);
sort(K+1,K+m+1);
int top=0;
for (int i=1; i<=m; i++){
while (top && h[top]<K[i]) top--;
int Sz=sz[top];
Sz+=query(root[K[stack[top]]],root[K[i]],1,N,K[i])-K[i];
if (Sz<0){
printf("0\n");
break;
}
else if (i==m){
printf("1\n");
break;
}
int H=query_K(root[K[stack[top]]],root[K[i]],1,N,Sz-sz[top]);
while (H>h[top] && top){
top--;
H=query_K(root[K[stack[top]]],root[K[i]],1,N,Sz-sz[top]);
}
stack[++top]=i;
sz[top]=Sz;
h[top]=H;
}
}
return 0;
}

  

BZOJ 4369: [IOI2015]teams分组的更多相关文章

  1. BZOJ4369 : [IOI2015]teams分组

    将分组计划按照$k$从小到大排序,维护一个单调栈,每个元素为一个矩形,按最底下元素从高到低排列,栈顶最低. 每次加入一个矩形可选区域,维护单调栈,可以往回合并. 然后将所有最低点不满足的矩形取出,合并 ...

  2. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  3. Bzoj 4371: [IOI2015]sorting排序 二分

    题目 似乎很久没写题解了... 这题是校里胡策的时候的题,比赛因为评测机有点慢+自己代码常数大没快读...被卡t了,但是bzoj上还是A了的...,因为bzoj时限比较宽可以不卡常. 题解: 首先可以 ...

  4. BZOJ 1190 梦幻岛宝珠(分组01背包)

    跑了7000ms... 这是个体积和价值都超大的背包.但是体积保证为a*2^b的(a<=10,b<=30)形式.且n<=100. 于是可以想到按b来分组.这样的话每组最多为a*n*2 ...

  5. BZOJ 1296 粉刷匠(分组背包套DP)

    刚开始往网络流的方向想.建不出图... 因为每次只能对一行进行染色.每一行都是独立的. 对于每一行,因为格子只能染一次,所以可以发现这是一个多阶段决策问题,这个决策就是当前格子染0还是染1. 令dp[ ...

  6. bzoj 4398 福慧双修——二进制分组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...

  7. BZOJ 4140 凸包+二进制分组

    思路: $(x_0-x)^2+(y_0-y)^2<=x^2+y^2$ $y>=(-x_0/y_0)x+(x_0^2+y_0^2)/2y0$ 这显然就是凸包了 以一个斜率不断向下(上)走   ...

  8. BZOJ 4368: [IOI2015]boxes纪念品盒

    三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...

  9. bzoj 4398 福慧双修 —— 二进制分组+多起点最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...

随机推荐

  1. Linux学习笔记——如何使用echo指令向文件写入内容

    0.前言     本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符.     echo向文件中输出内容 ...

  2. 利用Jmeter 实现Json格式接口测试

    使用Jmeter模拟http请求测试接口,请求类型为json,步骤如下: 1.启动Jmeter:找到Jmeter.bat文件双击启动Jmeter. 2.在测试计划下面添加线程组:测试计划右键--添加 ...

  3. Mongodb聚合函数

    插入 测试数据 for(var j=1;j<3;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, Age: ...

  4. 文件操作函数及光标,tell,truncate

    一丶文件基本操作 1.打开文件 open(文件名(路径),mode = "?",encoding = "字符集") 2.文件路径: 1.绝对路径,从磁盘的根目录 ...

  5. 像音乐播放App一样移动背景

    如果你经常听歌,你会发现歌曲app的背景会随着音乐移动的,从左到右或者从上到下,这种动画虽然简单,但是这里有一个技巧.如果你还不明白这种动效看看下面的demo (更多详细请参考:https://git ...

  6. cpu 满载测试软件

    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...

  7. [Git]常用的Git命令行

    Commit的用法 git init [+项目名] git add . (注意这里在add后面的空格和点是不能省略的) git status git commit -m “message”(这里的me ...

  8. 数据库要素 ER

    数据库的要素即为ER: 即为表和关系. 再往下即为字段.记录. 往上即为数据操作.管理: 包含多表操作: 在往上为事务. 再往上为大数据.高并发.

  9. 陆教授浅谈5G毫米波手机天线技术的发展现状和未来的应用场景

    近日,香港城大电子工程学系讲座教授陆贵文教授荣获英国皇家工程院院士荣衔,以表彰他在推动天线研究的卓越贡献.他研发的天线由L形探针馈电微带天线.磁电耦极天线,以至5G毫米波手机天线等技术,均在天线领域影 ...

  10. Jquery库插件大全(工作中遇到总结)

    Jquery UI所有插件下载:http://jqueryui.com/download/all/ Jquery layer灯箱等演示与帮助:http://sentsin.com/jquery/lay ...