【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\)排序 每次取出颜色的前驱 ...
随机推荐
- python字符串常用内建函数总结
自己总结一些常用字符串函数,理解比较粗糙 1.字符串内建函数-大小写转换函数 (1)str.capitalize Help on method_descriptor: capitalize(...) ...
- chrome浏览器中 F12 功能的简单介绍
chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...
- python中的"is"与"=="比较
在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过: ...
- C#中给WebClient添加代理Proxy
效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- CRC校验8
什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并 ...
- python -pickle模块、re模块学习
pickel模块 import pickle #pickle可以将任何数据类型序列化,json只能列表字典字符串数字等简单的数据类型,复杂的不可以 #但是pickle只能在python中使用,json ...
- ruby 数据类型String
一.字符串创建 单引号包含,不支持转义符和内嵌表达式#{}(插值符) str = 'hello world!' 双引号包含 str = "hello world!" 使用%,%Q, ...
- windows程序内部运行机制
Windows程序内部运行机制 2007-10-21 19:52 1010人阅读 评论(0) 收藏 举报 windowsvc++applicationcallbackwinapistructure W ...
- C++11中std::bind的使用
std::bind: Each argument may either be bound to a value or be a placeholder: (1).If bound to a value ...
- 用intellij Idea加载eclipse的maven项目全流程
eclipse的maven项目目录 全流程 加载项目 打开intellij Idea file -> new -> module from existing Sources 选择.pom ...