3658: Jabberwocky

Time Limit: 20 Sec  Memory Limit: 1024 MB
Submit: 263  Solved: 107
[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

将问题简化:

假设线段只有可能在在坐标系的最下面or最上面,并且每个x坐标都不同

那么只要用双向链表O(n)模拟一下就好了,所有坐标点按x大小排序,第p个节点就是从小到大第p个坐标

每个节点p记录一个p.pre和p.next,分别表示在左边or右边颜色相同且离得最近的节点id,

答案就是max(max(p.next-1-p, p-1-p.pre))  (1<=p<=n),也就是两个相邻的相同颜色节点之间距离的最大值

如果存在x坐标相同的点

要先将x坐标离散化,并且上面的那个式子就会有问题,因为x坐标相同的点只有可能同时取或同时不取

这样就不能直接求p.next和p的间隔了,而是找到x坐标刚好小于p.next点以及x坐标刚好大于p点的两点之间有多少个点,求这个的最大值,因为离散化过了,这个很好处理

p和p.pre之间同理

显然这题线段没有限制,不一定在最下面or最上面

那样的话我们需要按y坐标从小到大排序(如果相同再按x排序)

求出来上面的东西之后再从下到上扫描,逐个删点,每删一个点求一次最大值

因为是双向链表,所以删点是O(1)的,并且只有这段变大的区间会影响答案

不过因为中间有些点已经消失了,所以不能直接通过相减求间隔,要用树状数组保存哪些还没有被删

别忘了还要从上往下再来一次

总复杂度O(n)+O(2nlogn)=O(nlogn)

注意这题有个坑,假设有k种颜色但是下面出现的不同颜色数量都不到k个,那么答案就是n(也就是所有点全部选中)还有bzoj3658这题的数据比较强,虽然是一模一样的题,但一开始我4548AC了,3658WA,不是long long的问题

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct
{LL pre;LL nxt;
}Line;
Line h[100005];
typedef struct Res
{LL x, y;LL id;LL col;bool operator < (const Res &b) const{if(id<b.id)return 1;return 0;}
}Res;
Res s[100005];
LL cnt, Hash[100005], tre[100005], temp[100005], y[100005], col[100005];
bool compx(Res a, Res b)
{if(a.x<b.x)return 1;return 0;
}
bool compy(Res a, Res b)
{if(a.y<b.y || a.y==b.y && a.x<b.x)return 1;return 0;
}
void Update(LL x, LL val)
{while(x<=cnt){tre[x] += val;x += x&-x;}
}
LL Query(LL x)
{LL sum = 0;while(x){sum += tre[x];x -= x&-x;}return sum;
}
int main(void)
{LL T, i, n, m, ans;scanf("%lld", &T);while(T--){cnt = 0;scanf("%lld%lld", &n, &m);memset(col, 0, sizeof(col));for(i=1;i<=n;i++){scanf("%lld%lld%lld", &s[i].x, &s[i].y, &s[i].col);s[i].id = i;Hash[++cnt] = s[i].x;col[s[i].col] = 1;}for(i=1;i<=m;i++){if(col[i]==0)break;}if(i<=m){printf("%lld\n", n);continue;}sort(Hash+1, Hash+cnt+1);cnt = unique(Hash+1, Hash+cnt+1)-(Hash+1);s[n+1].x = cnt+1;for(i=1;i<=n;i++)s[i].x = lower_bound(Hash+1, Hash+cnt+1, s[i].x)-Hash;ans = 0;sort(s+1, s+n+1, compx);memset(temp, 0, sizeof(temp));for(i=1;i<=n;i++){Update(s[i].x, 1);h[i].pre = temp[s[i].col];s[i].id = i;temp[s[i].col] = i;ans = max(ans, Query(s[i].x-1)-Query(s[h[i].pre].x));}for(i=1;i<=n;i++)temp[i] = n+1;for(i=n;i>=1;i--){h[i].nxt = temp[s[i].col];temp[s[i].col] = i;ans = max(ans, Query(s[h[i].nxt].x-1)-Query(s[i].x));}sort(s+1, s+n+1, compy);for(i=1;i<=n;i++)y[i] = s[i].id;sort(s+1, s+n+1);for(i=1;i<=n;i++){Update(s[y[i]].x, -1);ans = max(ans, Query(s[h[y[i]].nxt].x-1)-Query(s[h[y[i]].pre].x));h[h[y[i]].nxt].pre = h[y[i]].pre;h[h[y[i]].pre].nxt = h[y[i]].nxt;}sort(s+1, s+n+1, compx);memset(temp, 0, sizeof(temp));for(i=1;i<=n;i++){Update(s[i].x, 1);h[i].pre = temp[s[i].col];s[i].id = i;temp[s[i].col] = i;ans = max(ans, Query(s[i].x-1)-Query(s[h[i].pre].x));}for(i=1;i<=n;i++)temp[i] = n+1;for(i=n;i>=1;i--){h[i].nxt = temp[s[i].col];temp[s[i].col] = i;ans = max(ans, Query(s[h[i].nxt].x-1)-Query(s[i].x));}sort(s+1, s+n+1, compy);for(i=1;i<=n;i++)y[i] = s[i].id;sort(s+1, s+n+1);for(i=n;i>=1;i--){Update(s[y[i]].x, -1);ans = max(ans, Query(s[h[y[i]].nxt].x-1)-Query(s[h[y[i]].pre].x));h[h[y[i]].nxt].pre = h[y[i]].pre;h[h[y[i]].pre].nxt = h[y[i]].nxt;}printf("%lld\n", ans);}return 0;
}

bzoj 4548: 小奇的糖果 bzoj 3658: Jabberwocky(双向链表+树状数组)相关推荐

  1. [乱搞 树状数组] BZOJ 4548 小奇的糖果 BZOJ 3658 Jabberwocky

    跟悬线法有点像 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...

  2. Bzoj 4548: 小奇的糖果(双向链表+排序+树状数组)

    以下内容来自ShallWe's Blog 题目 4548: 小奇的糖果 Description 有\(N\)个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能 ...

  3. 【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**

    1062: [NOI2008]糖果雨 Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成 的.更加神奇的是 ...

  4. BZOJ 3132 上帝造题的七分钟(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3132 题意:给出一个矩阵,两种操作:(1)将某个子矩阵的数字统一加上某个值:(2)查询某 ...

  5. [BZOJ 2434][Noi2011]阿狸的打字机(AC自动机+树状数组+dfs序)

    Description 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: ·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母 ...

  6. bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2051  Solved: 1041 [Submit] ...

  7. 【BZOJ1062】[NOI2008]糖果雨【二维树状数组】

    [题目链接] 神题. [别人的题解] /* Pigonometry */ #include <cstdio> #include <algorithm>using namespa ...

  8. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  9. 【BZOJ4548】小奇的糖果

    →原题传送门←(by Hzwer) 「题目背景」 小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想. 「问题描述」 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或 ...

最新文章

  1. MySQL的编译安装
  2. python贪婪匹配顺序_Python正则表达式:贪婪模式返回多个空匹配
  3. 操作系统之进程管理:20、死锁的检测和解除
  4. 今天遇到了一个很坑爹的问题....
  5. mysql在同一台机器上实现主从_MySQL 5.7主从搭建(同一台机器)
  6. 如何自建微信外卖平台_外卖平台高抽成的背后,看小程序如何玩转餐饮外卖?...
  7. java word转图片tiff_Word 2010中将文档保存为TIFF图片的方法
  8. JavaScript学习(四十七)—构造方法创建对象的不足
  9. 【UML】——为什么要使用UML
  10. mysql如果空显示_mysql按照自己定义的值显示如果为空的就显示0
  11. 使用GoKart对Go代码进行静态安全分析
  12. 网页设计html流水效果图,15例简单常用网页设计效果代码
  13. OA办公管理系统的功能有什么特点
  14. 戴尔微型计算机7060,戴尔 Dell OptiPlex 7060 微型机 :1 升的迷你小钢炮
  15. 分配销售组织 - 分销渠道 - 工厂
  16. 执行Jar包报错FileNotFoundException: /home/data/t.txt (Too many open files)以及Cannot run program “/bin/bash
  17. 计算机图形学实验体会,计算机图形学实验报告.doc
  18. java ligerui_[Java教程]ligerUI
  19. Combo用户板中XG-PON资源利用率的提升方案
  20. CSS基础知识汇总{主要内容: CSS语法结构,类选择器,后代选择器,交集选择器等}

热门文章

  1. python自动化办公教程-Python自动化办公之操作Excel文件
  2. 谷歌开放语音识别 API,发力人工智能
  3. 查看python安装的库_查看python及其第三方库的版本和安装位置
  4. 后台系统-新增和编辑共用一个弹框(基于vue和element-ui)
  5. 笔记本重新启动计算机,为什么笔记本电脑突然重新启动_计算机的基本知识_IT /计算机_信息...
  6. mysql nb3 备份_Navicat mysql 数据库备份和使用,备份以后是nb3文件-Go语言中文社区...
  7. 蓝桥杯1427: -买不到的数目(百钱百鸡问题变体)
  8. VC2010 编译 Media Player Classic - BE (mpc-be)
  9. linux下 db2日志满了,DB2事务日志已满的解决方法
  10. Helm 3 完整教程(十六):Helm 函数讲解(10)版本语义化函数、URL函数、UUID函数