4548: 小奇的糖果

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit:
103  Solved: 47
[Submit][Status][Discuss]

Description

有 N 个彩色糖果在平面上。小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果。求出最多能够拾

起多少糖果,使得获得的糖果并不包含所有的颜色。

Input

包含多组测试数据,第一行输入一个正整数 T 表示测试数据组数。

接下来 T 组测试数据,对于每组测试数据,第一行输入两个正整数 N、K,分别表示点数和颜色数。
接下来 N 行,每行描述一个点,前两个数 x, y (|x|, |y| ≤ 2^30 - 1) 描述点的位置,最后一个数 z (1 ≤ z
 k) 描述点的颜色。
对于 100% 的数据,N ≤ 100000,K ≤ 100000,T ≤ 3

Output

对于每组数据在一行内输出一个非负整数 ans,表示答案

Sample Input

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

Sample Output

5

HINT

Source

By Hzwer

3658: Jabberwocky

Time Limit: 20 Sec  Memory Limit: 1024 MB
Submit:
178  Solved: 73
[Submit][Status][Discuss]

Description

平面上有n个点,每个点有k种颜色中的一个。
你可以选择一条水平的线段获得在其上方或其下方的所有点,如图所示:

请求出你最多能够得到多少点,使得获得的点并不包含所有的颜色。

Input

包含多组测试数据,第一行输入一个数T表示测试数据组数。
   
接下来T组测试数据,对于每组测试数据,第一行输入两个数n,k,分别表示点的个数和颜色数。
   
接下来n行每行描述一个点,前两个数z,y(lxl,lyl≤2^32-1)描述点的位置,最后一个数z(1≤z≤K)描述点的颜色。

Output

对于每组数据输出一行,每行一个数ans,表示答案。

Sample Input

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

Sample Output

5

HINT

N<=100000,K<=100000,T<=3

Source

Solution

思路比较好的题,本来以为可以转化成某种扫描线,但是无果

首先,按y坐标排序,我们假定这条线无限低,这时候答案相当于相邻两个同种颜色的中间的最大点数

然后这条线向上,一次性删除一行

用双向链表维护一个点的前一个和后一个同种颜色的位置

删除的话,把这个点从树状数组和链表中都删除,每次删除,统计一下这个点之前相邻的和之后相邻的答案

然后把y全都赋成相反数,再做一遍即可得到下端的情况

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 1000010
int T,N,K,ans;
struct PointNode{int x,y,c,id;}P[MAXN];
int ls[MAXN],tp,top;
struct lkList{int last,nxt,now;}lk[MAXN];
int C[MAXN];
struct BIT
{
int tree[MAXN];
void Init() {memset(tree,,sizeof(tree));}
int lowbit(int x) {return x&(-x);}
void Add(int pos,int D)
{
for (int i=pos; i<=top+; i+=lowbit(i))
tree[i]+=D;
}
int Query(int pos)
{
int re=;
for (int i=pos; i; i-=lowbit(i))
re+=tree[i];
return re;
}
int Query(int L,int R) {if (R<L) return ; else return Query(R)-Query(L-);}
}bit;
bool cmpY(PointNode A,PointNode B) {return A.y<B.y;}
bool cmpX(PointNode A,PointNode B) {return A.x<B.x;}
void Solve()
{
bit.Init();
memset(C,,sizeof(C));
sort(P+,P+N+,cmpX); lk[N+].now=top+;
for (int i=; i<=N; i++) bit.Add(P[i].x,);
for (int i=; i<=N; i++)
{
P[i].id=i;
lk[i].last=C[ P[i].c ]; lk[i].nxt=N+; lk[i].now=P[i].x;
if (C[ P[i].c ]) lk[ C[ P[i].c ] ].nxt=i;
C[ P[i].c ]=i;
ans=max(ans,bit.Query(P[ lk[i].last ].x+,P[i].x-));
}
// printf("Ans1=%d\n",ans);
sort(P+,P+N+,cmpY);
for (int i=; i<=K; i++)
ans=max(ans,bit.Query(lk[ C[i] ].now+,top+));
// printf("Ans2=%d\n",ans);
for (int t=,i=; i<=N; i++)
{
int now=P[i].id;
while (t<=N && P[t].y==P[i].y)
bit.Add(P[t].x,-),t++;
if (lk[now].nxt) lk[ lk[now].nxt ].last=lk[now].last;
if (lk[now].last) lk[ lk[now].last ].nxt=lk[now].nxt;
ans=max(ans,bit.Query(lk[ lk[now].last ].now+,lk[ lk[now].nxt ].now-));
lk[now].nxt=lk[now].last=;
}
// printf("Ans3=%d\n",ans);
}
int main()
{
T=read();
while (T--)
{
N=read(),K=read();
ans=;
for (int i=; i<=N; i++)
ls[++tp]=P[i].x=read(),P[i].y=read(),P[i].c=read(),P[i].id=i;
sort(ls+,ls+tp+);
top=unique(ls+,ls+tp+)-ls-;
for (int i=; i<=N; i++) P[i].x=lower_bound(ls+,ls+top+,P[i].x)-ls;
//for (int i=1; i<=N; i++) printf("x=%d\n",P[i].x);
Solve();
for (int i=; i<=N; i++) P[i].y=-P[i].y;
Solve();
printf("%d\n",ans);
}
return ;
}

