【bzoj4548】小奇的糖果 STL-set+树状数组
题目描述
平面上有n个点,每个点有一种颜色。对于某一条线段,选择所有其上方或下方的点。求:在不包含所有颜色的点的前提下,选择的点数最多是多少。(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算做包含所有颜色)
输入
包含多组测试数据,第一行输入一个正整数 T 表示测试数据组数。
输出
对于每组数据在一行内输出一个非负整数 ans,表示答案
样例输入
1
10 3
1 2 3
2 1 1
2 4 2
3 5 3
4 4 2
5 1 2
6 3 1
6 7 1
7 2 3
9 4 2
样例输出
5
题解
STL-set+树状数组
(选择上面和下面的情况相同,不妨设只能选择上面来分析)
考虑:不包含所有颜色,就是存在某一种颜色没有被包含。
因此我们枚举某一种颜色,由于矩形越大越好,因此求的就是不包含该颜色的所有极大矩形。
我们把所有点按照纵坐标从大到小排序,然后对于某一个点,如果选出以其为下边界的矩形,它左边界的范围就是它的横坐标的前驱,右边界的范围就是后继(这两个便捷范围取不到)
我们使用set维护横坐标的前驱后继即可得到所有的极大矩形。然后要求的就是矩形包含的点的面积。注意到这里按照纵坐标排了序,因此直接使用离散化+树状数组求横坐标在某范围内的点的个数即可。
注意纵坐标相同的要先计算再插入。
还有一种情况:线段纵坐标没有限制(矩形卡在两个横坐标相邻的同种点之间),在set中计算一遍即可。
对于线段下面的情况同理。
时间复杂度$O(n\log n)$
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
set<int> s[N];
struct data
{
int x , y , z;
bool operator<(const data &a)const {return y < a.y;}
}a[N];
int n , m , v[N] , f[N] , ans;
inline void add(int x)
{
int i;
for(i = x ; i <= n ; i += i & -i) f[i] ++ ;
}
inline int query(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i) ans += f[i];
return ans;
}
void solve()
{
int i , j , k;
set<int>::iterator it;
memset(f , 0 , sizeof(f));
for(i = 1 ; i <= m ; i ++ ) s[i].clear() , s[i].insert(0) , s[i].insert(n + 1);
for(i = j = 1 ; i <= n ; i = j)
{
while(j <= n && a[j].y == a[i].y) j ++ ;
for(k = i ; k < j ; k ++ ) ans = max(ans , query(*s[a[k].z].lower_bound(a[k].x) - 1) - query(*--s[a[k].z].upper_bound(a[k].x)));
for(k = i ; k < j ; k ++ ) add(a[k].x) , s[a[k].z].insert(a[k].x);
}
for(i = 1 ; i <= m ; i ++ )
for(it = s[i].begin() ; *it != n + 1 ; )
j = *it , ans = max(ans , query(*++it - 1) - query(j));
}
int main()
{
int T , i;
scanf("%d" , &T);
while(T -- )
{
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d%d" , &a[i].x , &a[i].y , &a[i].z) , v[i] = a[i].x;
sort(a + 1 , a + n + 1) , sort(v + 1 , v + n + 1);
for(i = 1 ; i <= n ; i ++ ) a[i].x = lower_bound(v + 1 , v + n + 1 , a[i].x) - v;
ans = 0 , solve();
for(i = 1 ; i <= n >> 1 ; i ++ ) swap(a[i] , a[n - i + 1]);
solve();
printf("%d\n" , ans);
}
return 0;
}
【bzoj4548】小奇的糖果 STL-set+树状数组的更多相关文章
- Bzoj4548 小奇的糖果(链表+树状数组)
题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...
- 【BZOJ4548】小奇的糖果 set(链表)+树状数组
[BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...
- 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组
4548: 小奇的糖果 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 103 Solved: 47[Submit][Status][Discuss] ...
- 【题解】BZOJ4548 小奇的糖果(树状数组)
[题解]BZOJ4548 小奇的糖果(树状数组) 说在前面:我有个同学叫小奇,他有一个朋友叫达达,达达特爱地理和旅游,初中经常AK地理,好怀恋和他已经达达一起到当时初中附近许多楼盘的顶楼逛的时光... ...
- BZOJ4548 小奇的糖果
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【题解】 BZOJ4548 小奇的糖果
本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...
- 求序列A中每个数的左边比它小的数的个数(树状数组)
给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) #include <i ...
- [CSP-S模拟测试]:小P的单调数列(树状数组+DP)
题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...
- BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )
题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...
- bzoj4548: 小奇的糖果 题解
题目链接 题解 不包含所有颜色 就强制不选一个颜色 图中圆点颜色相同 矩形越大,包括的点一定不比其一小部分少 如图所示,最大矩形只有3种 离散化\(x\)坐标 然后按\(y\)排序 每次取出颜色的前驱 ...
随机推荐
- 关于Navicat连接MySQL 报 Authentication plugin 'caching_sha2_password' cannot be loaded
报错原因: 报这个错是因为MySQL8使用了 caching_sha2_password 加密方式而之前MySQL使用的是 mysql_native_password 加密方式,而你的Navicat不 ...
- Java集合类——Set、List、Map、Queue接口
目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定 ...
- CentOS7 minimal 没有netstat命令
在CentOS 7 minimal中使用netstat 时,发现显示如下,明显没有了netstat 命令 [root@localhost ~]# netstat -a -bash: netstat: ...
- mysql中tinyint、smallint、mediumint,int 和bigint 的区别
1:字节的定义:字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位. 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间 2.在mysql中一个汉字占三个 ...
- python读取大文件和普通文件
读取文件,最常见的方式是: with open('filename', 'r', encoding = 'utf-8') as f: for line in f.readlines(): do_som ...
- 阿里云提醒 网站被WebShell木马后门的处理过程
昨晚凌晨收到新客户的安全求助,说是阿里云短信提示,网站有webshell木马文件被植入,我们SINE安全公司立即成立,安全应急响应小组,客户提供了阿里云的账号密码,随即登陆阿里云进去查看到详情,登陆云 ...
- ffplay使用笔记
ffplay播放yuv文件命令: ffplay -f rawvideo -video_size 1920x1080 a.yuv ffplay播放mp4.h.264.hevc文件命令: ffplay ...
- c++实验3类和对象
实 验 3: part 1:验证 part 2:graph #include <iostream> #include "graph.h" using namespac ...
- javascript 自定义发布与订阅
//声明一个类,与普通的类的声明不一样, function Girl() { //将类的事件声明成一个私有的属性,里面是一个对象 this._events = {} } /* { "失恋&q ...
- Datetime与Datetime2的区别
Datetime: 时间格式,对应于数据库中的DateTime类型,对应于.NET里面的System. DateTime类型.DateTime支持日期从1753年1月1日到9999年12 ...