ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-05-26 18:54:17  阅读:299  来源: 互联网

标签:太菜 二分 代码 t2 mid t1 SB SHOI2015 define


点此看题面

大致题意: 给出自动刷题机的\(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;//判无解
}

标签:太菜,二分,代码,t2,mid,t1,SB,SHOI2015,define
来源: https://www.cnblogs.com/chenxiaoran666/p/BZOJ4590.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有