test20190320 全连(fc)
题意
全连(fc)
【题目背景】
还记得若干年前那段互相比较《克罗地亚狂想曲》的分数的日子吗?
【题目描述】
E.Space 喜欢打音游。
但是他技术不好,总是拿不到全连(Full Combo)。
现在他面前有一份乐谱,乐谱的其中一段有 n 个连续的单键音符。
相邻两个音符的到来时间均相等,我们可以认为第 i 个音符会在第 i 个时刻到来。
点击一个音符,E.Space 需要一段准备时间来进行移动手指之类的操作。由于音符的位置和周围情况不同,点击每个音符的准备时间也不同。
在一个音符的准备时间内,E.Space 没法做到去点击其它音符,但是不同音符的准备时间范围可以互相重叠。形式化地,令第 i 个音符的准备时间为 ti 个单位时间,那么如果 E.Space 选择去点击第 i 个音符,那么他就没法点击所有到来时刻在 (i − ti, i + ti)中的音符。
为了获得更高的分数,E.Space 还计算了每个音符的性价比。一个音符的性价比等于点击这个音符得到的分数除以 E.Space 点击它所需要的准备时间。
E.Space 就不指望全连了,他只是想让你帮他计算一下他最多可以得到多少分数。
【输入格式】
从文件 fc.in 中读入数据。
第一行一个正整数 n 。
第二行 n 个正整数,第 i 个正整数表示 ti 。
第三行 n 个正整数,第 i 个正整数表示第 i 个音符的性价比 ai。
【输出格式】
输出到文件 fc.out 中。
一行一个正整数,表示 E.Space 可能达到的最高分数。
【样例 1 输入】
5
2 3 2 1 2
3 1 2 9 4
【样例 1 输出】
18
【样例 1 解释】
E.Space 可以选择点击第 1, 3, 5 个音符,分数为 2 × 3 + 2 × 2 + 2 × 4 = 18 。
【子任务】
保证 \(t_i ≤ n ,a_i ≤ 10^9\)
| 测试点编号 | n ≤ |
|---|---|
| 1 | 5 |
| 2 | 10 |
| 3 | 15 |
| 4 | 20 |
| 5 | 1000 |
| 6 | 2000 |
| 7 | 5000 |
| 8 | 10000 |
| 9 | 30000 |
| 10 | 50000 |
| 11 | 100000 |
| 12 | 200000 |
| 13 | 500000 |
| 14 | 800000 |
| 15 | 1000000 |
| 16 | 1000000 |
| 17 | 100000 |
| 18 | 100000 |
| 19 | 1000000 |
| 20 | 1000000 |
对于最后 4 个测试点,保证对于任意的 i, j 有 \(t_i = t_j\) 。
分析
考场90分
看出来是偏序题,发现树套树会炸空间,于是去想cdq分治。
\(i-t_i\)小的应该先更新,于是初始化按\(i-t_i\)排序。然后考虑更新顺序,cdq分治应该使用中序遍历的方式。cdq过程中先做左半区间,把左半区间按照\(i\)排序,然后更新右半区间,最后做右半区间。
时间复杂度\(O(n \log^2 n)\)
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;
co int N=1e6+1;
int n;
ll s[N];
#define lowbit(x) (x&-x)
il void init(int p){
for(rg int i=p;i<=n;i+=lowbit(i)) s[i]=0;
}
il void insert(int p,ll v){
for(rg int i=p;i<=n;i+=lowbit(i)) s[i]=max(s[i],v);
}
il ll query(int p){
ll ans=0;
for(rg int i=p;i;i-=lowbit(i)) ans=max(ans,s[i]);
return ans;
}
struct node{
int id,t;
ll v,ans;
il bool operator<(co node&b)co {return id-t<b.id-b.t;}
}a[N],b[N];
void solve(int l,int r){
if(l==r) return void(a[l].ans=max(a[l].ans,a[l].v));
int mid=l+r>>1;
solve(l,mid);
for(rg int i=l,j=mid+1,p=l;p<=r;++p){
if(i>mid||j<=r&&a[i].id>a[j].id-a[j].t) a[j].ans=max(a[j].ans,query(a[j].id-1)+a[j].v),++j;
else {if(a[i].id+a[i].t-1<=n) insert(a[i].id+a[i].t-1,a[i].ans); ++i;}
}
for(rg int i=l;i<=mid;++i) if(a[i].id+a[i].t-1<=n) init(a[i].id+a[i].t-1);
solve(mid+1,r);
for(rg int i=l,j=mid+1,p=l;p<=r;++p){
if(i>mid||j<=r&&a[i].id>a[j].id) b[p]=a[j++];
else b[p]=a[i++];
}
copy(b+l,b+r+1,a+l);
}
int main(){
freopen("fc.in","r",stdin),freopen("fc.out","w",stdout);
read(n);
for(rg int i=1;i<=n;++i) a[i].id=i,read(a[i].t);
for(rg int i=1;i<=n;++i) a[i].v=read<ll>()*a[i].t;
sort(a+1,a+n+1),solve(1,n);
ll ans=0;
for(rg int i=1;i<=n;++i) ans=max(ans,a[i].ans);
printf("%lld\n",ans);
return 0;
}
标解
这是一道中规中矩的序列DP+1D1D的优化
没有多少思维难度
是一道开场就可以切掉的题

