题目描述

有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。

第i位同学希望在第ti天或之前得知所有课程的成绩。如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生C不愉快度。对于第i门课程,按照原本的计划,会在第bi天公布成绩。

有如下两种操作可以调整公布成绩的时间:

1、将负责课程X的部分老师调整到课程Y,调整之后公布课程X成绩的时间推迟一天,公布课程Y成绩的时间提前一天;每次操作产生A不愉快度。

2、增加一部分老师负责学科Z,这将导致学科Z的出成绩时间提前一天;每次操作产生B不愉快度。

上面两种操作中的参数X;Y;Z均可任意指定,每种操作均可以执行多次,每次执行时都可以重新指定参数。

现在希望你通过合理的操作,使得最后总的不愉快度之和最小,输出最小的不愉快度之和即可。

输入:

第一行三个非负整数 A; B; C ,描述三种不愉快度,详见【问题描述】;

第二行两个正整数 n; m(1 ≤ n; m ≤ 10^5) ,分别表示学生的数量和课程的数量;

第三行 n 个正整数 ti ,表示每个学生希望的公布成绩的时间;

第四行 m 个正整数 bi ,表示按照原本的计划,每门课程公布成绩的时间。

输出:

输出一行一个整数,表示最小的不愉快度之和。

这道题好多其他人都写的三分,我自己在做的时候还是想的是枚举加前缀和乱搞...

首先我们只关心最后一个成绩公布的时间,所以我们可以先对人和成绩排序,再求前缀和。

这样有什么好处呢,当我们想要求当最后一个成绩公布的时间为k时调整老师的代价时,我们可以先二分划分出公布时间在时限范围内的和不在时限范围内的科目,然后利用前缀和算出需要节约出多少个单位的时间,然后有一个策略显然:

对于已经在时限内的科目,他们的公布时间具体是多少没有意义,但是当1操作的代价低于2操作的代价时,我们可以尽量让这些科目的老师去支援那些后面的老师。

设最后一个成绩是ti,恰好前pos个课程结束的时间在时限范围之内,我们最多可以进行(pos*ti-pre_class[pos])次1操作。

所以对于那些超出时限的科目,他们超出的那些时间单位的前(pos*ti-pre_class[pos])的部分可以通过1、2两种操作中代价最小的进行处理,剩下的部分只能通过2操作进行处理。

通过同样的方法,我们可以算出所有人要等的时间之和。

由于每一个人要求的时间和成绩公布的时间都不超过1e5,所以就可以枚举时间(或者三分),并在O(logn)时间内算出答案,求最小值即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 200040
#define inf (1e15)
using namespace std;
LL read(){
LL nm=,fh=;char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*+(cw-'');
return nm*fh;
}
LL n,m,A,B,C,p[M],t[M],c[M],pre[M],cst,ps;
LL res,maxn,st[M],num,pos,sum,ans;
LL find(LL ti){
LL L=,R=m,tk=,mid;
while(L<=R){
mid=(L+R>>);
if(p[mid]<=ti) tk=mid,L=mid+;
else R=mid-;
}
return tk;
}
LL findt(LL ti){
LL L=,R=n,tk=,mid;
while(L<=R){
mid=(L+R>>);
if(t[mid]<ti) tk=mid,L=mid+;
else R=mid-;
}
return tk;
}
LL gt_ans(LL ti){
pos=find(ti),num=pre[m]-pre[pos]-((m-pos)*ti);
res=(pos*ti)-pre[pos],ps=findt(ti);
if(ti>=t[]) sum=(ps*ti-st[ps])*C;
else sum=;
if(num<=res) sum+=num*min(A,B);
else sum+=(num-res)*B+res*min(A,B);
return sum;
}
int main(){
A=read(),B=read(),C=read();
n=read(),m=read();
memset(&ans,0x7f,sizeof(LL));
for(LL i=;i<=n;i++) t[i]=read();
for(LL i=;i<=m;i++) p[i]=read();
sort(t+,t+n+),sort(p+,p+m+),maxn=p[m];
for(LL i=;i<=n;i++) st[i]=st[i-]+t[i];
for(LL i=;i<=m;i++) pre[i]=pre[i-]+p[i];
if(C>inf) ans=gt_ans(t[]);
else for(LL i=;i<=maxn;i++) cst=gt_ans(i),ans=min(ans,cst);
printf("%lld\n",ans);
return ;
}

