NOIP2012 Day2 借教室-二分答案+差分


我 我 我 我怎么就想不起來二分答案呢…
老規矩先上原題http://codevs.cn/problem/1217/
然后是我看的題解http://www.cnblogs.com/iwtwiioi/p/3536121.html
真的是 相當水的二分答案啊..(雖然我沒想到ORZ)
但是題解的喪病加速還是給了我驚喜23333

上我的蒟蒻代碼
因為犯懶所以全用的long long

#include<cstdio>
#include<iostream>
#define MID (l+r)>>1
#define maxn 1000005
using namespace std;
long long n,m,c[maxn],d[maxn],s[maxn],t[maxn],l,r,mid,sum[maxn],tmp,last;
bool check(int x){
tmp=0;
for(int i=1;i<=n;++i){
tmp+=sum[i];
if(tmp>c[i])return false;
}
return true;
}
void add(int i,int j){
for(;i<=j;++i){
sum[s[i]]+=d[i];
sum[t[i]+1]-=d[i];
}
return ;
}
void cancel(int i,int j){
for(;i<=j;++i){
sum[s[i]]-=d[i];
sum[t[i]+1]+=d[i];
}
return ;
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)scanf("%lld",&c[i]);

l=1;r=m;mid=MID;
for(int i=1;i<=mid;++i)scanf("%lld%lld%lld",&d[i],&s[i],&t[i]);
last=mid;
add(l,mid);
while(l<r){
if(check(mid)){
l=mid+1;
mid=MID;
if(last<mid){
for(int i=last+1;i<=mid;++i)scanf("%lld%lld%lld",&d[i],&s[i],&t[i]);
last=mid;
}
add(l,mid);

}
else {
r=mid;
mid=MID;
cancel(mid+1,r);
}
}
if(check(l))printf("%d\n",0);
else printf("%d\n%lld\n",-1,l);


return 0;
}

這道題..沒什么好說的啊..注意注意二分寫法吧..
我又水了一期題解。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com