【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组的更多相关文章

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

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

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

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

  3. 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)

    3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...

  4. BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )

    假如矩阵范围小一点就可以直接用二维树状数组维护. 这道题,  差分答案, 然后一维排序, 另一维离散化然后树状数组维护就OK了. ----------------------------------- ...

  5. BZOJ 3110 [Zjoi2013]K大数查询 (CDQ分治+树状数组)

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  6. 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)

    [题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...

  7. BZOJ 2738 矩阵乘法(整体二分+二维树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答 ...

  8. 求序列A中每个数的左边比它小的数的个数(树状数组)

    给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) #include <i ...

  9. [CSP-S模拟测试]:小P的单调数列(树状数组+DP)

    题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...

随机推荐

  1. Python的高级特性10:无聊的@property

    @property装饰器其实有点无聊,单独拿出来作为一个知识点其实没必要,尽管它可以将方法变成属性,让get和set方法更好用,但是,它破坏了python的简洁(不是代码的简洁而是指语法上). 下面来 ...

  2. 尝试HTML + JavaScript 编写Windows App

    一直以来博文中使用最多的就是C# + XAML.进入Windows App时代,又多了一对 Javascript + HTML组合,这对于Web开发的程序员来说再熟悉不过了.其实小编也做过几年的Web ...

  3. CodeDom

    细说CodeDom 在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说, ...

  4. TinyFrame升级之八:实现简易插件化开发

    本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...

  5. hdu5444Elven Postman(主席树思想的应用)

    主席树这个概念应该不陌生吧!恩?不会, 戳这里. 主席树(函数式线段树)用的是函数思想,一个节点开数组用来保存自己的左右节点,这样节省许多不必要的空间,还可以保存许多历史状态.而这里我们用的是主席树的 ...

  6. Scala入门之Array

    /** * 大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: * 1,数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储现在比较经典的是使用Hadoop,也有很多情况使用Kaf ...

  7. Tensorflow学习笔记4:分布式Tensorflow

    简介 Tensorflow API提供了Cluster.Server以及Supervisor来支持模型的分布式训练. 关于Tensorflow的分布式训练介绍可以参考Distributed Tenso ...

  8. iostat命令详解

    iostat iostat用于输出CPU和磁盘I/O相关的统计信息. 命令格式: iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ devic ...

  9. CSS 栅格布局

    bootstrap3.0教程之栅格系统原理(布局) http://www.jb51.net/css/152846.html [div+css]栅格化布局样式备用坑 http://www.0773lin ...

  10. BroadcastReceiver之有序广播

    有序广播可以按一定的优先级进行传播 首先进行发送广播 public void click(View v){ Intent intent = new Intent(); intent.setAction ...