第一次不用翻译来打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 : [email protected] > 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 : [email protected] > 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; }
CF#248A、B题题解
时间: 2024-10-25 17:40:09