SRM 539 DIV1 Easy - Over9000Rocks

問題


http://community.topcoder.com/stat?c=problem_statement&pm=11855&rd=14731

解き方


9000以上となる数をすべて保存しては間に合わないので、
その始点と終点のみ保存してあげて、その間の範囲を計算していくことで
メモリ、計算量ともに制限内で解くことができる。

コード


pair<int,int> p[1000000];

class Over9000Rocks {

public: int countPossibilities(vector<int> lowerBound, vector<int> upperBound) {
int n=lowerBound.size();

int m=0;

for(int mask=1;mask<(1<<n);mask++){
int minx=0,maxx=0;
FORE(i,0,n)if(mask&(1<<i)){
minx+=lowerBound[i];
maxx+=upperBound[i];
}
minx=max(minx,9001);
if(minx<=maxx){
p[m++]=make_pair(minx,1);
p[m++]=make_pair(maxx+1,-1);
}
}
sort(p,p+m);

int ret=0,cur=0;
FORE(i,0,m){
cur+=p[i].second;
if(cur!=0)ret+=p[i+1].first-p[i].first;
}

return ret;
}

};

Share this

Related Posts

Previous
Next Post »