Description

  有 \(n\) 条鱼,第 \(i\) 条鱼的长度为 \(L_i\),颜色是 \(C_i\)(\(C_i\) 只能是 'R','G','B')。

  你需要从中挑出至少一条鱼,要求挑出的鱼中不能存在两条鱼 \(x,y\) 满足 \(2L_x\le L_y\)。

  求可以挑出 \(a\) 条红鱼、\(b\) 条绿鱼、\(c\) 条蓝鱼的三元组 \((a,b,c)\) 的个数。

  \(n\le 5\times 10^5\)

Solution

  将所有鱼按 \(L\) 从小到大排序。

  枚举每条鱼 \(l\) 为 \(L\) 最小的鱼,求在此基础上能挑出的 \(L\) 最大的鱼 \(r\)。设第 \([l,r]\) 条鱼中有 \(a\) 条红鱼,\(b\) 条绿鱼,\(c\) 条蓝鱼,则 \((0,0,0)\) 到 \((a,b,c)\) 这个立方体空间中的所有三维点都是可以选的。问题转化成了求 \(n\) 个立方体的体积并。

  \(n\) 个立方体的前左下端点都是 \((0,0,0)\),这个性质很好,我们可以用扫描线倒序扫第一维,第二、三维组成的平面 一定是一个包含左下角的凸包。不难发现我们要支持快速将一个前缀对一个参数取 max,以及整体求和,直接线段树就完了。时间 \(O(n\log n)\)。

  当然也可以维护一个 set 记录第二、三维组成的平面上的凸包的每个顶点,区间更新 max 时暴力删掉中间所有被覆盖掉的顶点即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int rd(){
char c=getchar();int x=0,flag=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')flag=-1;
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
return x*flag;
}
struct fish{
int l,c;
friend inline bool operator < (fish a,fish b){
return a.l>b.l;
}
}a[500010];
struct node{
int x,y,z;
friend inline bool operator < (node a,node b){
return a.x>b.x;
}
}p[500010];
struct seg_tree{
ll sum;int tag,mx,mn;
}st[2000010]={0};
int n,sz[3]={0};
inline void pushdown(int s,int l,int r){
if(!st[s].tag) return;
int mid=(l+r)>>1,v=st[s].tag;
st[s<<1].tag=st[s<<1].mx=st[s<<1].mn=v;
st[s<<1].sum=(ll)v*(mid-l+1);
st[s<<1|1].tag=st[s<<1|1].mx=st[s<<1|1].mn=v;
st[s<<1|1].sum=(ll)v*(r-mid);
return (void)(st[s].tag=0);
}
inline void pushup(int s){
st[s].sum=st[s<<1].sum+st[s<<1|1].sum;
st[s].mx=max(st[s<<1].mx,st[s<<1|1].mx);
st[s].mn=min(st[s<<1].mn,st[s<<1|1].mn);
return;
}
inline void upd(int s,int l,int r,int x,int y,int v){
if(st[s].mn>=v) return;
if(x<=l&&r<=y&&st[s].mx<=v){
st[s].tag=st[s].mx=st[s].mn=v;
st[s].sum=(ll)v*(r-l+1);
return;
}
int mid=(l+r)>>1;pushdown(s,l,r);
if(x<=mid) upd(s<<1,l,mid,x,y,v);
if(mid<y) upd(s<<1|1,mid+1,r,x,y,v);
return pushup(s);
}
int main(){
n=rd();
for(int i=1;i<=n;i++){
int l=rd();char c[2];scanf("%s",c);
a[i]=(fish){l,(c[0]=='R')?0:(c[0]=='G')?1:2};
}
sort(a+1,a+n+1);
for(int i=1,j=1;i<=n;i++){
for(;j<=n&&(a[j].l<<1)>a[i].l;j++)
sz[a[j].c]++;
p[i]=(node){sz[0]+1,sz[1]+1,sz[2]+1};
sz[a[i].c]--;
}
sort(p+1,p+n+1);
ll ans=0;
for(int i=n+1,j=1;i;i--){
for(;j<=n&&p[j].x==i;j++)
upd(1,1,n+1,1,p[j].y,p[j].z);
ans+=st[1].sum;
}
return printf("%lld\n",ans-1),0;
}

