小奇的糖果(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个点,每个点有一种颜色.对于某一条线段,选择所有其上方或下方的点.求:在不包含所有颜色的点的前提下,选择的点数最多是多少.(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算 ...
随机推荐
- DGbroker故障切换示例
1.主库故障 SQL> startup ORACLE instance started. Total System Global Area bytes Fixed Size bytes Vari ...
- 豆瓣api开发
前面有说过豆瓣API的开发,在做一些开源项目的时候,很多时候会用到豆瓣API接口,拿过来做测试,现在只是对豆瓣API开发做一些简单的梳理: 豆瓣API开发的接口: https://developers ...
- FZU 2105 Digits Count
Problem 2105 Digits Count Accept: 444 Submit: 2139 Time Limit: 10000 mSec Memory Limit : 2621 ...
- poj3974 Palindrome【回文】【Hash】【二分】
Palindrome Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 13157 Accepted: 5028 Desc ...
- Eclipse Tomcat插件的配置, 及 Tomcat 的配置
Eclipse Tomcat插件的配置, 及 Tomcat 的配置 首先下载 对应 eclipse 版本的 tomcat 插件版本,(这里要注意: Tomcat 插件是Tomcat 插件,Tomc ...
- UA-* headers
HTTP The Definitive Guide Request headers are headers that make sense only in a request message. The ...
- 7.1 - CRM系统
一.简介 crm 客户关系管理软件 ( Customer Relationship Management ) ( 详细内容 ) stark组件(仿admin组件)( 详细内容 ) rbac组件(基于角 ...
- android中的验证码倒计时
1.如图所示,要实现一个验证码的倒计时的效果 2.实现 图中获取验证码那块是一个button按钮 关键部分,声明一个TimeCount,继承自C ...
- SQL Server查看库、表占用空间大小
转自:https://blog.csdn.net/yenange/article/details/50493580 查询数据文件与日志文件占用情况,查看数据大小,查看库大小 1. 查看数据文件占用(权 ...
- orcle中如何使用动态游标来对变量进行赋值
在oracle中动态游标的概念一般不常用,但有时根据客户的特殊业务,需要使用到动态游标来解决问题!在对于一条动态SQL语句而产生多条记录时,动态游标的使用将是一个很好的选择,具体参见如下在工作流项目中 ...