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

    Description: Implement int sqrt(int x). Compute and return the square root of x. 好好学习数学还是非常有用的,牛顿迭代法 ...

  2. 在MacOS上搭建Vulhub漏洞平台环境

    一.安装python3和docker brew install python3 brew cask install docker sudo pip3 install docker-compose 二. ...

  3. ShowDoc 搭建 (未成功....)

    官方教程:https://www.showdoc.cc/help?page_id=13732 下载了showdoc,服务器映射本地磁盘的时候,服务器用户名和密码忘了... 远程服务器用户名和密码修改 ...

  4. 【BZOJ2554】Color 概率神题

    [BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...

  5. HTML5+CSS3 表格设计(Table)

    <style> body { width: 600px; margin: 40px auto; font-family: 'trebuchet MS', 'Lucida sans', Ar ...

  6. AndroidStudio build.gradle 报错

    Android Studio. I'm getting this kind of error during application run. Error:Execution failed for ta ...

  7. 【Android】Android--Dialog

    前言 对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮助.本篇博客就讲解一下Android下对话框的使用,在本篇博 ...

  8. Linux--vim编辑器和文件恢复

    第五章  Vim编辑器和恢复ext4下误删除的文件-Xmanager工具 本节所讲内容: 5.1  vim的使用 5.2  实战:恢复ext4文件系统下误删除的文件 5.3  实战:使用xmanage ...

  9. Hibernate的状态,缓存和映射

    Hibernate的状态,缓存和映射 1.对象的状态 1.1.对象状态的概念和分类 在使用Hibernate操作数据库的时候,我们先创建了JavaBean对象,然后使用session来保存或者更新到数 ...

  10. Grafana+Prometheus监控

    添加模板一定要看说明以及依赖 监控redis https://blog.52itstyle.com/archives/2049/ http://www.cnblogs.com/sfnz/p/65669 ...