• 【BZOJ4590】[SHOI2015] 自动刷题机(SB题都能写挂的我实在太菜)


    点此看题面

    大致题意: 给出自动刷题机的(n)次操作:写了(x)行代码;删去(x)行代码(若当前没有(x)行相当于全部删除)。每当代码行数大于等于(n)时就会清空代码并提交(AC)一道题,已知(AC)的题数,求(n)的范围。

    前言

    这种(SB)题,就因为写二分时懒了一点,结果导致判错无解写挂,感觉今天码力真的是特别差。

    趁这个机会又去学了学#define一些更高级、更有趣的使用方式。发现以前用了这么久的#define完全就停留在最基本的层次,真正好用的地方竟是一个都不知道。(我相信从今以后#define会在我的代码中占越来越大的比例

    大致思想

    显然就一个,呸,两个二分就完事了,一个二分下界,一个二分上界,具体实现直接详见代码吧,也不想啰嗦了。

    我写二分懒得去记(ans),结果一开始判错无解是真的智障。最后发现好像按我的写法两个二分的下界似乎要分别设为(1)(0)才可以?

    代码

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 100000
    #define LL long long
    using namespace std;
    int n,m,a[N+5];
    #define DefineCheck(id,op)
    	I bool Check##id(Con LL& x)
    	{
    		RI i,t=0;LL p=0;for(i=1;i<=n;++i) (p+=a[i])<0&&(p=0),p>=x&&(p=0,++t);
    		return t op m;
    	}//#define大法好,本来要写两个Check(),由于就最后比大小的符号不同,可以使用#define
    DefineCheck(1,<=);DefineCheck(2,>=);//定义Check()
    int main()
    {
    	RI i;LL l,r,mid,t1,t2;for(scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%d",a+i);//读入
    	l=1,r=1e18;W(l<r) Check1(mid=l+r-1>>1)?r=mid:l=mid+1;t1=r;//第一个二分
    	l=0,r=1e18;W(l<r) Check2(mid=l+r+1>>1)?l=mid:r=mid-1;t2=l;//第二个二分
    	return t1>t2?puts("-1"):printf("%lld %lld",t1,t2),0;//判无解
    }
    
  • 相关阅读:
    VS2010如何以管理员权限启动? 转载
    ArcGIS属性编辑字符型字段值出现乱码问题
    点批量移动到线上(ArcGis版) 转载
    C#判断数据库中取出的字段值是否为空(NULL) .
    方框内打勾(钩)的符号(word和excel)
    C# 获取屏幕的大小
    神通数据库的备份和还原
    推荐系列文章:《DotText源码阅读》
    Lucene.Net 2.3.1开发介绍 —— 阅读索引(转载)
    Lucene.Net:使用eaglet的盘古分词进行分词和搜索(转载)
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/BZOJ4590.html
Copyright © 2020-2023  润新知