【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等, ...
随机推荐
- c++学习笔记_5
前言:本笔记所对应的课程为中国大学mooc中北京大学的程序设计与算法(三)C++面向对象程序设计,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写 继承 继 ...
- Java.lang 包 util 包等各个包详解
java.lang 该包提供了 Java 编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread 等,不使用该包就很难编写 Java 代码了. ...
- C#开发者必须知道的13件事情
1.开发流程 程序的Bug与瑕疵往往出现于开发流程当中.只要对工具善加利用,就有助于在你发布程序之前便将问题发现,或避开这些问题. 标准化代码书写 标准化代码书写可以使代码更加易于维护,尤其是在代码由 ...
- HIVE外部表 分区表
HIVE外部表 分区表 外部表 创建hive表,经过检查发现TBLS表中,hive表的类型为MANAGED_TABLE. 在真实开发中,很可能在hdfs中已经有了数据,希望通过hi ...
- 通过DLNA将电脑视频投射到电视屏幕
1. DLNA DLNA(Digital Living Network Alliance)是由索尼.英特尔.微软等发起成立的一套解决电脑.移动设备.消费电器之间互联互通的协议.它们的宗旨是“随时随地享 ...
- Holy Grail【spfa求最短路】
题目链接:https://www.jisuanke.com/contest/3004?view=challenges 题目大意: 1.一个无向图,给出六个顶点,添六条边,但是添边是有限制的.每次添边的 ...
- python搞搞大数据之hbase——初探
使用python链接mysql读入一个表并把它再写到hbase 里去(九头蛇万岁) 先声明一下需要用的库: 俩!!: happybase (写这个的老哥真的happy) pymysql 建议使用 ...
- 剑指offer38:输入一棵二叉树,求该树的深度
1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...
- 前端vue组件传参
## 路由传参 """ 转跳: <router-link :to="'/course/'+course.id">{{course.name ...
- selenium登录4399
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...