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

第N道小奇系列的题目了(之前好像也做过一道小奇的糖果来着,不过那是IOI改编,有点难)
模拟考的时候写了暴力居然没有分(!)
下面是自己写的题解:
- 这是在糖果是撒在二维平面里的,所以我们可以通过其中一维的坐标离散化,然后通过枚举,转成单一一维里的问题。
- 把横坐标离散化掉,按横坐标从左到右,把横坐标相邻的糖果用双向的链表串在一起(对于有不同颜色的序列,这样的操作很常见哦,记下来记下来)。
- 所以每一次在两个相同颜色的糖果之间数一下其它糖果的数量,就可以来更新ans了,可以用树状数组来维护区间里的糖果数量。
- 然后想象一条扫描线,从下到上扫一遍,每一次把扫描线上的点屏蔽掉,再更新一次答案,这样就可以完成对于水平线上糖果的更新了。
- 那水平线下的怎么更新呢?一样的嘛,为了减少编程复杂度,我们把纵坐标取相反数,用一样的办法再做一次就可以了。
代码~
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Re register
#define Pn putchar('\n')
using namespace std;
const int N=1e5+;
int Lc[N],Rc[N],lst[N];
int X[N],sX[N];
struct Point{
int x,y,cl,id;
}pt[N];
int c[N],n,m,x,y,Kx,ans=; inline void read(int &v){
v=; bool fg=;
char c=getchar(); if(c=='-')fg=;
while(c<''||c>''){c=getchar(); if(c=='-')fg=;}
while(c>=''&&c<=''){v=v*+c-'',c=getchar(); if(c=='-')fg=;}
if(fg)v=-v;
}
void write(int x){
if(x>)write(x/);
int xx=x%;
putchar(xx+'');
}
bool cmpX(const Point &a,const Point &b){
return a.x<b.x;
}
bool cmpY(const Point &a,const Point &b){
return a.y<b.y;
} int LB(int x){
return x&(-x);
}
void upD(int k,int dt){
for(Re int i=k;i<=n;i+=LB(i)){
c[i]+=dt;
}
}
int Qry(int k){
int ans=;
for(Re int i=k;i>=;i-=LB(i)){
ans+=c[i];
}
return ans;
} void makeA(int lx,int rx){
if(lx>rx)return;
int tp=Qry(rx)-Qry(lx-);
ans=max(tp,ans);
}
void PickupCandy(){ X[]=; X[n+]=n+;
memset(lst,,sizeof(lst));
memset(c,,sizeof(c)); sort(pt+,pt+n+,cmpX); For(i,,n){
upD(pt[i].x,);
} For(i,,n){
int ID=pt[i].id;
int prC=lst[pt[i].cl];
Lc[ID]=prC; Rc[ID]=n+;
if(prC) Rc[prC]=ID;
makeA(X[prC]+,X[ID]-);
lst[pt[i].cl]=ID;
}
For(i,,Kx){
makeA(X[lst[i]]+,X[n+]);
} sort(pt+,pt+n+,cmpY); int Px=;
For(i,,n){
while(Px<=n&&pt[i].y==pt[Px].y){
upD(X[pt[Px].id],-);
Px++;
}
int ID=pt[i].id;
Lc[Rc[ID]]=Lc[ID]; Rc[Lc[ID]]=Rc[ID];
makeA(X[Lc[ID]]+,X[Rc[ID]]-);
}
return;
} int main(){
//freopen("candy.in","r",stdin);
//freopen("candy.out","w",stdout);
int T; read(T);
while(T--){
read(n); read(Kx);
ans=;
For(i,,n){
read(pt[i].x); read(pt[i].y); read(pt[i].cl);
pt[i].id=i;
sX[i]=pt[i].x;
}
sort(sX+,sX+n+);
For(i,,n){
X[i]=lower_bound(sX+,sX+n+,pt[i].x)-sX;
pt[i].x=X[i];
}
PickupCandy();
For(i,,n)pt[i].y*=-;
PickupCandy();
write(ans); Pn;
}
// fclose(stdin); fclose(stdout);
return ;
}
【BZOJ4548】小奇的糖果的更多相关文章
- 【题解】BZOJ4548 小奇的糖果(树状数组)
[题解]BZOJ4548 小奇的糖果(树状数组) 说在前面:我有个同学叫小奇,他有一个朋友叫达达,达达特爱地理和旅游,初中经常AK地理,好怀恋和他已经达达一起到当时初中附近许多楼盘的顶楼逛的时光... ...
- BZOJ4548 小奇的糖果
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- Bzoj4548 小奇的糖果(链表+树状数组)
题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...
- 【题解】 BZOJ4548 小奇的糖果
本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...
- bzoj4548: 小奇的糖果 题解
题目链接 题解 不包含所有颜色 就强制不选一个颜色 图中圆点颜色相同 矩形越大,包括的点一定不比其一小部分少 如图所示,最大矩形只有3种 离散化\(x\)坐标 然后按\(y\)排序 每次取出颜色的前驱 ...
- 【BZOJ4548】小奇的糖果 set(链表)+树状数组
[BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...
- 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组
4548: 小奇的糖果 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 103 Solved: 47[Submit][Status][Discuss] ...
- 小奇的糖果(candy)
[题目背景]小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想.[问题描述]有 N 个彩色糖果在平面上. 小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果 ...
- 【bzoj4548】小奇的糖果 STL-set+树状数组
题目描述 平面上有n个点,每个点有一种颜色.对于某一条线段,选择所有其上方或下方的点.求:在不包含所有颜色的点的前提下,选择的点数最多是多少.(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算 ...
随机推荐
- [Phoenix] 六、MR在Ali-Phoenix上的使用
摘要: 在云HBASE上利用MR BULKLOAD入库PHOENIX表或通过MR构建PHOENIX索引表. 一.MR在Phoenix上的用途 利用MR对Phoenix表(可带有二级索引表)进行Bulk ...
- HDOJ 4704 Sum 规律 欧拉定理
规律 欧拉定理: 找规律 2^n-1 ,n 非常大用欧拉定理 Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13 ...
- Django学习之站点缓存详解
本文和大家分享的主要是django缓存中站点缓存相关内容,一起来看看吧,希望对大家学习django有所帮助. 缓存整个站点,是最简单的缓存方法 在 MIDDLEWARE_CLASSES 中加入 “ ...
- POJ 1611 The Suspects (并查集+数组记录子孙个数 )
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 24134 Accepted: 11787 De ...
- hadoop内存分配方案
Configuration File Configuration Setting Value Calculation 8G VM (4G For MR) yarn-site.x ...
- java版的下雪,大家圣诞快乐
1. [代码][Java]代码 package com.yk.tools.game; import java.applet.AudioClip;import java.awt.Dimension ...
- SQL server 备份/恢复/压缩 进度查询
第一步,用 sp_who2 查出备份的sid(或在窗口中的连接属性中看) exec sp_who2 第二步,用以下查询获得运行情况(看 percent_complete列) SELECT sessio ...
- bzoj1556 (DP)
bzoj 1556 点这里打开题目 题目是求 a^2 求和: 原问题可以转化为:两个人在玩这个东西,问这两个人弄出来的序列相同的有多少种情况,操作方式不同即为一种不同的情况. 就这个问题,参考大佬的D ...
- JAVA基础细谈
JAVA基础细谈 一. 源文件和编译后的类文件 源文件的本质就是程序文件,是程序员编写,是人看的.而编译后的类文件是给电脑看的文件.一个类就是一个文件,无论这个类写在哪里,编译以后都是一个文件 ...
- H3C-路由器密码恢复
路由器密码恢复: 1.先关闭电源,重新启动路由器,注意终端上显示 press CTRL+B to enter extended boot menu 的时候,我们迅速按下ctrl+B,这样将进入扩展启动 ...