BZOJ 4868 SHOI2017 期末考试

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4868

 

题意概述:抱歉今天的我比较懒......

 

分析:

  我都不知道当时我的大脑发生了什么为什么没有把这个弱智题切掉ORZ

  假设我们最后需要在第i天完成所有的批改,可以在预处理过之后O(1)算出答案。

  不难发现这个问题的最优解具有单峰函数的性质,可以三分答案。

  所以这个sb题当时为什么没有做出来?!

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #include<set>
 9 #include<map>
10 #include<vector>
11 #include<cctype>
12 using namespace std;
13 const int maxn=100005;
14 typedef long long LL;
15 
16 int A,B,N,M,t[maxn],b[maxn],c[maxn];
17 LL C,t1[maxn],t2[maxn],s[maxn];
18 
19 void _scanf(int &x)
20 {
21     x=0;
22     char c=getchar();
23     while(c<'0'||c>'9') c=getchar();
24     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
25 }
26 void data_in()
27 {
28     _scanf(A);_scanf(B);cin>>C;_scanf(N);_scanf(M);
29     for(int i=1;i<=N;i++) _scanf(t[i]);
30     for(int i=1;i<=M;i++) _scanf(b[i]);
31 }
32 LL calc(int p){
33     LL re=s[p]*C,rest=t2[p];
34     if(A<B){
35         re+=min(rest,t1[p])*A;
36         rest-=min(rest,t1[p]);
37     }
38     re+=rest*B;
39     return re;
40 }
41 void msort(int *a,int l,int r)
42 {
43     int m=0,cnt=l;
44     for(int i=l;i<=r;i++)
45         if(a[i]>m) m=a[i];
46     for(int i=0;i<=m;i++) c[i]=0;
47     for(int i=l;i<=r;i++) c[a[i]]++;
48     for(int i=0;i<=m;i++)
49         while(c[i]) a[cnt++]=i,c[i]--;
50 }
51 void work()
52 {
53     msort(t,1,N);
54     msort(b,1,M);
55     int cnt=1;
56     for(int i=1;i<=max(t[N],b[M]);i++){
57         while(t[cnt]<i&&cnt<=N) cnt++;
58         s[i]=s[i-1]+cnt-1;
59     }
60     cnt=1;
61     for(int i=1;i<=b[M];i++){
62         while(b[cnt]<i&&cnt<=M) cnt++;
63         t1[i]=t1[i-1]+cnt-1;
64     }
65     cnt=M;
66     for(int i=b[M];i>=1;i--){
67         while(b[cnt]>i&&cnt>=1) cnt--;
68         t2[i]=t2[i+1]+M-cnt;
69     }
70     if(C==1e16) cout<<calc(t[1])<<'\n';
71     else{
72         int L=1,R=b[M]+1,m1,m2,d;
73         while(R-L>5){
74             d=(R-L)/3,m1=L+d,m2=R-d;
75             if(calc(m1)<calc(m2)) R=m2;
76             else L=m1+1;
77         }
78         LL ans=calc(L);
79         for(int i=L+1;i<R;i++) ans=min(ans,calc(i));
80         cout<<ans<<'\n';
81     }
82 }
83 int main()
84 {
85     data_in();
86     work();
87     return 0;
88 }
View Code

 

转载于:https://www.cnblogs.com/KKKorange/p/8728362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值