码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ4045 : [Cerc2014] bricks

时间:2015-08-03 06:27:24      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

首先求出B和W的个数,如果只出现了一种那么直接输出sum(k)。

否则依次扫描,能割就割,时间复杂度$O(n)$。

 

#include<cstdio>
#define N 100010
typedef long long ll;
int T,n,i,a[N],b[N],c[2],d[2],ans;ll x;char s[2];
int main(){
  scanf("%d",&T);
  while(T--){
    scanf("%d",&n);
    c[0]=c[1]=d[0]=d[1]=ans=0;
    for(i=1;i<=n;i++)scanf("%d%s",&b[i],s),a[i]=s[0]==‘B‘,c[a[i]=s[0]==‘B‘]+=b[i];
    if(!c[0]||!c[1]){printf("%d\n",c[0]+c[1]);continue;}
    for(i=1;i<=n;i++){
      x=(ll)c[a[i]]*d[a[i]^1]-(ll)d[a[i]]*c[a[i]^1];
      if(x%c[a[i]^1]||x<=0||x/c[a[i]^1]>b[i])d[a[i]]+=b[i];
      else ans++,d[a[i]]=b[i]-x/c[a[i]^1],d[a[i]^1]=0;
    }
    printf("%d\n",ans);
  }
  return 0;
}

  

BZOJ4045 : [Cerc2014] bricks

标签:

原文地址:http://www.cnblogs.com/clrs97/p/4697203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!