zoukankan      html  css  js  c++  java
  • 「Poetize10」封印一击

    描述 Description
    Nescafe由n种元素组成(编号为1~n), 第i种元素有一个封印区间[ai,bi]。当封印力度E小于ai时,该元素将获得ai的封印能量;当封印力度E在ai到bi之间时,该元素将获得E的封印 能量;而当封印力度E大于bi时,该元素将被破坏从而不能获得任何封印能量。现在圣主applepi想选择恰当的E,使得封印获得的总能量尽可能高。为了 封印的最后一击尽量完美,就请你写个程序帮他计算一下吧!
    题解:
    首先必须离散化,然后差分可以算出在区间外且<a[i]的总得分,再差分一次可以算出每个点被区间覆盖了几次,然后就是统计了。
    代码:
     1 #include<cstdio>
     2 
     3 #include<cstdlib>
     4 
     5 #include<cmath>
     6 
     7 #include<cstring>
     8 
     9 #include<algorithm>
    10 
    11 #include<iostream>
    12 
    13 #include<vector>
    14 
    15 #include<map>
    16 
    17 #include<set>
    18 
    19 #include<queue>
    20 
    21 #include<string>
    22 
    23 #define inf 1000000000
    24 
    25 #define maxn 1000000
    26 #define maxm 500+100
    27 
    28 #define eps 1e-10
    29 
    30 #define ll long long
    31 
    32 #define pa pair<int,int>
    33 
    34 #define for0(i,n) for(int i=0;i<=(n);i++)
    35 
    36 #define for1(i,n) for(int i=1;i<=(n);i++)
    37 
    38 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    39 
    40 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    41 
    42 #define mod 1000000007
    43 
    44 using namespace std;
    45 
    46 inline int read()
    47 
    48 {
    49 
    50     int x=0,f=1;char ch=getchar();
    51 
    52     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    53 
    54     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    55 
    56     return x*f;
    57 
    58 }
    59 struct rec{ll x,y;}b[maxn];
    60 ll n,a[maxn],s[3][maxn],c[maxn];
    61 inline bool cmp(rec a,rec b){return a.x<b.x;}
    62 
    63 int main()
    64 
    65 {
    66 
    67     freopen("input.txt","r",stdin);
    68 
    69     freopen("output.txt","w",stdout);
    70 
    71     n=read();
    72     for1(i,n)a[(i<<1)-1]=read(),a[i<<1]=read();
    73     for1(i,n<<1)b[i].x=a[i],b[i].y=i;
    74     sort(b+1,b+2*n+1,cmp);
    75     int tot=0;
    76     for1(i,n<<1)
    77     {
    78         if(i==1||b[i].x!=b[i-1].x)tot++;
    79         a[b[i].y]=tot;c[tot]=b[i].x;
    80     }
    81     for1(i,n)
    82     {
    83        int l=a[(i<<1)-1],r=a[i<<1];
    84        s[1][1]+=c[l];s[1][l]-=c[l];
    85        s[2][l]++;s[2][r+1]--;
    86     }
    87     int ans=0;
    88     for1(i,tot+1)
    89     {
    90         s[1][i]+=s[1][i-1];s[2][i]+=s[2][i-1];
    91         if(s[1][i]+s[2][i]*c[i]>s[1][ans]+s[2][ans]*c[ans])ans=i;
    92     }
    93     printf("%lld %lld
    ",c[ans],s[1][ans]+s[2][ans]*c[ans]);
    94     return 0;
    95 
    96 }
    View Code
  • 相关阅读:
    C# 上传图片前判断上传图片的宽和高
    PHP调用WebService
    js判断输入字符串长度(汉字算两个字符,字母数字算一个)
    js 验证电话号 座机及手机号
    C# 微信扫码支付 回调页面
    复制文件夹及文件
    html失去获得焦点
    SQL 大数据查询如何进行优化?
    sql表内存占用情况,并进行缩放
    查询被锁的表
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4036948.html
Copyright © 2011-2022 走看看