CF#248A、B题题解

4 篇文章 0 订阅

第一次不用翻译来打CF,中国人的英文有共鸣啊^_^

不过没做出C题,很可惜啊.D题看了不敢碰,我对mod10^9+7的题目有阴影...

A题,题意是一堆苹果,能不能分成两堆一样重的,我一开始没读清楚题目,拍了个背包(以总和一般作背包容量是否能刚好装满),后来看真一点,才发现只有两种重量的,一种是100,一种是200。之后我就YY了,是不是sum%200==0就输出YES,否则就是NO。。我还无耻地交了,获得了一个WA,马上想明白了,200,200,200明显即不对啦。之后继续YY…思路就是计算200的有多少个,记做cnt1,100的有多少个,记做cnt2。

如果cnt1%2==0,判断cnt1%2==0,能YES,否NO

否则 判断cnt<2,是,输出NO,

         否则 判断(cnt-2)%2==0,是输出YES(就是用两个100的苹果充当一个200的)

                  否则 输出NO

代码:

/*************************************************************************
	> OS     : Linux 3.2.0-60-generic #91-Ubuntu
	> Author : yaolong
	> Mail   : dengyaolong@yeah.net 
	> Created Time: 2014年05月24日 星期六 14:52:20
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
   int tmp, n,i,sum=0;
    cin>>n;
    int cnt1=0,cnt2=0;
    for( i=0;i<n;i++){
        cin>>tmp;
        if(tmp==100){
            cnt1++;
        }else{
            cnt2++;
        }
    }
    if(cnt2%2==0){
        if(cnt1%2==0){
            puts("YES");
        }else{
            puts("NO");
        }
    }else{
        if(cnt1>=2){
            cnt1-=2;
            if(cnt1%2==0){
                puts("YES");
            }else{
                puts("NO");
            }

        }else{
            puts("NO");
        }

    }
    
    return 0;
}

B题,一种强烈的线段树的味道……不过是两"棵"线段树。一棵是没排序的,一棵是排序的!之前看胡浩大神的线段树,

官方做法好想是做了预处理,计算a[k]=sum(1~k),之后计算sum[l,r]时候就是a[r]-a[l-1],显然我是弄麻烦了~不过算了。。 done is better than perfect.贴我的代码吧..

/*************************************************************************
	> OS     : Linux 3.2.0-60-generic #91-Ubuntu
	> Author : yaolong
	> Mail   : dengyaolong@yeah.net 
	> Created Time: 2014年05月24日 星期六 14:52:45
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 123456
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
long long  sum[2][N<<4],stmp[N];
void PushUP(int type,int rt){
    sum[type][rt]=sum[type][rt<<1]+sum[type][rt<<1|1];
}
int cnt=0;
void Build(int rt,int l,int r){
    
    if(l==r){
        int tmp;
        scanf("%d",&tmp);
        sum[0][rt]=stmp[cnt]=tmp;
        cnt++;
        
        return ;
    }
    int m=(l+r)>>1;
    Build(lson);
    Build(rson);
    PushUP(0,rt);
}
long long  Query(int type,int L,int R,int rt,int l,int r){
    if(L<=l&&r<=R){
        return sum[type-1][rt];
    }
    int m=(l+r)>>1;
    long long ans=0;
    if(L<=m) ans+=Query(type,L,R,lson);
    if(R>m) ans+=Query(type,L,R,rson);
    return ans;
}
void Build2(int rt,int l,int r){ //sort了之后的
    if(l==r){
        sum[1][rt]=stmp[cnt];
        cnt++;
        
        return ;
    }
    int m=(l+r)>>1;
    Build2(lson);
    Build2(rson);
    PushUP(1,rt);

}
int main(){
    int n;
    scanf("%d",&n);
    Build(1,1,n);
    sort(stmp,stmp+cnt);
    cnt=0;
    Build2(1,1,n);
    int M,t,lt,rt;
    scanf("%d",&M);
    while(M--){
        scanf("%d%d%d",&t,<,&rt);
        cout<<Query(t,lt,rt,1,1,n)<<endl;
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值