把一个人看成二维平面上的一个点,把一个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. 走进docker的世界之入门篇

    by zhouzhipeng from https://blog.zhouzhipeng.com/walk-in-docker-beginning.html本文可全文转载,但需要保留原作者和出处. 什 ...

  2. js基础拖拽效果

    function drag(ele) { const config = { mark: 0, x: 0, y: 0, left: ele.offsetLeft, top: ele.offsetTop, ...

  3. SPRING代理模式

    1.静态代理 主题对象:Student public interface Student { public String add(); } 目标对象:RealStudent public class ...

  4. 实例——省市区三级联动 & 还可以输入字符统计

    1 省市区三级联动 html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  5. mysql(数据库,sql语句,普通查询)

    第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...

  6. Elasticsearch-基本操作2

    Elasticsearch版本:6.0 为了避免并发修改的冲突问题,数据库中,经常用悲观锁和乐观锁来控制并发问题,而Elasticsearch使用乐观锁.如果源数据在读写过程中被修改,更新将失败,应用 ...

  7. 1.2 the structure of a compiler

    Compiler 1.2 the structure  of a compiler Compiler : analysis and synthesis syntactically  语法上的 sema ...

  8. Centos安装iptables防火墙

    一.安装说明: 1.因为centos7.0及以上版本就默认安装了firewall防火墙,但有时候根据项目实际所需,服务器上还是需要安装iptables,以下就是具体的安装步骤: 2.因阿里云在服务器外 ...

  9. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  10. 监测元素resize

    前言 近来有需求要做分页,听起来可能有点Low. 所以我要把Low的事情做得有点逼格. 分页本身没啥,但是数据量起来了,比如十万. 要是不做点处理, 那你的页面估计爽得很,机器也爽得很. 放心,我不会 ...