首页 > 代码库 > 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;
}