题目链接:
https://www.acwing.com/problem/content/1989/
将原题抽象为:找到数轴上计数大于等于2的点的个数
代码如下:
重点在于如何通过差分数组mp倒推原数组
#include<iostream>
#include<map>
using namespace std;
#define ll long long
map<ll,ll> mp;
void add(int l,int r){
mp[l]++;
mp[r+1]--;
}
int main(){
ll n,c=0;
cin>>n;
while(n--){
ll dis;
char dir;
cin>>dis>>dir;
if(dir=='R'){
add(c,c+dis-1);
c+=dis;
}else{
add(c-dis,c-1);
c-=dis;
}
}
ll sum=0; // sum记录前缀和
ll last=-0x3f3f3f3f; // last记录上一个点的坐标
ll ans=0;
for(auto &[k,v] :mp){
if(last!=-0x3f3f3f3f) ans+=(sum>=2)*(k-last);
sum+=v;
last=k;
}
cout<<ans<<endl;
}
类似题目:
https://www.acwing.com/problem/content/1954/
当我们输入一头牛时,相当于在-INF到A-1处为数轴上的每个数都加了x,在A到B处加了y,B+1到INF处加了z,然后与上题同,遍历b去寻找答案即可
// 合理设置温度,使得(x1*x+y1*y+z1*z)取得最大值
#include<iostream>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
#define ll long long
map<ll,ll> b;
void add(ll l,ll r,ll v){
b[l]+=v;
b[r+1]-=v;
}
int main(){
ll n,x,y,z;
cin>>n>>x>>y>>z;
while(n--){
ll a,b;
cin>>a>>b;
add(-INF,a-1,x);
add(a,b,y);
add(b+1,INF,z);
}
ll sum=0;
ll last=-INF; // last记录上一个点的坐标
ll ans=0;
for(auto &[k,v] :b){
sum+=v;
ans=max(ans,sum);
}
cout<<ans<<endl;
}