codevs1217借教室 差分基础裸题
2016-11-17 21:14
246 查看
差分,相当好写啊。(一个for循环的事
假如有一段区间要修改,你没有必要一个个用for去修改个值,用一个数组在该位置修改权值,到结束时再修改回来。
裸二分,加个差分就A了
假如有一段区间要修改,你没有必要一个个用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); }
相关文章推荐
- codevs 1217 借教室
- 【题解】CodeVS1217 NOIP2011D2T2借教室
- 【codevs1217】【noip2012提高day2T2】借教室——线段树做法
- 【NOIP2012】codevs1217 借教室
- codevs1217 luogu1083 借教室
- codevs 1217 借教室
- [Codevs] 1217 借教室
- codevs1217 luogu1083 借教室
- 【NOIP2012】 CODE[VS] 1217 借教室(线段树维护区间最小值)
- 借教室(codevs 1217)
- 【基础练习】【差分】codevs1242 布局题解
- 【基础练习】【倍增LCA】codevs1503 愚蠢的宠物
- 【基础练习】【线性DP+离散化】codevs1105 过河题解
- 【基础练习】【SPFA】codevs1557 热浪题解
- 【基础练习】【模拟】codevs1704 卡片游戏题解
- 【基础练习】【堆】codevs1063 合并果子题解
- 【基础练习】【搜索】codevs1008 选数题解
- 【基础练习】【区间DP】codevs1090 加分二叉树题解
- 【基础练习】【组合数+快速幂】codevs1137 计算系数题解
- 【基础练习】【二分】codevs2188 最长上升子序列(限定元素)题解