https://www.luogu.org/problem/show?pid=1083#sub

一开始容易想到的方法是线段树,每次修改时,如果出现负数,那么当前这个人一定不能满足了。
但是在noip里,这肯定不是正解,所以会超时那么一两个点。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<stdlib.h>
#define M 1000000
using namespace std;
int n,m,cnt;
int a[M+100];
struct H{int x,l,r,len,addi;
}st[5*M];
inline int read()
{int data=0,w=1; char ch=0;while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') w=-1,ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data*w;
}
void build(int o,int l,int r)
{st[o].l=l,st[o].r=r,st[o].len=r-l+1;if(l==r){st[o].x=a[l];return;}int mid=(l+r)>>1;build(o<<1,l,mid);build(o<<1|1,mid+1,r);st[o].x=min(st[o<<1].x,st[o<<1|1].x);
}
void pushdown(int o)
{st[o<<1].addi+=st[o].addi;st[o<<1|1].addi+=st[o].addi;st[o<<1].x+=st[o].addi;st[o<<1|1].x+=st[o].addi;   st[o].addi=0;
}
void add(int o,int ql,int qr,int ax)
{int l=st[o].l,r=st[o].r,mid=(l+r)>>1;if(l==ql&&r==qr){st[o].addi+=ax;st[o].x+=ax;if(st[o].x<0){printf("-1\n%d",cnt);exit(0);}return;}if(st[o].addi) pushdown(o);if(qr<=mid) add(o<<1,ql,qr,ax);else if(ql>mid) add(o<<1|1,ql,qr,ax);else add(o<<1,ql,mid,ax),add(o<<1|1,mid+1,qr,ax);st[o].x=min(st[o<<1].x,st[o<<1|1].x);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,1,n); for(int i=1;i<=m;i++){int d,s,t;cnt=i;//scanf("%d%d%d",&d,&s,&t);d=read();s=read();t=read();add(1,s,t,-d);}printf("0\n");return 0;
}

那么正解是什么呢–>二分答案。
判定的写法是,对前mid个人操作,加上差分,最后看看是否有小于0的,有则r=mid-1,否则l=mid+1;
这样一直判定。最后如果l>=n,就说明全部都能满足;否则答案就是 l 。

#include<iostream>
#include<cstdio>
#define M 1000000
using namespace std;
int n,m,a[M+10],b[M+10];
int d[M+10],s[M+10],t[M+10];
bool check(int x)
{for(int i=1;i<=n;i++) b[i]=a[i]-a[i-1];for(int i=1;i<=x;i++) b[s[i]]-=d[i],b[t[i]+1]+=d[i];for(int i=1;i<=n;i++) {b[i]+=b[i-1];if(b[i]<0) return false;}return true;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=m;i++) scanf("%d%d%d",&d[i],&s[i],&t[i]);int l=1,r=n,mid;while(l<=r){mid=(l+r)>>1;if(check(mid)) l=mid+1;else r=mid-1;}if(l>=n) printf("0");else printf("-1\n%d",l);return 0;
}

转载于:https://www.cnblogs.com/dfsac/p/7587867.html

P1083 [NOIP 2012]借教室相关推荐

  1. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  2. P1083 借教室(差分+二分)

    https://www.luogu.org/problem/P1083 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教 ...

  3. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★

    P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...

  4. 借教室(洛谷-P1083)

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  5. [NOIP] [线段树] NOIP2012Day2 借教室(classroom)

    题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量 ...

  6. [NOIP2012] 借教室

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  7. NOIP2012 D2 T2借教室

    先上题目 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息 ...

  8. 借教室(codevs 1217)

    1217 借教室 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Description ...

  9. 【每日一题】7月1日题目精讲 借教室

    来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 文章目录 题目描述 题解: 差分: 二 ...

最新文章

  1. keras中conv2d,conv2dTranspose的Padding详细介绍
  2. Android WebView与ViewPager的滑动冲突分析
  3. 【5 数学规划】实际问题实战
  4. php锁定文本框内容的方法
  5. C++ 复制字符串/字符数组
  6. [蓝桥杯2018初赛]递增三元组-双指针,枚举,排序,前缀和
  7. 【微信小程序】数组操作
  8. python 如何安装软件包故障_Python安装软件包出错
  9. 比深度学习更值得信赖的模型ART
  10. arcgis engine设置数据源路径_不用ArcGIS做前期分析,你是不是想被辞!
  11. 关于圆与直线所包含点的多少关系证明
  12. matlab做简单的信号处理分析
  13. C语言头歌educoder实训作业答案分享 指针(一)
  14. uvm设计分析——reg
  15. BugKu Web题《网站被黑》writeUp
  16. Win7系统双屏扩展显示时触屏设置
  17. Linux 压缩、解压、打包操作
  18. C# 面向对象学习笔记
  19. 哪个相机可以拍gif动图_直接拍出GIF动态图的相机
  20. 1255计算机网络 本,国家开放大学电大本科《计算机网络》2025期末试题及答案(试卷号:1255)...

热门文章

  1. 最快让你上手ReactiveCocoa之基础篇
  2. xml入门简介--两天学会xml
  3. Windows Phone 7用户界面原型截图汇总
  4. IP头结构&其他解析
  5. HTTP_REFERER的获取情况
  6. 3764树上的异或值(自己研究的静态字典树)
  7. hdu4975 行列和构造矩阵(dp判断唯一性)
  8. 【Git】Git 基础命令 ( 添加暂存文件 git add | 提交文件至版本库 git commit | 查看版本库状态 git status | 查询文件修改 git diff )
  9. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
  10. 【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )