题意

平面上有n个点,每个点有k种颜色中的一个。你可以选择一条水平的线段获得在其上方或其下方的所有点,请求出你最多能够得到多少点,使得获得的点并不包含所有的颜色。

分析

线段可以向上向下,那么我们只考虑向上,最后y坐标取反再做一遍即可.

由于不包含所有颜色,那么对于两个颜色相同的点(x0,y0),(x1,y1)(x_0,y_0),(x_1,y_1)(x0​,y0​),(x1​,y1​),如果在x∈[a+1,c−1]x\in [a+1,c-1]x∈[a+1,c−1]范围内没有与它们颜色相同的点,那么一定可以选在这个范围里面的所有点.所以我们用树状数组维护在某个范围内的点数(先离散化),用双向链表维护某个点前面和后面跟它颜色相同且最近的点.最初线段在−∞-\infty−∞,然后从下到上移动线段,逐行删点,删的同时统计[pre+1,nxt−1][pre+1,nxt-1][pre+1,nxt−1]内的点数更新答案.

CODE

#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
template<class T>inline void read(T &res) {
char ch; int flg = 1; for(;!isdigit(ch=getchar());)if(ch=='-')flg=-flg;
for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0'); res*=flg;
}
const int MAXN = 100005;
int n, m, ans;
int last[MAXN], pre[MAXN], nxt[MAXN], T[MAXN], X[MAXN];
struct node { int x, y, c, id; }a[MAXN];
inline bool cmpx(const node &i, const node &j) { return i.x < j.x; }
inline bool cmpy(const node &i, const node &j) { return i.y < j.y; }
inline void upd(int x, int val) {
while(x <= n) T[x] += val, x += x&-x;
}
inline int qsum(int x) {
int res = 0;
while(x) res += T[x], x -= x&-x;
return res;
}
inline void Calc(int l, int r) {
if(l <= r) ans = max(ans, qsum(r)-qsum(l-1));
}
inline void solve() {
memset(last, 0, sizeof last);
memset(T, 0, sizeof T);
for(int i = 1; i <= n; ++i) {
upd(X[a[i].id=i]=a[i].x, 1);
pre[i] = last[a[i].c], nxt[i] = n+1;
if(pre[i]) nxt[pre[i]] = i;
Calc(X[pre[i]]+1, X[i]-1);
last[a[i].c] = i;
}
X[n+1] = n+1;
for(int i = 1; i <= m; ++i) Calc(X[last[i]]+1, X[n+1]-1);
sort(a + 1, a + n + 1, cmpy);
for(int i = 1, j = 1; i <= n; i = j) {
while(j <= n && a[i].y == a[j].y) upd(a[j++].x, -1);
for(int k = i; k < j; ++k) {
int o = a[k].id;
pre[nxt[o]] = pre[o];
nxt[pre[o]] = nxt[o];
Calc(X[pre[o]]+1, X[nxt[o]]-1);
}
}
} int main () {
int T; read(T);
while(T--) {
read(n), read(m); ans = 0;
for(int i = 1; i <= n; ++i)
read(a[i].x), read(a[i].y), read(a[i].c);
sort(a + 1, a + n + 1, cmpx);
int cur = 1;
for(int i = 1; i <= n; ++i) {
a[i].x = cur;
if(a[i].x != a[i+1].x) ++cur;
}
cur = n+1;
solve();
for(int i = 1; i <= n; ++i) a[i].y *= -1;
sort(a + 1, a + n + 1, cmpx);
solve();
printf("%d\n", ans);
}
}

BZOJ 3658: Jabberwocky (双向链表+BIT)的更多相关文章

  1. 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组

    4548: 小奇的糖果 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 103  Solved: 47[Submit][Status][Discuss] ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表)

    [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表) 题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段 ...

  4. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  5. bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1003  Solved: 317[Submit][ ...

  6. BZOJ 1588: [HNOI2002]营业额统计 双向链表

    BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 ht ...

  7. bzoj 1150&2151&2288(双向链表+堆)(贪心)

    经典模型:在n个点中选k个点,要求两两不相邻,且总权值最大/最小. 做法:用双向链表串起来,把所有点丢进堆里,选择一个点的时候把它左右两个点从双向链表和堆中去除,然后把这个点的权值加进ans,出堆后改 ...

  8. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  9. 【BZOJ 1998】 1998: [Hnoi2010]Fsk物品调度(双向链表+并查集+置换)

    1998: [Hnoi2010]Fsk物品调度 Description 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号 ...

随机推荐

  1. poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2065 题意:题目看着较复杂,实际上就是给了n个同余方程,解n个未知数. 思路:套高斯消元法的模板即可. AC代码: #inc ...

  2. [转帖]Linux cpufreq 机制了解

    Linux cpufreq 机制了解 https://www.cnblogs.com/armlinux/archive/2011/11/12/2396780.html 引用文章链接: http://w ...

  3. ubuntu18上传代码到github

    其实在github上建仓库时候就提示你步骤了: 1.注册个github账号并登录 创建一个仓库 https://github.com/ 2.创建SSH Key ssh-keygen -t rsa -C ...

  4. Java静态代理与动态代理实现

    一.什么是代理 代理是一种设计模式,它提供了一种通过代理访问目标对象的方式.在应用代理之前,我们调用对象的过程如下: 客户端直接调用对象并获取返回值.而应用了代理之后,我们调用对象的过程变成如下: 客 ...

  5. nginx日志模块、事件模块

    日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...

  6. vue-slick 插件配置

    autoplay 布尔值 false 自动播放 autoplaySpeed 整数 3000 自动播放间隔 centerMode 布尔值 false 中心模式 centerPadding 字符串 ’50 ...

  7. spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目

    spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09

  8. 故事板(StoryBoards)和动画(Animations)

    Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations) 正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend ...

  9. OPENGL 显示BMP图片+旋转

    VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...

  10. Java日志规范(转载)

    Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...