第一次不用翻译来打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;
}