首页 > 代码库 > Codeforces Round #262 (Div. 2) 总结:二分
Codeforces Round #262 (Div. 2) 总结:二分
B. Little Dima and Equation
思路:本来前两题都很快做出来的,然后觉得ranting应该可以增加了。然后觉得代码没问题了,又想到了一组cha人的数据,然后就锁了,然后刚锁就被别人cha了看了代码才发现尼玛忘了判断小于10^9了,然后C反正想了好多种方法都不会就没心情了,就这样rating又降了
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 6 #define maxn 10005 typedef long long ll; typedef unsigned long long ull; using namespace std; int i,j; ll k,a,b,c,sum,n,m; double aa,bb,cc,sum1; string s,ss,str; ll abc(ll x) { ll sum=0; while(x) { sum+=x%10; x/=10; } return sum; } ll go(ll f) { ll sum=1; for(int i=0;i<a;i++) sum*=f; return sum; } ll nn[100010],mm=1000000000; int main() { cin>>a>>b>>c; for(i=1;i<82;i++) { sum=go(i)*b+c; n=sum; if(abc(sum)==(ll)i) nn[j++]=sum; } printf("%d\n",j); for(i=0;i<j;i++) { if(i!=j-1) cout<<nn[i]<<' '; else cout<<nn[i]<<endl; } return 0; }
C. Present
而且题解里面说了,像这种求最小的最大一般都是二分,唉……自己太弱了根本没想到啊,因为又是区间的更加没有想到了。
从头往前扫,第一个不足x的肯定需要增加x-a[i],那么肯定它作为连续的一段的最左边,那么把这一段的a[i]都加上x-a[i],继续扫描第一个不足x的,就这么简单。。。
但是搞了一晚上才过,尼玛,原来二分的时候把r=INF了,然后因为可能要加上a[i]然后就超了int了,但是我全部换成long long 竟然不对,老是在第十五个样例WA,不知道怎么回事,改了又交了好多发依然WA不止,后面还是改成r=1100000000才行,这个加上a[i]正好在int边界那,所以才A。晕……
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 0x7fffffff #define maxn 200005 typedef long long ll; typedef unsigned long long ull; using namespace std; int n,m,w,a[maxn],b[maxn]; bool check(ll mid) { int sum=0,cnt=0; mem(b,0); for(int i=0;i<n;i++) { sum+=b[i]; if(sum+a[i]<mid) { cnt+=mid-(sum+a[i]); if(cnt>m) return false; b[i+w]-=mid-(sum+a[i]); sum+=mid-(sum+a[i]); } } return true; } int binary() { int l=1,r=1100000000,mid; while(l<=r) { mid=(l+r)>>1; if(check(mid)) l=mid+1; else r=mid-1; } return r; } int main() { cin>>n>>m>>w; for(int i=0;i<n;i++) cin>>a[i]; cout<<binary()<<endl; return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。