小奇的糖果(candy)
【题目背景】
小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想。
【问题描述】
有 N 个彩色糖果在平面上。 小奇想在平面上取一条水平的线段,并拾起它上方或
下方的所有糖果。求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的
颜色。
【输入格式】
包含多组测试数据,第一行输入一个正整数 T 表示测试数据组数。
接下来 T 组测试数据,对于每组测试数据,第一行输入两个正整数 N、K,分别表
示点数和颜色数。
接下来 N 行,每行描述一个点,前两个数 x, y (|x|, |y| ≤ 2^30 - 1) 描述点
的位置,最后一个数 z (1 ≤ z ≤ k) 描述点的颜色。
【输出格式】
对于每组数据在一行内输出一个非负整数 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
【数据范围】
对于 30% 的数据,N ≤ 100;
对于 60% 的数据,N ≤ 5000;
对于 100% 的数据,N ≤ 100000,K ≤ 100000,T ≤ 3
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
using namespace std;
typedef long long LL;
const int maxn=;
int T,ANS,N,K;
int last[maxn],l[maxn],r[maxn];
int disc[maxn],x[maxn],b[maxn];
struct Candy{
int x,y,k;
int id;
}a[maxn];
inline int cmpbyy(const Candy & w,const Candy & e){//´Óϵ½ÉÏ ´Ó×óµ½ÓÒ
return w.y<e.y||(w.y==e.y&&w.x<e.x);
}
inline int cmpbyx(const Candy & w,const Candy & e){//´Ó×óµ½ÓÒ ´Óϵ½ÉÏ
return w.x<e.x||(w.x==e.x&&w.y>e.y);
}
struct Tree{
int l,r,sum;
}tr[maxn*];
inline void Build(int rt,int l,int r){
tr[rt].l=l; tr[rt].r=r;
if(l==r){
tr[rt].sum=b[l];
return ;
}
int mid=(l+r)>>;
Build(rt<<,l,mid); Build(rt<<|,mid+,r);
tr[rt].sum=tr[rt<<].sum+tr[rt<<|].sum;
}
inline void change(int rt,int pos,int delta){
if(tr[rt].l==tr[rt].r){
tr[rt].sum+=delta;
return ;
}
int mid=(tr[rt].l+tr[rt].r)>>;
if(pos<=mid) change(rt<<,pos,delta);
else change(rt<<|,pos,delta);
tr[rt].sum=tr[rt<<].sum+tr[rt<<|].sum;
}
inline int query(int rt,int l,int r){
if(l<=tr[rt].l&&tr[rt].r<=r){
return tr[rt].sum;
}
int mid=(tr[rt].l+tr[rt].r)>>;
int ans=;
if(l<=mid) ans+=query(rt<<,l,r);
if(mid+<=r) ans+=query(rt<<|,l,r);
return ans;
}
inline void update(int l,int r){
if(l>r) return ;
ANS=max(ANS,query(,l,r));
}
inline void work(){
x[]=; x[N+]=N+;
memset(last,,sizeof(last)); memset(b,,sizeof(b));
for(int i=;i<=;i++) tr[i].l=tr[i].r=tr[i].sum=; sort(a+,a+N+,cmpbyx);
for(int i=;i<=N;i++) b[x[i]]++;
Build(,,N+);
for(int i=;i<=N;i++){
int tmp=a[i].id,L=last[a[i].k];
l[tmp]=L; r[tmp]=N+;
if(L) r[L]=tmp;
update(x[L]+,x[tmp]-);
last[a[i].k]=tmp;
}
for(int i=;i<=K;i++){
update(x[last[i]]+,N+);
}
sort(a+,a+N+,cmpbyy);
for(int i=,j=;i<=N;i++){
int tmp=a[i].id;
while(j<=N&&a[j].y==a[i].y){
change(,a[j].x,-);
j++;
}
l[r[tmp]]=l[tmp]; r[l[tmp]]=r[tmp];
update(x[l[tmp]]+,x[r[tmp]]-);
}
}
int main(){
// freopen("candy.in","r",stdin);
// freopen("candy.out","w",stdout);
scanf("%d",&T);
while(T--){
ANS=;
scanf("%d%d",&N,&K);
for(int i=;i<=N;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].k);
a[i].id=i;
}
for(int i=;i<=N;i++){
disc[i]=a[i].x;
}
sort(disc+,disc+N+);
int *end=unique(disc+,disc+N+);
for(int i=;i<=N;i++){
a[i].x=lower_bound(disc+,end,a[i].x)-disc;
x[i]=a[i].x;
}
work();
for(int i=;i<=N;i++) a[i].y*=-;
work();
printf("%d\n",ANS);
}
return ;
}
小奇的糖果(candy)的更多相关文章
- 【BZOJ4548】小奇的糖果
→原题传送门←(by Hzwer) 「题目背景」 小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想. 「问题描述」 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或 ...
- 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组
4548: 小奇的糖果 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 103 Solved: 47[Submit][Status][Discuss] ...
- 【BZOJ4548】小奇的糖果 set(链表)+树状数组
[BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...
- 【题解】BZOJ4548 小奇的糖果(树状数组)
[题解]BZOJ4548 小奇的糖果(树状数组) 说在前面:我有个同学叫小奇,他有一个朋友叫达达,达达特爱地理和旅游,初中经常AK地理,好怀恋和他已经达达一起到当时初中附近许多楼盘的顶楼逛的时光... ...
- BZOJ 4548 小奇的糖果
Description 有 \(N\) 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的颜色. Input 包含 ...
- BZOJ4548 小奇的糖果
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- Bzoj4548 小奇的糖果(链表+树状数组)
题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...
- 【题解】 BZOJ4548 小奇的糖果
本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...
- 【bzoj4548】小奇的糖果 STL-set+树状数组
题目描述 平面上有n个点,每个点有一种颜色.对于某一条线段,选择所有其上方或下方的点.求:在不包含所有颜色的点的前提下,选择的点数最多是多少.(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算 ...
随机推荐
- LeetCode——Reverse Linked List
反转链表,用了一个比较笨的方法. public class Solution { public ListNode reverseList(ListNode head) { if(head == nul ...
- 经验之道:最有效的iOS内存泄漏检测
版权声明:本文由胡涛原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/125 来源:腾云阁 https://www.qclou ...
- 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断——按键中断实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http: ...
- EUI组件之ProgressBar
一.ProgressBar常规使用 拖动一个progressbar到exml 代码中使用 /** * 主页场景 * @author chenkai 2018/5/26 */ class HomeSce ...
- iOS 根据经纬度计算与地理北极夹角
http://www.aiuxian.com/article/p-2767848.html #define toDeg(X) (X*180.0/M_PI) /** * @method 根据两点经纬度 ...
- spring低版本报错:java.lang.IllegalStateException: Context namespace element ‘annotation-config’ and its parser class [*] are only available on
参考来源:http://blog.csdn.net/sunxiaoyu94/article/details/50492083 使用spring低版本(2.5.6),使用jre 8发现错误: Unexp ...
- redis数据持久化(快照/日志):
1.RDB快照的配置选项: save // 900内,有1条写入,则产生快照 save // 如果300秒内有1000次写入,则产生快照 save // 如果60秒内有10000次写入,则产生快照 ( ...
- oneThink发生错误,获取当前执行的SQL语句!
echo D('AnswerInfoView')->getLastSql();die();
- 【转载】国外程序员整理的Java资源大全
以下转载自: 推荐!国外程序员整理的Java资源大全中文版 https://github.com/akullpp/awesome-java英文版 Java 几乎是许多程序员们的入门语言,并且也是 ...
- mongodb基础应用
一些概念 一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(bin ...