zoukankan      html  css  js  c++  java
  • 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])<<'
    ';
    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<<'
    ';
    81     }
    82 }
    83 int main()
    84 {
    85     data_in();
    86     work();
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    uvm_reg_map——寄存器模型(八)
    uvm_reg_block——寄存器模型(七)
    mysql_secure_installation 安全安装(用于生产环境设置)
    一键安装nginx-1.12.2
    nginx优化之隐藏版本号
    shell script 之六:循环 while
    shell script 之五:循环控制 for
    shell script 之四:流程控制 if 分支语句
    shell script 之三:打印输出 echo printf
    shell script 之一:变量和赋值
  • 原文地址:https://www.cnblogs.com/KKKorange/p/8728362.html
Copyright © 2011-2022 走看看