题解:AT_nikkei2019_final_d Deforestation
题目:
在我写题解时题目翻译有错误,故此处放上简略的正确翻译。
有
有
求可以得到多少竹子。
完整题目,点击此处。
思路:
因为每过一秒高度都会增加一,且砍后会继续生长,所以我们可以只计算第
实现,在输入后我们可以直接从最后开始向前遍历,因为题目满足输入的时间
定义一个 set,类型为 int,名字叫
用 lower_bound 函数查找在
代码:
#include<bits/stdc++.h>
using namespace std;
set<int>se;
int n,m;
int t[200005],l[200005],r[200005];
long long ans=0;
void solve(){
for(int i=1;i<=n;i++)se.insert(i);// 记录有没有砍
for(int i=m;i>=1;i--){
auto it=se.lower_bound(l[i]);// 二分查找第一个大于等于 l[i] 的值的位置
while(it!=se.end()&&*it<=r[i]){
ans+=t[i];
se.erase(it++);
}
}
cout<<ans<<"\n";
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>t[i]>>l[i]>>r[i];
}
solve();
return 0;
}