您的位置:首页 > 其它

codevs1217借教室 差分基础裸题

2016-11-17 21:14 246 查看
差分,相当好写啊。(一个for循环的事

假如有一段区间要修改,你没有必要一个个用for去修改个值,用一个数组在该位置修改权值,到结束时再修改回来。



裸二分,加个差分就A了

#include<cstdio>
#include<cstdlib>
#include<cstring>
const int MAXN = 1000011;
struct wyh{
int l,r,v;
}a[MAXN];
int n,m;
int w[MAXN];
int d[MAXN];
int gi(){
int w=0; char c=getchar(); bool q=0;
while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar();
while (c>='0' && c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
}
bool check(int x){
memset(d,0,sizeof(d));
for(int i=1;i<=x;i++) d[a[i].l]+=a[i].v,d[a[i].r+1]-=a[i].v;
int now=0;  for(int i=1;i<=n;i++) { now+=d[i]; if(now>w[i]) return false;  }
return true;
}
int main(){
n=gi(),m=gi();
for(int i=1;i<=n;i++) w[i]=gi();
for(int i=1;i<=m;i++) a[i].v=gi(),a[i].l=gi(),a[i].r=gi();
int l=1,r=m,ans=0;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)) l=mid+1,ans=mid; else r=mid-1;
}
if(check(m)) printf("0"); else printf("-1\n%d\n",ans+1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: