题意

平面上有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. MySQL中的左连接遇到的坑

    参考地址:https://blog.csdn.net/feichangwurao/article/details/89526741 待研究整理中.....

  2. Python 解LeetCode:33. Search in Rotated Sorted Array

    题目描述:在一个旋转数组中查找给定的值,其中旋转数组中不含重复值: 思路: 第一遍二分遍历,找到数组中最小值的索引: 第二遍分别对最小值左右两边的数组进行二分查找: class Solution(ob ...

  3. PAT题目AC汇总(待补全)

    题目AC汇总 甲级AC PAT A1001 A+B Format (20 分) PAT A1002 A+B for Polynomials(25) PAT A1005 Spell It Right ( ...

  4. php常用扩展有哪些

    bcmath(精确数值处理) bz2 calendar Core ctype curl date dom ereg exif fileinfo filter ftp gettext hash icon ...

  5. linux 对外开放端口

    查看守护进程端口 netstat -ntpl 查看开放的端口 iptables -nvL 查看端口是否可访问:telnet ip 端口号 (如本机的35465:telnet localhost 354 ...

  6. pthread_cancel 相关

    假设线程A对线程B发出了一个取消请求.通过如下函数: #include <pthread.h> int pthread_cancel(pthread_t thread); 参数: thre ...

  7. shell习题第13题:监控nginx进程

    [题目要求] 在服务器上写一个脚本,要求如下 1. 每隔10秒去检查而一次服务器上的nginx进程数,如果>=500的时候,就需要自动重启一下nginx服务,并检测启动是否成功 2. 如没有正常 ...

  8. luogu P1646 [国家集训队]happiness (最小割)

    高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科 ...

  9. Redis 消息队列 初体验

    队列之生产者.消费者模式 using System; using System.Threading; using NServiceKit.Redis; namespace ConsoleApplica ...

  10. react——css样式

    1.行内样式: 两个大括号包着.第一个大括号表示里面写js,第二个大括号里面是样式对象 2.传对象 将对象和结构分离,直接写一个大括号,里面写对象 3.将所有的样式对象合并成一个大对象,直接点 以上样 ...