【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等, ...
随机推荐
- 【首发】uExitCode解释
uExitCode 进程退出码,一般设置为0,不是的话也没有错误. 它的主要作用是,通知调用这个程序的其他程序退出的原因. 以前在dos下可能用的较多,现在windows下用的很少,而且windows ...
- IIS 6.0的web园 最大工作进程数细谈
这篇文章主要介绍了IIS 6.0的web园 最大工作进程数,需要的朋友可以参考下:(摘自:http://www.jb51.net/article/84817.htm) IIS 6.0允许将应用程序池配 ...
- C#实现隐藏手机号、邮箱、姓名等敏感信息扩展方法
还是老惯例,直接上代码. 最终效果图: public static class HideSensitiveInfoExtension { /// <summary> /// 隐藏敏感信息 ...
- jquery中 $.expr使用实例介绍
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Qt全局坐标和相对坐标
QMouseEvent中两类坐标系统,一类是窗口坐标,一类是显示器坐标. QPoint QMouseEvent::pos() 返回相对这个widget(重载了QMouseEvent的widget)的位 ...
- CentOS7安装MySQL 密码方面
1.为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 可通 ...
- java日志框架系列(1):slf4j框架简介及依赖
1.slf4j日志框架 1.简介 slf4j只是是日志规范,即只定义了接口,并没有实现这些接口. SLF4J的全称是Simple Logging Facade for Java,即简单日志门面.SLF ...
- springboot通过slf4j配置日志
原因:SpringBoot默认使用slf4j日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉: 而我今天想引入log4j的时候,pom文件一直报错,显示找不到log4j的jar包,应当是 ...
- 粒子群算法(PSO)
这几天看书的时候看到一个算法,叫粒子群算法,这个算法挺有意思的,下面说说我个人的理解: 粒子群算法(PSO)是一种进化算法,是一种求得近似最优解的算法,这种算法的时间复杂度可能会达到O(n!),得到的 ...
- python爬取信息并保存至csv
import csv import requests from bs4 import BeautifulSoup res=requests.get('http://books.toscrape.com ...