考虑将某线段下方的点取走:

将所有点从低到高排序

每扫描到一条水平线,对于上面每个点,找到它下面同色的前驱后继,统计中间点的个数

然后再把线上所有点插入数据结构中

最后再统计相邻的同色的点之间的点个数

用动态开点的权值线段树+树状数组维护,时间复杂度$O(n\log n)$。

考虑将某线段上方的点取走:

把扫描线的顺序反过来即可

注意特判出现颜色数没达到k的情况。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010,M=1800000;
int C,n,k,i,j,ans,bit[N],b[N],vis[N];
struct P{int x,y,c;}a[N];
inline bool cmpc(P a,P b){return a.c==b.c?a.x<b.x:a.c<b.c;}
inline bool cmpy(P a,P b){return a.y<b.y;}
inline void up(int x){if(ans<x)ans=x;}
inline int lower(int x){
int l=1,r=n,t,mid;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void add(int x){for(;x<=n;x+=x&-x)bit[x]++;}
inline int ask(int x){int t=0;for(;x;x-=x&-x)t+=bit[x];return t;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int T[N],vl[M],vr[M],l[M],r[M],tot,pre,nxt;
void ins(int&x,int a,int b,int c){
if(!x)x=++tot;
if(a==b){vl[x]=vr[x]=a;return;}
int mid=(a+b)>>1;
if(c<=mid)ins(l[x],a,mid,c);else ins(r[x],mid+1,b,c);
vl[x]=vl[l[x]]?vl[l[x]]:vl[r[x]];
vr[x]=vr[r[x]]?vr[r[x]]:vr[l[x]];
}
void getl(int x,int a,int b,int c){
if(!x||nxt)return;
if(c<=a){nxt=vl[x];return;}
int mid=(a+b)>>1;
if(c<=mid)getl(l[x],a,mid,c);
getl(r[x],mid+1,b,c);
}
void getr(int x,int a,int b,int d){
if(!x||pre)return;
if(b<=d){pre=vr[x];return;}
int mid=(a+b)>>1;
if(d>mid)getr(r[x],mid+1,b,d);
getr(l[x],a,mid,d);
}
int main(){
for(read(C);C--;printf("%d\n",ans)){
read(n),read(k);
for(i=1;i<=k;i++)vis[i]=0;
for(ans=0,i=1;i<=n;i++)read(a[i].x),read(a[i].y),read(a[i].c),b[i]=a[i].x,vis[a[i].c]=1;
for(sort(b+1,b+n+1),sort(a+1,a+n+1,cmpy),i=1;i<=n;i++)a[i].x=lower(a[i].x);
for(i=1;i<=n;i++)bit[i]=0;
for(i=1;i<=k;i++)if(!vis[i]){ans=n;break;}
if(ans)continue;
for(i=1;i<=tot;i++)vl[i]=vr[i]=l[i]=r[i]=0;tot=0;
for(i=1;i<=k;i++)T[i]=0,ins(T[i],0,n+1,0),ins(T[i],0,n+1,n+1);
for(i=1;i<=n;i=j){
for(j=i;j<=n&&a[j].y==a[i].y;j++){
pre=nxt=0,getl(T[a[j].c],0,n+1,a[j].x),getr(T[a[j].c],0,n+1,a[j].x);
up(ask(nxt-1)-ask(pre));
}
for(j=i;j<=n&&a[j].y==a[i].y;j++)ins(T[a[j].c],0,n+1,a[j].x),add(a[j].x);
}
for(i=1;i<=n;i++)bit[i]=0;
for(i=1;i<=tot;i++)vl[i]=vr[i]=l[i]=r[i]=0;tot=0;
for(i=1;i<=k;i++)T[i]=0,ins(T[i],0,n+1,0),ins(T[i],0,n+1,n+1);
for(i=n;i;i=j){
for(j=i;j&&a[j].y==a[i].y;j--){
pre=nxt=0,getl(T[a[j].c],0,n+1,a[j].x),getr(T[a[j].c],0,n+1,a[j].x);
up(ask(nxt-1)-ask(pre));
}
for(j=i;j&&a[j].y==a[i].y;j--)ins(T[a[j].c],0,n+1,a[j].x),add(a[j].x);
}
for(sort(a+1,a+n+1,cmpc),i=1;i<=n;i++)bit[i]=0;
for(i=1;i<=n;i++)bit[a[i].x]++;
for(i=2;i<=n;i++)bit[i]+=bit[i-1];
for(i=1;i<n;i++)if(a[i].c==a[i+1].c)up(bit[a[i+1].x-1]-bit[a[i].x]);
else up(max(n-bit[a[i].x],bit[a[i+1].x-1]));
up(max(bit[a[1].x-1],n-bit[a[n].x]));
}
return 0;
}

  

BZOJ3658 : Jabberwocky的更多相关文章

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

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

  2. BZOJ 3658: Jabberwocky (双向链表+BIT)

    题意 平面上有n个点,每个点有k种颜色中的一个.你可以选择一条水平的线段获得在其上方或其下方的所有点,请求出你最多能够得到多少点,使得获得的点并不包含所有的颜色. 分析 线段可以向上向下,那么我们只考 ...

  3. Lisp学习--Windows下面的开发环境搭建

    很久以前,就准备学习Lisp,但是遇到不少困难,社区太凌乱,也一直很犹豫,直到看了<Common Lisp - 想说爱你不容易>,想看看Common Lisp怎么样,之前都是拿Lisp的方 ...

  4. 【转】java正则表达式

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...

  5. JQuery基础教程:入门

    JQuery能做什么 JQuery在线手册 1.取得文档中的元素 如果不使用JavaScript库,遍历DOM(Document Object Model,文档对象模型)树,以及查找HTML文档结构中 ...

  6. JAVA 正则表达式 (超详细)

    (PS:这篇文章为转载,我不喜欢转载的但我觉得这篇文章实在是超赞了,就转了过来,这篇可以说是学习JAVA正则表达的必读篇.作者是个正真有功力的人,阅读愉快) 在Sun的Java JDK 1.40版本中 ...

  7. 转载:JAVA 正则表达式 (超详细)

    在Sun的JavaJDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用Java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu x ...

  8. Python数据模型及Pythonic编程

    Python作为一种多范式语言,它的很多语言特性都能从其他语言上找到参照,但是Python依然形成了一套自己的“Python 风格”(Pythonic).这种Pythonic风格完全体现在 Pytho ...

  9. 第15章 上下文管理器和else块

    #<流流畅的Python>第15章 上下文管理器和else块 #15.1 先做这个,再做那个:if语句之外的else块 #else子句不仅能在if语句中使用,还能在for.while和tr ...

随机推荐

  1. 部署细节回忆录(包括了nginx重启)

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) $cap -T $cap deploy:setup $cap deploy           (遇 ...

  2. [BZOJ1177][Apio2009]Oil

    [BZOJ1177][Apio2009]Oil 试题描述 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M ...

  3. [LA3026]Period

    [LA3026]Period 试题描述 For each prefix of a given string S with N characters (each character has an ASC ...

  4. 极客教学:如何使用树莓派击落&劫持无人机

    本教程的目的是帮助大家理解如何研究未受保护的无线通信的安全风险所在,同时我们希望大家不要对技术进行滥用.我们这里采用的例子是一个流行的无人机模型:Parrot AR.Drone 2.0. 四轴无人机能 ...

  5. ethtool 命令详解

    命令描述: ethtool 是用于查询及设置网卡参数的命令. 使用概要:ethtool ethx       //查询ethx网口基本设置,其中 x 是对应网卡的编号,如eth0.eth1等等 转自: ...

  6. 关于ubuntu配置静态IP 无法正常上网的解决方案

    在ubuntu中配置静态IP后无法正常上网. 解决: 1.在终端执行 vim /etc/network/interfaces 在文件中加入如下内容,网关要写上,我开始一直无法上网就是因为没有配置网关 ...

  7. Selenium webdriver 学习总结-元素定位

    Selenium webdriver 学习总结-元素定位 webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要 ...

  8. 转centos65安装简测mysql cluster 7.3.7

    MySQLCluster是sharednothing分布式架构,ndb存储引擎把数据放置于内存中.可以做到无单点故障.由运行于不同服务器上的的多种进程构成,组件包括SQL节点,NDBD数据节点,管理程 ...

  9. springMVC获取file,几种转换

    //从前台通过name值获取file MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)reque ...

  10. 处理html5离线应用程序存储的一些问题。

    manifest方法引入appcache文件,缓存页面,是html5的新特性,通过加载一次,下次自动读取缓存,加载速度快,离线也能加载.缺点就是,被加载的页面会被强制缓存所有的内容. 为了解决不加载所 ...