【题目背景】
小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想。
【问题描述】
有 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)的更多相关文章

  1. 【BZOJ4548】小奇的糖果

    →原题传送门←(by Hzwer) 「题目背景」 小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想. 「问题描述」 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或 ...

  2. 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组

    4548: 小奇的糖果 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 103  Solved: 47[Submit][Status][Discuss] ...

  3. 【BZOJ4548】小奇的糖果 set(链表)+树状数组

    [BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...

  4. 【题解】BZOJ4548 小奇的糖果(树状数组)

    [题解]BZOJ4548 小奇的糖果(树状数组) 说在前面:我有个同学叫小奇,他有一个朋友叫达达,达达特爱地理和旅游,初中经常AK地理,好怀恋和他已经达达一起到当时初中附近许多楼盘的顶楼逛的时光... ...

  5. BZOJ 4548 小奇的糖果

    Description 有 \(N\) 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的颜色. Input 包含 ...

  6. BZOJ4548 小奇的糖果

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  7. Bzoj4548 小奇的糖果(链表+树状数组)

    题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...

  8. 【题解】 BZOJ4548 小奇的糖果

    本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...

  9. 【bzoj4548】小奇的糖果 STL-set+树状数组

    题目描述 平面上有n个点,每个点有一种颜色.对于某一条线段,选择所有其上方或下方的点.求:在不包含所有颜色的点的前提下,选择的点数最多是多少.(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算 ...

随机推荐

  1. LeetCode——Reverse Linked List

    反转链表,用了一个比较笨的方法. public class Solution { public ListNode reverseList(ListNode head) { if(head == nul ...

  2. 经验之道:最有效的iOS内存泄漏检测

    版权声明:本文由胡涛原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/125 来源:腾云阁 https://www.qclou ...

  3. 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断——按键中断实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http: ...

  4. EUI组件之ProgressBar

    一.ProgressBar常规使用 拖动一个progressbar到exml 代码中使用 /** * 主页场景 * @author chenkai 2018/5/26 */ class HomeSce ...

  5. iOS 根据经纬度计算与地理北极夹角

    http://www.aiuxian.com/article/p-2767848.html #define toDeg(X) (X*180.0/M_PI) /**  * @method 根据两点经纬度 ...

  6. 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 ...

  7. redis数据持久化(快照/日志):

    1.RDB快照的配置选项: save // 900内,有1条写入,则产生快照 save // 如果300秒内有1000次写入,则产生快照 save // 如果60秒内有10000次写入,则产生快照 ( ...

  8. oneThink发生错误,获取当前执行的SQL语句!

    echo D('AnswerInfoView')->getLastSql();die();

  9. 【转载】国外程序员整理的Java资源大全

    以下转载自: 推荐!国外程序员整理的Java资源大全中文版    https://github.com/akullpp/awesome-java英文版 Java 几乎是许多程序员们的入门语言,并且也是 ...

  10. mongodb基础应用

    一些概念 一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(bin ...