zoukankan      html  css  js  c++  java
  • bzoj4590: [Shoi2015]自动刷题机

    bzoj4590: [Shoi2015]自动刷题机

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 32  Solved: 13
    [Submit][Status][Discuss]

    Description

    曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置。自动
    刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序,每秒,自动刷题机的代码生成模
    块会有两种可能的结果:
    A.写了x行代码。
    B.心情不好,删掉了之前写的y行代码。(如果y大于当前代码长度则相当于全部删除。)
    对于每个OJ所有题目,存在某个固定的长度n>0。一旦自动刷题机在某秒结束时积累了大于等于n行的代码,它就会
    自动提交并AC此题,然后新建一个文件开始写下一题。SHTSC在某个OJ上跑了一天的自动刷题机,得到了很多条关
    于写代码的日志信息。他突然发现自己没有记录这个OJ的n究竟是多少。所幸他通过自己在OJ上的Rank知道了机一
    共切了k道题。希望你计算n可能的最小值和最大值。

    Input

    第一行两个整数l,k,表示刷题机的日志一共有l行,一共了切了k题。
    第二行l个整数,x1…xl。xi>=0表示写了xi行代码。xi<0表示删除了这道题的-xi行代码。
    1<=l,k<=100000,|xi|<=10^9

    Output

    输出两个数a,b。分别代表n可能的最小值和最大值。如果不存在这样的n则输出-1。
     

    Sample Input

    4 2
    2
    5
    -3
    9

    Sample Output

    3 7
    //样例1:如果n=2那么刷题机就会切掉3题。但如果n>7刷题机最多只能切1题。考虑n=4发生了什么。
    第一秒:刷题机写了2行。
    第二秒:刷题机又写了5行,共有7行,提交,自信AC。
    第三秒:刷题机删掉了3行,共有0行。
    第四秒:刷题机写了9行,共有9行,提交,自信AC。
    一共AC了两题。

    HINT

     

    Source

    一眼二分...然后调了一个中午最后发现是上界炸了...

    卡了一发常数还是玩不过#1 TAT....

     1 #include<bits/stdc++.h>
     2 #define N 102333
     3 #define rep(i,l,r) for(int i=l;i<=r;i++)
     4 using namespace std;
     5 typedef long long ll;
     6 int s[N],n,m;
     7 ll sum,maxx;
     8 bool flag;
     9 inline int read() {
    10      register int x=0,ch=getchar(),f=1;
    11      while(ch<'0' || ch>'9') {
    12           if(ch=='-') f=-1; ch=getchar();
    13      }
    14      while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar();
    15      return x*f;
    16 }
    17 ll get(ll x) {
    18      ll l=1,r=maxx;
    19      ll now,sum,ans=maxx;
    20      while(l<=r) {
    21           register ll mid=(l+r)>>1;
    22           now=sum=0; 
    23           rep(i,1,n) {
    24                now+=(ll)s[i];if(now<0) now=0; 
    25                if(now>=mid) ++sum,now=0;
    26           }
    27           if(sum==x) ans=min(ans,mid),flag=1;
    28           if(sum<=x) r=mid-1;else l=mid+1;
    29      }
    30      return ans;
    31 }
    32 ll get1(ll x) { 
    33     ll l=1,r=maxx;
    34     ll now,sum,ans=0;
    35     while(l<r) {
    36           register ll mid=(l+r+1)>>1;
    37           now=sum=0; 
    38           rep(i,1,n) {
    39                now+=(ll)s[i]; if(now<0) now=0;
    40                if(now>=mid) ++sum,now=0;
    41           }
    42           if(sum<x) r=mid-1;else l=mid;
    43      }
    44      return l;
    45 }
    46 
    47 int main () {
    48      scanf("%d%d",&n,&m);
    49      rep(i,1,n) s[i]=read(),maxx+=(ll)abs(s[i]);
    50      ll A=get(m),B=get1(m);
    51      if(!flag) puts("-1");else printf("%lld %lld
    ",A,B);
    52 }
    View Code
  • 相关阅读:
    delphi调用存储过程
    mysql存储过程中使用事务
    高性能JAVA开发之内存管理
    高效的找出两个List中的不同元素
    The reference to entity "characterEncoding" must end with the ';' delimiter
    Maven的安装、配置及使用入门
    如何在电脑上测试手机网站(全)
    三种常用的js数组去重方法
    oracle ORA-01461 错误 can bind a LONG value only for insert into a LONG column
    windows cmd下netstat查看占用端口号的进程和程序
  • 原文地址:https://www.cnblogs.com/Bloodline/p/5498023.html
Copyright © 2011-2022 走看看