没想到改变插入顺序……
#include<bits/stdc++.h>
using namespace std;
#define gc c=getchar()
#define r(x) read(x)
#define ll long long
template<typename T>
inline void read(T&x){
x=0;T k=1;char gc;
while(!isdigit(c)){if(c=='-')k=-1;gc;}
while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
}
const int N=1e7+5;
int n;
ll c[N];
inline void insert(int x,ll v){
for(int i=x;i<=n;i+=(i&-i)){
c[i]=max(c[i],v);
}
}
inline ll query(int x){
if(x<=0)return 0;
ll ret=0;
for(int i=x;i;i^=(i&-i)){
ret=max(c[i],ret);
}
return ret;
}
ll f[N];
int t[N];
int a[N];
vector<int>G[N];
int main(){
freopen("fc.in","r",stdin);
freopen("fc.out","w",stdout);
r(n);
for(int i=1;i<=n;++i){
r(t[i]);
if(i+t[i]<=n)G[i+t[i]].push_back(i);
}
for(int i=1;i<=n;++i){
r(a[i]);
for(int j=0;j<G[i].size();++j){
insert(G[i][j],f[G[i][j]]);
}
f[i]=query(i-t[i])+(ll)a[i]*t[i];
}
ll ans=0;
for(int i=1;i<=n;++i){
ans=max(ans,f[i]);
}
printf("%lld\n",ans);
return 0;
}
test20190320 全连(fc)的更多相关文章
- fjwc2019 D1T1 全连(dp+树状数组)
#178. 「2019冬令营提高组」全连 显然我们可以得出一个$O(n^2)$的dp方程 记$f(i)$为取到第$i$个音符时的最大分数,枚举下一个音符的位置$j$进行转移. 蓝后我们就可以用树状数组 ...
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍[zz]
目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...
- ATA/SATA/SCSI/SAS/FC总线简介
ATA/SATA/SCSI/SAS/FC 都是应用于存储领域的总线,在当今的存储系统中,普遍应用的硬盘接口主要有 SATA . SCSI . SAS 和FC , ATA 比较古老,在一些老的低端存储系 ...
- 用原生javascript模拟经典FC游戏公路争霸
#用原生javascript模拟经典FC游戏公路争霸 前几天看了园子里面的随笔 [原生javascript开发仿微信打飞机小游戏](http://www.cnblogs.com/Mr-Nobody/p ...
- 【运维】使用FC命令辅助查杀DLL木马
使用FC命令辅助查杀DLL木马 在windows系统中,system32目录下是木马隐身的好地方,查找起来非常困难,许多木马都削尖了脑袋往那里钻,DLL木马也不例外.针对这一点用户可以在安装好系统和必 ...
- FC网络学习笔记01
1.Fibre Channel 也就是“网状通道”的意思,简称FC,可以称其为FC协议.FC网络或FC互联. 2.像TCP/IP一样,FC协议集同样具备TCP/IP协议集以及以太网中的概念,比如FC交 ...
- FC网络学习笔记02 -网络配置方法
随着新一代飞机的综合化航电系统对通信需求的不断提高,传统的ARINC429.1553B总线的传输速率分别只有100Kbps和1Mbps,其带宽已远远不 论文联盟 http://Www.LWlm.cOm ...
- FC和SCSI
IDE(Integrated Drive Electronics)即"电子集成驱动器",它的本意是指把"硬盘控制器"与"盘体"集成在一起的硬 ...
- BROCADE 300和MD3200扩展柜FC SAN,截图
这表示俺玩过,其实,这个光交换机在只有一个共享存储的情况下,可用可不用. FC BROCADE只是为了方便后期扩展. FC SAN之类的识别不靠IP,因为不是IP SAN嘛.但也是自己的识别体系.
随机推荐
- Java checked 异常 和 RuntimeException(运行时异常)
目录 一.运行时异常 1.什么是RuntimeExceptioin 2.运行时异常的特点 3.如何运用运行时异常 二.运行时异常和ckecked异常的区别 1.机制上 2.逻辑上 一.运行时异常 1. ...
- 一个表单里,如果有<button>标签存在,它会自动提交表单
可以用button代替input type=”submit”吗? 在ie下,<button>标记恐怕还存在几个不大不小的问题. 在一个表单里,如果有一个以上"submit&quo ...
- English trip V1 - 2.Don't Do That Teacher:Patrick Key: 祈使句(imperatives)
什么是祈使句? What's imperatives? 求或者希望别人做什么事或者不做什么事时用的句子:带有命令的语气 In this lesson you will learn how to ...
- 关于一致性hash详细
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...
- CentOS 配置Tomcat服务脚本
#!/bin/bash # description: Tomcat7 Start Stop Restart # processname: tomcat7 # chkconfig: JAVA_HOME= ...
- 使用nginx+dnsmasq解决同IP不同端口Session冲突问题
由于一台服务器上需要部署多个项目,而我们的WEB项目因为用到框架都是一样的,导致同时运行,session相互冲突,这个登录后,那个就得重新登录,造成了使用不方便,原因是IP相同认为是同一个域,接收了B ...
- 基于DOMContentLoaded实现文档加载完成后执行的方法
我们有时可能需要一些在页面加载完成之后执行的方法,其实js原生就提供了onload方法,所以我们最简单的办法就是直接给onload赋值一个函数,在页面加载完成之后就会自动执行 widnow.onloa ...
- python-day34--并发编程之多线程
理论部分 一.什么是线程: 1.线程:一条流水线的工作过程 2.一个进程里至少有一个线程,这个线程叫主线程 进程里真正干活的就是线程 3.进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资 ...
- SQL Server数据库 优化查询速度
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
- nginx支持返回相对路径
一.问题:http://192.168.72.4/bm-crm/ 局域网可以访问[实际指向了192.168.80.1:8081/brm-crm] http://59.41.111.24:8280/b ...