Codeforces Round #461 (Div. 2)

Div2 都不能A完,手速还是不行

A题:

#include<cstdio>
using namespace std;
int x,y,_x,_y;
int main(void){
    register int i;
    scanf("%d%d",&x,&y);
    if(y==0){
        puts("No");
        return 0;
    }
    _x=0,_y=1;
    _y=y,_x=y-1;
    if(x<_x){
        puts("No");
        return 0;
    }else{
        if(((x-_x)%2)==0)puts("Yes");
        else puts("No");
    }
    return 0;
}

B题:

#include<cstdio>
using namespace std;
int n,y;
long long ans;
int main(void){
    register int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j){
            y=i^j;
            if(y>n)continue;
            if(i+j>y&&j+y>i&&i+y>j)++ans;
        }
    printf("%d\n",ans/6);
    return 0;
}

C题:

#include<cstdio>
#include<algorithm>
using namespace std;
unsigned long long n,k,sum=1;
int main(void){
    register int i;
    scanf("%llu%llu",&n,&k);
    for(i=1;i<=k;++i)
        if(n%i!=i-1){
            puts("No");
            return 0;
        }
    puts("Yes");
    return 0;
}

D题:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Y{
    long long x,y;
    inline bool operator<(const Y&a)const{
        return x*a.y>a.x*y;
    }
}a[200005];
int n;
long long ans,sumh,sum;
char s[200005];
int main(void){
    register int i,j,len;
    scanf("%d",&n);
    for(i=1;i<=n;++i){
        scanf("%s",s+1);
        len=strlen(s+1);
        for(j=1;j<=len;++j)
            if(s[j]=='s')a[i].x+=1;
            else a[i].y+=1,++sumh,++sum;
        for(j=1;j<=len;++j)
            if(s[j]=='s'){
                ans+=sumh;
            }else --sumh;
    }
    sort(a+1,a+n+1);
    for(i=1;i<=n;++i)
        sum-=a[i].y,ans+=a[i].x*sum;
    printf("%lld\n",ans);
    return 0;
}

E题:
nc2  dp  

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
inline char tc(void){
    static char fl[10000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,10000,stdin),A==B)?EOF:*A++;
}
inline ll read(void){
    ll a=0;char c;
    while((c=tc())<'0'||c>'9');
    while(c>='0'&&c<='9')a=a*10+c-'0',c=tc();
    return a;
}
ll n,W,B,X,sum,c[1005],last,cost[1005],l,r,mx,ans,a[10005],b[10005];
ll f[1005][10005];
int main(void){
    ll i,j;
    n=read(),W=read(),B=read(),X=read();
    for(i=1;i<=n;++i)c[i]=read();
    for(i=1;i<=n;++i)cost[i]=read();
    memset(f,0xff,sizeof(f)),f[0][0]=W-X;
    for(i=1;i<=n;++i){
        l=1,r=0,sum+=c[i],last=sum,mx=0;
        for(j=0;j<=sum;++j){
            if(j<=last){
                if(f[i-1][j]!=-1||i-1==0&&j==0){
                    ll x;
                    f[i-1][j],x=min(f[i-1][j]+X,W+j*B)+j*cost[i];//mx=max(mx,f[i-1][j]+X);
                    while(l<=r&&x>=a[r])--r;
                    a[++r]=x,b[r]=j;
                }
            }
            while(l<=r&&b[l]+c[i]<j)++l;
            if(l<=r&&a[l]>=j*cost[i])f[i][j]=a[l]-j*cost[i];
        }
    }
    for(i=1;i<=n;++i)
        for(j=0;j<=sum;++j)
            if(f[i][j]!=-1)
                ans=max(ans,j);
    printf("%lld\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值