原题地址
P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码
//https://www.luogu.com.cn/problem/P1083
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int r[1000005];
int d[1000005];
int s[1000005];
int t[1000005];
int diff[1000005];
bool judge(int x){
memset(diff,0,sizeof(diff));
for(int i=1;i<=x;i++){
diff[s[i]]+=d[i];
diff[t[i]+1]-=d[i];
}
int sum=0;
for(int i=1;i<=n;i++){
sum+=diff[i];
if(sum>r[i]){
return false;
}
}
return true;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>r[i];
}
for(int i=1;i<=m;i++){
cin>>d[i]>>s[i]>>t[i];
}
if(judge(m)){
cout<<"0";
return 0;
}
int l=1,r=m;
while(l<r){
int mid=(l+r)/2;
if(judge(mid)){
l=mid+1;
}
else{
r=mid;
}
}
cout<<"-1"<<endl<<l;
//cout<<"-1"<<endl<<r;
return 0;
}
AC记录
记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
主要错点
1.
for(int i=1;i<=n;i++){
sum+=diff[i];
if(sum>r[i]){
return false;
}
}
这里要从1枚举到n,因为这要把所有n天都看一遍!
2.
int l=1,r=m;
while(l<r){
int mid=(l+r)/2;
if(judge(mid)){
l=mid+1;
}
else{
r=mid;
}
}
这里
r=mid
非常重要,因为如果r=mid-1导致l,r重逢,那么如果mid-1是可行的(即judge返回true),答案就不对了,所以这里并不能把mid给省调!!!省掉只能拿75...
3.
#define int long long
十年OI一场空,不开longlong见祖宗!!!
1* 如果不开longlong能过20个点,是100分,但是是unaccept;
2* 开longlong能把hack数据过了,能过21个点,也是100分,但是就正真的AC了!!!
个人主页
xuzb 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)