gym102302E_Chi's performance
题意
给n个二元组(v,p),要求排序使得v从小到大,而且总价值最大,价值定义为相邻两个v值不同的p值之差绝对值之和。
分析
- in a row原来是相邻的意思。
- 对于每个相同v值的块来说,有用的数只有最大,次大,最小,次小,且如果块大小小于4,还有一些会重复,后面需要特判。
- 所以直接dp到每个块,左端点放哪个数,右端点放哪个数能获得的最大价值。
- 特判块大小为1的情况,以及上一个块大小为1的情况。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+50;
struct node{
int v,p;
bool operator<(const node& rhs)const{
if(v==rhs.v){
return p<rhs.p;
}else{
return v<rhs.v;
}
}
}a[N];
ll dp[N][5];
int mx[N][5],sz[N],num[N];
int n;
vector<int> v;
int main(){
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].v,&a[i].p);
v.push_back(a[i].v);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i=1;i<=n;i++){
a[i].v=lower_bound(v.begin(),v.end(),a[i].v)-v.begin()+1;
}
sort(a+1,a+1+n);
int t=1;
vector<int> tp;
tp.push_back(a[1].p);
for(int i=2;i<=n;i++){
if(a[i].v==a[i-1].v){
t++;
tp.push_back(a[i].p);
}else{
sz[a[i-1].v]=t;
if(t>=2){
mx[a[i-1].v][3]=tp[t-1];
mx[a[i-1].v][2]=tp[t-2];
mx[a[i-1].v][1]=tp[1];
mx[a[i-1].v][0]=tp[0];
}else{
num[a[i-1].v]=a[i-1].p;
}
t=1;
tp.clear();
tp.push_back(a[i].p);
}
}
sz[a[n].v]=t;
if(t>=2){
mx[a[n].v][3]=tp[t-1];
mx[a[n].v][2]=tp[t-2];
mx[a[n].v][1]=tp[1];
mx[a[n].v][0]=tp[0];
}else{
num[a[n].v]=a[n].p;
}
int vs=v.size();
for(int i=2;i<=vs;i++){
if(sz[i]==1){
for(int j=0;j<=3;j++){
if(sz[i-1]==1){
dp[i][j]=dp[i-1][0]+abs(num[i]-num[i-1]);
}else{
for(int l=0;l<=3;l++){
dp[i][j]=max(dp[i][j],dp[i-1][l]+abs(num[i]-mx[i-1][l]));
}
}
}
}else{
if(sz[i-1]==1){
for(int j=0;j<=3;j++){
for(int k=0;k<=3;k++){
if(j==k || (sz[i]==2 && (j+k==2 || j+k==4)) || (sz[i]==3 && ( (j && k) && (j+k==3)))){
continue;
}
dp[i][j]=max(dp[i][j],dp[i-1][0]+abs(mx[i][k]-num[i-1]));
}
}
}else{
for(int j=0;j<=3;j++){
for(int k=0;k<=3;k++){
if(j==k || (sz[i]==2 && (j+k==2 || j+k==4)) || (sz[i]==3 && ( (j && k) && (j+k==3)))){
continue;
}
for(int l=0;l<=3;l++){
dp[i][j]=max(dp[i][j],dp[i-1][l]+abs(mx[i][k]-mx[i-1][l]));
}
}
}
}
}
}
ll ans=0;
for(int i=0;i<=3;i++){
ans=max(ans,dp[vs][i]);
}
printf("%lld\n",ans);
return 0;
}
gym102302E_Chi's performance的更多相关文章
- Performance Monitor4:监控SQL Server的IO性能
SQL Server的IO性能受到物理Disk的IO延迟和SQL Server内部执行的IO操作的影响.在监控Disk性能时,最主要的度量值(metric)是IO延迟,IO延迟是指从Applicati ...
- Performance Tuning
本文译自Wikipedia的Performance tuning词条,原词条中的不少链接和扩展内容非常值得一读,翻译过程中暴露了个人工程学思想和英语水平的不足,翻译后的内容也失去很多准确性和丰富性,需 ...
- Performance Monitor3:监控SQL Server的内存压力
SQL Server 使用的资源受到操作系统的调度,同时,SQL Server在内部实现了一套调度算法,用于管理从操作系统获取的资源,主要是对内存和CPU资源的调度.一个好的数据库系统,必定在内存中缓 ...
- [MySQL Reference Manual] 23 Performance Schema结构
23 MySQL Performance Schema 23 MySQL Performance Schema 23.1 性能框架快速启动 23.2 性能框架配置 23.2.1 性能框架编译时配置 2 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- 使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
一.前言 最近一段时间,网站经常出现两个问题: 1.内存占用率一点点增高,直到将服务器内存占满. 2.访问某个页面时,页面响应过慢,CPU居高不下. 初步判断内存一点点增多可能是因为有未释放的资源一直 ...
- KPI:Key Performance Indicator
通信中KPI,是Key Performance Indicators的缩写,意思是关键性能指标.performance 还有绩效:业绩的意思,但显然不适用于这种场合. 通信中KPI的内容有:掉话率.接 ...
- Performance Monitor1:开始性能监控
Performance Monitor是Windows内置的一个可视化监控工具,能够在OS级别上实时记录系统资源的使用情况,通过收集和存储日志数据,在SQL Server发生异常时,能够还原系统当时的 ...
- Performance Monitor2:Peformance Counter
Performance Counter 是量化系统状态或活动的一个数值,Windows Performance Monitor在一定时间间隔内(默认的取样间隔是15s)获取Performance Co ...
随机推荐
- 推荐几个我近期排查线上http接口偶发415时用到的工具
导读:近期有一个业务部门的同学反馈说他负责的C工程在小概率情况下SpringMvc会返回415,通过输出的日志可以确定是SpringMvc找不到content-type这个头了,具体为什么找不到了呢? ...
- Ng的数组绑定
tip:数据的定义需要在对应ts中进行,调用在html中 定义数组: ts中 public arr =["111","222","333"] ...
- MongoDB 学习笔记之 GridFS
GridFS: GridFS 是 MongoDB 的一个用来存储/获取大型数据(图像.音频.视频等类型的文件)的规范.它相当于一个存储文件的文件系统,但它的数据存储在 MongoDB 的集合中.Gri ...
- c#关于JWT跨域身份验证解决方案
学习程序,不是记代码,而是学习一种思想,以及对代码的理解和思考. JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.为了网络应用环境间传递声明而执行的一种基于JSON的开发标准 ...
- Node.js入门教程 第六篇 (连接使用MySql)
连接使用MySql 安装MySql模块: npm install mysql 创建连接: const mysql = require('mysql') // 连接 mysql 服务器 const co ...
- 2016 10月15日java的动手动脑
(1) 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. 源程序: //随机数的产生 //zhanxinwu,October,15,2016 public class Recur ...
- SpringBoot自动注入分析
我们经常会被问到这么一个问题:SpringBoot相对于spring有哪些优势呢?其中有一条答案就是SpringBoot自动注入.那么自动注入的原理是什么呢?我们进行如下分析. 1:首先我们分析项目的 ...
- 编译 lame for iOS
网上找了许多编译lame的教程,结果都是编译失败,多次尝试后发现是编译脚本放错路径了,记录下编译的过程,把编译脚本放到源码文件夹中和修改编译脚本中的目录是关键: 一.首先去Lame官网 http:// ...
- sudo 提示 'xxx is not in the sudoers file.This incident will be reported.的解决方法'
在使用 Linux 的过程中,有时候需要临时获取 root 权限来执行命令时,一般通过在命令前添加 sudo 来解决. 但是第一次使用 sudo 时,有可能会得到这样一个错误提示 xxx is not ...
- [ERROR ImagePull]: failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.11.1]: exit status 1
问题描述 [root@localhost ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 ...