【JOISC2012】fish的更多相关文章

  1. 【原创】Themida 2260 虚拟机 FISH 初探(一)

    标 题: [原创]Themida 2260 虚拟机 FISH 初探(一)作 者: xiaohang时 间: 2016-03-03,00:39:37链 接: http://bbs.pediy.com/s ...

  2. Log4Net学习【三】

    Log4Net配置详解 配置方式一 在相应的应用程序的配置文件中配置,(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例是Web应用程序,以Web.co ...

  3. 【转】KM匹配题集

    转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...

  4. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  5. 【dynamic】简化反射简单尝试

    最近在自己瞎整设计自己的数据访问层(纯属深入了解C#用),遇到了反射.网传反射性能很差,可是我们项目中也有功能用到了反射,总体来说还不错(小项目).由于居安思危的感觉越发沉重,不得不去打破传统,去寻求 ...

  6. 细说 ASP.NET Cache 及其高级用法【转】

    阅读目录 开始 Cache的基本用途 Cache的定义 Cache常见用法 Cache类的特点 缓存项的过期时间 缓存项的依赖关系 - 依赖其它缓存项 缓存项的依赖关系 - 文件依赖 缓存项的移除优先 ...

  7. 【转】细说Cookie

    阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的 ...

  8. 【转】细说 Form (表单)

    阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Aj ...

  9. 【Ansible】 基于SSH的远程管理工具

    [Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...

随机推荐

  1. 【Qt开发】Qt5 中对 C++11 一些新特性的封装

    C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...

  2. MyBatis使用技巧、总结、注意事项

    目录 1.mybatis的官方文档地址 2.其他技巧: 2.1 如何在代码中拼接 like %% 2.2 数据库比较时日期的错误操作 2.2.1 异常情况: 2.2.2 为什么会在后面指定jdbcTy ...

  3. 《鸟哥的Linux私房菜:服务器搭建篇》第一部分学习笔记

    零.问题集 1. 我们购买网络时,有4M.5M.8M.10M乃至100M,运营商是如何控制每个用户的带宽的? 一.网络基础概念 1. 交换器与集线器最大的差异,在于交换器内有一个特别的内存, 这个内存 ...

  4. Linux安装zookeeper集群

    一.单机部署: ①下载.解压 http://archive.apache.org/dist/zookeeper/ tar -zxf zookeeper-3.4.10.tar.gz -C /usr/lo ...

  5. 龙芯 飞腾 intel的 OpenBenchMarking数据

    1. 今天从openbenchmarking 里面进行了简单的查找. 数据主要为: 机器配置: LS3A3000的数据为: 来源: https://openbenchmarking.org/resul ...

  6. 编写shell脚本实现对虚拟机cpu、内存、磁盘监控机制

    一.安装Vmware,并通过镜像安装centos7. 二.安装xshell(可以不装,可以直接在虚拟机中直接进行以下步骤) 三.安装mail 一般Linux发送报警邮件通过本地邮箱或外部邮箱服务器,这 ...

  7. 报错Could not find resource cn/smbms/dao/provider/ProviderMapper.xml

    原因:由于idea不会编译src下的java目录下的xml文件,所以找不到xml文件 方案一:在pom.xml中添加如下内容 <build> <resources> <r ...

  8. html5手机网页开发,中文输入法下软键盘遮挡输入框

    安卓手机解决办法 微信UI框架weui中给出了解决方法:weui框架http://weui.github.io/weui/example.js // .container 设置了 overflow 属 ...

  9. oracle用户解锁,rename管理

    ---查看命令:用户默认表空间 SYS@ACE >select username,default_tablespace,temporary_tablespace,created from dba ...

  10. 10 TCP限流技术

    TCP限流是因为让接收方充分接受完消息,保证数据安全,不会丢失 一.窗口机制介绍 发送端和接收端都拥有一个窗口,当发送端发送数据时,落进窗口的数据被发送,当接受端接受数据时,落进接收端窗口的数据将会被 ...