牛客手速月赛 48 C(差分都玩不明白了属于是)

不想玩辣!
  好久没打牛客了,第二题连wa5发,心态有点炸。天天做天梯赛的题都有点不知道罚时,就硬莽夫,是个坏习惯。罢了,收拾收拾退役了。
题目
题意: 给定n个编号从1到n的区间,给定len,求有多少个区间满足长度为len且与区间相交的数量最多且权重最大。
权重: 所有相交区间的编号和。
思路: 稍微想想就知道,每次只移动一个格子,把信息预处理出来即可。傻了,非得用vector处理。这里和差分非常像的,但是不能在消失的地方–,因为可能区间左端点还在区间中。只需要多开一个数组记录所有给定区间的右端点,在枚举的时候减去即可。
!注意右端点最大是5e6+5e6
时间复杂度: O(n)
代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
typedef long long ll;
int n,m,k,T;
int b[N],bb[N];
ll w[N],ww[N];
ll ans = 0;
ll mx = 0;
ll quan = 0;
void solve()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)
	{
		int x,y; cin>>x>>y;
		b[x]++,bb[y]++;
		w[x]+=i,ww[y]+=i;
	}
	ll now;ll sum;
    for(int i=1;i<=m;++i) mx += b[i],quan += w[i];ans = 1;
    now = mx; sum = quan;
    for(int i=m+1;i<N;++i)
    {
    	now += b[i]; sum += w[i];
    	now -= bb[i-m]; sum -= ww[i-m];
    	if(now > mx || (now==mx&&sum>quan))
        {mx = now; quan = sum; ans = 0;}
        if(now==mx&&sum==quan) ans++;
    }
	cout<<ans;
}
signed main(void)
{
	T = 1;
	// cin>>T;
	while(T--)
	solve();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值