【JOISC2012】fish
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的更多相关文章
- 【原创】Themida 2260 虚拟机 FISH 初探(一)
标 题: [原创]Themida 2260 虚拟机 FISH 初探(一)作 者: xiaohang时 间: 2016-03-03,00:39:37链 接: http://bbs.pediy.com/s ...
- Log4Net学习【三】
Log4Net配置详解 配置方式一 在相应的应用程序的配置文件中配置,(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例是Web应用程序,以Web.co ...
- 【转】KM匹配题集
转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【dynamic】简化反射简单尝试
最近在自己瞎整设计自己的数据访问层(纯属深入了解C#用),遇到了反射.网传反射性能很差,可是我们项目中也有功能用到了反射,总体来说还不错(小项目).由于居安思危的感觉越发沉重,不得不去打破传统,去寻求 ...
- 细说 ASP.NET Cache 及其高级用法【转】
阅读目录 开始 Cache的基本用途 Cache的定义 Cache常见用法 Cache类的特点 缓存项的过期时间 缓存项的依赖关系 - 依赖其它缓存项 缓存项的依赖关系 - 文件依赖 缓存项的移除优先 ...
- 【转】细说Cookie
阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的 ...
- 【转】细说 Form (表单)
阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Aj ...
- 【Ansible】 基于SSH的远程管理工具
[Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...
随机推荐
- 【Qt开发】Qt5 中对 C++11 一些新特性的封装
C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...
- MyBatis使用技巧、总结、注意事项
目录 1.mybatis的官方文档地址 2.其他技巧: 2.1 如何在代码中拼接 like %% 2.2 数据库比较时日期的错误操作 2.2.1 异常情况: 2.2.2 为什么会在后面指定jdbcTy ...
- 《鸟哥的Linux私房菜:服务器搭建篇》第一部分学习笔记
零.问题集 1. 我们购买网络时,有4M.5M.8M.10M乃至100M,运营商是如何控制每个用户的带宽的? 一.网络基础概念 1. 交换器与集线器最大的差异,在于交换器内有一个特别的内存, 这个内存 ...
- Linux安装zookeeper集群
一.单机部署: ①下载.解压 http://archive.apache.org/dist/zookeeper/ tar -zxf zookeeper-3.4.10.tar.gz -C /usr/lo ...
- 龙芯 飞腾 intel的 OpenBenchMarking数据
1. 今天从openbenchmarking 里面进行了简单的查找. 数据主要为: 机器配置: LS3A3000的数据为: 来源: https://openbenchmarking.org/resul ...
- 编写shell脚本实现对虚拟机cpu、内存、磁盘监控机制
一.安装Vmware,并通过镜像安装centos7. 二.安装xshell(可以不装,可以直接在虚拟机中直接进行以下步骤) 三.安装mail 一般Linux发送报警邮件通过本地邮箱或外部邮箱服务器,这 ...
- 报错Could not find resource cn/smbms/dao/provider/ProviderMapper.xml
原因:由于idea不会编译src下的java目录下的xml文件,所以找不到xml文件 方案一:在pom.xml中添加如下内容 <build> <resources> <r ...
- html5手机网页开发,中文输入法下软键盘遮挡输入框
安卓手机解决办法 微信UI框架weui中给出了解决方法:weui框架http://weui.github.io/weui/example.js // .container 设置了 overflow 属 ...
- oracle用户解锁,rename管理
---查看命令:用户默认表空间 SYS@ACE >select username,default_tablespace,temporary_tablespace,created from dba ...
- 10 TCP限流技术
TCP限流是因为让接收方充分接受完消息,保证数据安全,不会丢失 一.窗口机制介绍 发送端和接收端都拥有一个窗口,当发送端发送数据时,落进窗口的数据被发送,当接受端接受数据时,落进接收端窗口的数据将会被 ...