题意

平面上有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. hdoj3586 (树形dp)

    题目链接:https://vjudge.net/problem/HDU-3586 题意:一棵边权树,要删掉一些边使得每个叶子结点不能到达树根,且这些边的权值<=上限Max,且边权和小于m,求最小 ...

  2. selenium登录百度

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.s ...

  3. 统计学习方法 | 感知机 | python实现

    感知机是二类分类的线性分类模型,利用随机梯度下降法对基于误分类的损失函数进行极小化. 书中算法可以将所有样本和系数向量写成增广向量的形式,并将所有负样本乘以-1,统一形式,方便计算. (1)训练数据集 ...

  4. Devepxress xaf Dashboard中DetailView控件使其可编辑

    最开始用Devexpress xaf Dashboard做界面的时候,DetailView界面里面的控件都无法编辑,后来解决了这个问题,记录下来供大家参考. 解决方法:创建ViewController ...

  5. Linux:删除一个目录下的所有文件,但保留一个指定文件

    面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10  十个文件 [root@oldboy xx]# touc ...

  6. ubuntu+nginx+uwsgi部署django web项目

    前言 将本地开发的django项目部署至linux上的uwsgi服务器,并配置nginx,完成基于ubuntu+nginx+uwsgi的上线运行.下面整理相关步骤. 服务器配置virtualenv 如 ...

  7. 排序之快排(JS)

    快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...

  8. Linux下mysql创建用户并设置权限,设置远程连接

    为了安全考虑,OneinStack仅允许云主机本机(localhost)连接数据库,如果需要远程连接数据库,需要如下操作:打开iptables 3306端口 # iptables -I INPUT 4 ...

  9. 【php设计模式】建造者模式

    <?php /** *建造者模式特点: * 1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象. * 2.每一个具体建造者都相对独立, ...

  10. java读取串口-mfz-rxtx-2.2-20081207-win-x86

    1.下载jar包 RXTXcomm.jar 2.实现代码 package main; import java.awt.*; import java.awt.event.*; import java.i ...