[SHOI2017]期末考试的更多相关文章

  1. bzoj4868: [Shoi2017]期末考试(三分法)

    4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...

  2. NC20439 [SHOI2017]期末考试

    NC20439 [SHOI2017]期末考试 题目 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布.第 \(i\) 位同学希望在第 \ ...

  3. bzoj 4868: [Shoi2017]期末考试

    Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...

  4. [bzoj4868][Shoi2017]期末考试

    来自FallDream 的博客,未经允许,请勿转载,谢谢. 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在 ...

  5. BZOJ4868:[SHOI2017]期末考试——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4868 题目复制于洛谷:https://www.luogu.org/problemnew/show/P ...

  6. 【bzoj4868】[Shoi2017]期末考试 前缀和+暴力

    题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...

  7. BZOJ-1- 4868: [Shoi2017]期末考试-三分

    三分出成绩时间,假设当前出成绩最优,那么提前就会调增老师,增加不愉快度多于少等待的:如果延迟时间. 那么等待更久,增加的不愉快度也将多余少调增剩省下的. 于是:对于当前点,两边都是有单调性的. 就是说 ...

  8. BZOJ4868 [Shoi2017]期末考试 【三分 + 贪心】

    题目链接 BZOJ4868 题解 最后的答案决定于最后一个公布的成绩 显然这个是答案关于这个时间点是呈凸单调的 三分一下这个时间点 时间点固定,在这个时间前的人都会产生不愉快度,在这个时间前的科目可以 ...

  9. BZOJ4868 Shoi2017期末考试(三分+贪心)

    容易想到枚举最晚发布成绩的课哪天发布,这样与ti和C有关的贡献固定.每门课要么贡献一些调节次数,要么需要一些调节次数,剩下的算贡献也非常显然.这样就能做到平方级别了. 然后大胆猜想这是一个凸函数三分就 ...

随机推荐

  1. WebView加载URL跳转到系统浏览器的解决方法

    1.问题 webview加载url跳转到系统浏览器,用户体验非常的差 2.解决方法 重写WebViewClient的shouldOverrideUrlLoading(WebView view, Str ...

  2. PopupWindowFromBottom 从底部弹出popupwindow

    自定义PopupWindowFromBottom public class PopupWindowFromBottom extends PopupWindow { public PopupWindow ...

  3. js校验密码强度

    网上转载的一段代码,留着以后用, js文件: //判断输入密码的类型 function CharMode(iN){ if (iN>=48 && iN <=57) //数字 ...

  4. 【BZOJ4804】欧拉心算 莫比乌斯反演+线性筛

    [BZOJ4804]欧拉心算 Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N<=10 ...

  5. 九度OJ 1190:大整数排序 (大数运算、排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3219 解决:1467 题目描述: 对N个长度最长可达到1000的数进行排序. 输入: 输入第一行为一个整数N,(1<=N<=1 ...

  6. Kafka具体解释二、怎样配置Kafka集群

    Kafka集群配置比較简单,为了更好的让大家理解.在这里要分别介绍以下三种配置 单节点:一个broker的集群 单节点:多个broker的集群 多节点:多broker集群 一.单节点单broker实例 ...

  7. C#基础知识之三

    C#基础知识之三 1.  程序集间的继承:基类必须被声明为public.必须在project中包含对该基类的程序集引用. 2.  对其它程序集引用和添加对using指令的差别:前者是告诉编译器所需的类 ...

  8. python学习-3.一些常用模块用法

    一.time.datetime 时间戳转化为元组 1 >>> time.localtime() 2 time.struct_time(tm_year=2016, tm_mon=8, ...

  9. 【leetcode刷提笔记】Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  10. Spark Mllib源码分析

    1. Param Spark ML使用一个自定义的Map(ParmaMap类型),其实该类内部使用了mutable.Map容器来存储数据. 如下所示其定义: Class ParamMap privat ...