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

    Given an integer m in base B (2 ≤ B ≤ 10) (m contains no more than 1000 digits), find the value of t ...

  2. 简单的网络爬虫程序(Web Crawlers)

    程序比较简单,但是能体现基本原理. package com.wxisme.webcrawlers; import java.io.*; import java.net.*; /** * Web Cra ...

  3. MongoDb Mmap引擎分析

    版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/137 来源:腾云阁 https://www.qclo ...

  4. webpack打包jquery并引用

    一,引入webpack插件 //打包第三方 const CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlug ...

  5. rpm方式安装 gitlab centos7

    一.使用RPM安装 - 推荐 官方推荐的下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/ Tips 1 : Centos 7使用el7 ...

  6. 教主泡嫦娥[有趣的dp状态设计]

    P1342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国 ...

  7. WEB安全第一篇--对服务器的致命一击:代码与命令注入

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  8. 分布式数据库主键id生成策略

    分布式数据库部署主要分为两种,一种是读写分离.这个需要弄主从数据库.主要是写的时候写主数据库,读的时候读从数据库.分散读取压力,对于读多写少的系统有利于 提高其性能.还有一种是分布式存储,这种主要是将 ...

  9. pandas将字段中的字符类型转化为时间类型,并设置为索引

    假设目前已经引入了 pandas,同时也拥有 pandas 的 DataFrame 类型数据. import pandas as pd 数据集如下 df.head(3) date open close ...

  10. Tomcat 启动出现警告问题Setting property 'minSpar eThreads' to '25' did not find a matching property

    tomcat启动报错: Jul 19, 2017 3:10:02 PM org.apache.catalina.startup.SetAllPropertiesRule beginWARNING: [ ...