我 我 我 我怎么就想不起来二分答案呢…
老规矩先上原题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;
}
这道题..没什么好说的啊..注意注意二分写法吧..
我又水了一期题解。