前缀和+离散化

题目链接:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值