欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1071


题意概括

  有两个序列a[1..n], b[1..n],其编号为1..n,设为s序列。现在我们要求出最长的满足条件的s的子序列s',设va=min(a[s[i]]), vb=min(b[s[i]]), 满足对于所有的j=s'[i], A*(a[j]-va)+B*(b[j]-vb)<=C。


题解

  设v[i]=A*a[i]+B*b[i];
  那么,要求满足v[s'[i]]-A*va-B*vb<=C,
  移项得:v[s[i]]<=A*va+B*vb+C
  于是我们可以按照两种顺序排序,一个是v,一个是b。
  那么如果确定鼓励va,则:
  A*a[i]+B*b[i]<=A*va+B*vb+C
  而A*a[i]>=A*va
  所以B*b[i]<=B*vb+C
  移项B*(b[i]-vb)<=C,
  b[i]<=vb+C/B,
  都是整数,所以可以直接取整。
  所以,对于所有的b[i],有vb<=b[i]<=vb+C/B。
  然后双指针,一个扫按照b排序的,一个扫按照s排序的。


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=5000+5;
struct Player{
LL a,b,v;
}v[N],a[N];
int n;
LL A,B,C;
bool cmp_v(Player a,Player b){
return a.v<b.v;
}
bool cmp_a(Player a,Player b){
return a.a<b.a;
}
int main(){
scanf("%d%lld%lld%lld",&n,&A,&B,&C);
for (int i=1;i<=n;i++){
scanf("%lld%lld",&v[i].a,&v[i].b);
v[i].v=A*v[i].a+B*v[i].b;
a[i]=v[i];
}
sort(v+1,v+n+1,cmp_v);
sort(a+1,a+n+1,cmp_a);
int ans=0;
for (int i=1;i<=n;i++){
int L=0,R=0,cnt=0;
LL xL=a[i].b,xR=xL+C/B;
LL va,vb=xL;
for (int j=1;j<=n;j++){
va=a[j].a;
while (R<n&&v[R+1].v<=A*va+B*vb+C){
R++;
if (xL<=v[R].b&&v[R].b<=xR)
cnt++;
}
while (L<n&&a[L+1].a<va){
L++;
if (xL<=a[L].b&&a[L].b<=xR)
cnt--;
}
ans=max(ans,cnt);
}
}
printf("%d",ans);
return 0;
}

  

BZOJ1071 [SCOI2007]压缩 其他的更多相关文章

  1. BZOJ1068: [SCOI2007]压缩

    ... 1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 909  Solved: 566[Submit][Statu ...

  2. bzoj 1068: [SCOI2007]压缩 DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 496  Solved: 315[Submit][Status] D ...

  3. bzoj 1068 [SCOI2007]压缩 区间dp

    [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1644  Solved: 1042[Submit][Status][Discu ...

  4. [SCOI2007]压缩(动态规划,区间dp,字符串哈希)

    [SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...

  5. BZOJ 1068: [SCOI2007]压缩

    Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...

  6. 【BZOJ 1068】[SCOI2007]压缩

    Description 给 一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M 标记重复串的开始,R重复从 ...

  7. 1068: [SCOI2007]压缩 - BZOJ

    Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一 ...

  8. bzoj1068:[SCOI2007]压缩

    思路:区间dp,设状态f[l][r][bo]表示区间[l,r]的答案,bo=1表示该区间可以放M也可以不放M,bo=0表示该区间不能放M,并且对于任意一个状态f,l和l-1之间均有一个M,于是就可以进 ...

  9. [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】

    题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...

随机推荐

  1. 配置Arcengine10.1+java开发环境(Eclipse)

    以下开发环境配置是假定用户已经安装了Java开发的IDE(Eclipse) 软件准备 (一)ArcEngine 10.1 安装包 提取码:poa0 (二)ArcGIS License Manager ...

  2. android SQLiteOpenHelper 使用

    1.实体 package mydemo.mycom.demo2.entity; public class UserInfo { private int id; private String usern ...

  3. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  4. Django配置富文本编辑器kindeditor

    一.简介 django是一个容易快速上手的web框架,用它来创建内容驱动型的网站(比如独立博客)十分方便.遗憾的是,django并没有提供官方的富文本编辑器,而后者恰好是内容型网站后台管理中不可或缺的 ...

  5. C语言函数调用栈(三)

    6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: //StackReg.c #include <stdio.h> //获取 ...

  6. motor的使用

    # -*- coding: utf-8 -*- # @Time : 2018/11/18 10:41 PM # @Author : cxa # @File : motordb.py # @Softwa ...

  7. Salt Document学习笔记2

    配置文件需修改的内容及注意点: Edit the master config file: 1. Uncomment and change the user: root value to your ow ...

  8. java工程操作redis

    启动redis服务 redis-server redis.windows.conf 添加驱动 <dependency> <groupId>redis.clients</g ...

  9. root权限使用vim不能修改权限

    1.背景: 有时候我们会发现使用root权限不能修改某个文件,大部分原因是曾经使用chattr将文件锁定了 2.chattr命令介绍: 用来改变文件属性,能防止root用户误删文件等作用 3.使用方法 ...

  10. 织梦dedeCMS数据库结构字段说明-简略说明

    dede_addonarticle 附加文章表 aid int(11) 文章编号typeid int(11) 分类栏目编号body mediumtext 文章内容dede_addonflash 附加F ...