题目大意

给出一个歌单(有n首歌),每个歌都有愉悦值和时间,你可以选择从第x首歌开始听(也就是选择连续的一段),并且你可以选择w首歌让它的时间减半,限制时间为k,求最大的愉悦值

首先我们需要贪心一下,假如从第x首歌开始听,那么要想获得最大的愉悦值,就必须把那些时间最长的歌进行减半处理。

根据这个,我们就需要利用数据结构来进行维护

考虑使用两个set来维护,S1中保存没有被减半的歌曲,S2中保存减半了的歌曲

首先从x=1开始听,每新加进来一首歌i,进行如下处理

1、S2中还没有w首歌,就直接放进S2里

2、S2中已经有了w首歌,那么就抽出其中时间最短的歌与i比较,如果i的时间大,就把那个最短的歌放到S1中,把i放到S2中;否则就把i放到S1中

假如无法放入歌曲,那么就统计出来当前的愉悦值,然后把第一首歌删掉

删除时要注意,如果删掉的元素在S1中就不需要额外处理,如果在S2中,就要把S1中最长的歌再放到S2中

然后直到最后一首歌被抽出,输出最大的答案

每首歌只会被放入或抽出1次,所以复杂度是nlogn

#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
const int maxn = *;
struct Data
{
int t, id;
Data() {}
Data(int _t, int _id) { t = _t; id = _id; }
bool operator <(const Data& B) const
{ return (t == B.t) ? (id < B.id) : t < B.t; }
bool operator == (const Data& B) const
{ return t == B.t && id == B.id; }
};
struct node
{
int t, v;
}a[maxn];
set<Data> S1, S2;
int nowt = , tot = -, st = ;
void Insert(int ty, int t, int id)
{
if(ty == )
{
S1.insert(Data(t, id));
nowt += t;
} else
{
S2.insert(Data(t, id));
nowt += ((t-)/+);
}
} void Erase(int ty, int t, int id)
{
if(ty == )
{
S1.erase(Data(t, id));
nowt -= t;
} else
{
S2.erase(Data(t, id));
nowt -= ((t-)/+);
}
} void ERASE(int st)
{
if(S1.find(Data(a[st].t, st)) != S1.end()) Erase(, a[st].t, st);
else
{
Erase(, a[st].t, st);
if(S1.size() > )
{
Data tmp = *(--S1.end());
Erase(, tmp.t, tmp.id);
Insert(, tmp.t, tmp.id);
}
}
} int n, w, k;
int main()
{
cin>>n>>w>>k;
for(int i = ; i < n; i++) cin>>a[i].v;
for(int i = ; i < n; i++) cin>>a[i].t;
int ans = , ANS = ;
while(st != n)
{
while(nowt <= k)
{
tot++;
if(tot >= n) break;
if(S2.size() < w)
{
Insert(, a[tot].t, tot);
}
else
{
Data tmp = *S2.begin();
if(tmp.t < a[tot].t)
{
Erase(, tmp.t, tmp.id);
Insert(, tmp.t, tmp.id);
Insert(, a[tot].t, tot);
} else
Insert(, a[tot].t, tot);
}
if(nowt <= k) ans += a[tot].v;
else
{
ERASE(tot);
tot--;
break;
}
ANS = max(ANS, ans);
}
ERASE(st);
ans -= a[st].v;
st++;
}
cout<<ANS<<endl;
}

Codeforces Round #386 (Div. 2) 746F(set的运用)的更多相关文章

  1. Codeforces Round #386 (Div. 2)

    迟到的一次比赛 最近状态很崩溃 网速很慢 然后前面五题看了都有打 但是 只有A B E 是过了的 是时候要反省一下 A.随便判断一下就好 最少的份数嘛 B.画出来之后是一下子左边一下子右边 打一个递归 ...

  2. Codeforces Round #386 (Div. 2) C. Tram

    C. Tram time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  3. Codeforces Round #386 (Div. 2) C D E G

    一场比较简单的题 比较脑洞 C 如果坐车比较快的话 先走不如等车 所以最后的ans是min(纯走路,纯坐车) 讨论一下坐车时间 D 因为k一定是>=1的 所以当a=b的时候 GBGBGB这样间隔 ...

  4. Codeforces Round #386 (Div. 2) 746G(树的构造)

    大体题意 一棵树有n个结点,告诉你每层深度上有a[i]个结点,以及有多少叶子结点 让你生成这棵树 题解:考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那么答案很简单,就是对(a[ ...

  5. Codeforces Round #386 (Div. 2) A+B+C+D!

    A. Compote 水题(数据范围小都是水题),按照比例找最小的就行了,3min水过. int main() { int a,b,c; while(~scanf("%d%d%d" ...

  6. Codeforces Round #386 (Div. 2)G. New Roads [构造][树]

    题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...

  7. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  8. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  9. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

随机推荐

  1. 理解golang中的function types

    先找个例子来看一下: package main import "fmt" // Greeting function types type Greeting func(name st ...

  2. 在xampp修改密码

    1.选择 服务器--账号--修改密码 2.在密码 一栏输入新密码 3.刷新页面会得到如下页面 此时,该页面提醒我们检查配置文件中的主机.用户名和密码 4.打开配置文件 路径为 xampp -> ...

  3. Element表单验证(1)

    Element表单验证(1) 首先要掌握Element官方那几个表单验证的例子,然后才看下面的教程. Element主要使用了async-validator这个库作为表单验证 async-valida ...

  4. FAT32中文版分析+补充(1)

    概述 起先所有的FAT文件系统都是为IBM PC机器而设计的,这说明了一个重要的问题:FAT文件系统在磁盘上的数据是用“小端”(Little Endian)结构存储的.我们使用4个8-bit的字节—— ...

  5. python--随笔一

    1.format函数--根据关键字和位置选择性插入数据 In [11]: '{mingzi}jintian{dongzuo}'.format(mingzi='duzi',dongzuo='i love ...

  6. Java 算法随笔(一)

    1. 最大子序列和问题 给定(可能有负数)整数a(1).a(2).……a(n),求 a(1)+a(2)+……+a(j)的最大值. 也就是:在一系列整数中,找出连续的若干个整数,这若干个整数之和最大.有 ...

  7. PLC状态机编程第二篇-负载均衡

    控制任务 大家好,今天我们用状态机描述稍复杂的实例,同时用LAD和ST语言写状态机.我们的控制任务如下: 真空泵A和真空泵B, 按下启动按钮后, 泵A启动, 3秒后泵B也启动, 此时泵A仍运行, 当容 ...

  8. 使用python写一个最基本的mapreduce程序

    一个mapreduce程序大致分成三个部分,第一部分是mapper文件,第二个就是reducer文件,第三部分就是使用hadoop command 执行程序. 在这个过程中,困惑我最久的一个问题就是在 ...

  9. CLK_SWR=0xe1

    STM8 时钟初始化 主时钟切换寄存器(CLK_SWR) http://www.stmcu.org/document/detail/index/id-200090 stm8寄存器数据手册链接

  10. 17-比赛2 F - Fox And Two Dots (dfs)

    Fox And Two Dots CodeForces - 510B ================================================================= ...