AcWing 1952. 金发姑娘和 N 头牛(离散化+差分)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 1952. 金发姑娘和 N 头牛(离散化+差分)相关的知识,希望对你有一定的参考价值。

题目链接

https://www.acwing.com/problem/content/description/1954/

思路

因为对于每一个牛牛来说都有三个不同的舒适度区间,那么我们最终要求的一个最佳总舒适度点也可以看作一个区间,然后将三部分区间在map上面维护一个离散化的差分数组最后求一个前缀和的最大值即可,这里对于最左边的区间和最右边的区间我们可以定义一个INF=0x3f3f3f3f来表示维护

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------自定义部分----------------
ll n,m,q,a[N],b[N],x,y,z;

map<ll,ll> d;
const int INF = 0x3f3f3f3f;

void slove()
	for(int i = 1;i <= n; ++i) 
		d[-INF] += x;
		d[a[i]] -= x;
		d[a[i]] += y;
		d[b[i] + 1] -= y;
		d[b[i] + 1] += z;
		d[INF+1] -= z;
	
	ll ans = 0;
	ll res = 0;
	for(auto it : d)
//		cout<<it.first<<" "<<it.second<<endl;
		res += it.second;
		ans = max(res,ans);
	
	cout<<ans<<endl;


int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	cin>>n>>x>>y>>z;
	for(int i = 1;i <= n; ++i) 
		cin>>a[i]>>b[i];
	
	slove();
	return 0;

以上是关于AcWing 1952. 金发姑娘和 N 头牛(离散化+差分)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing:244. 谜一样的牛(树状数组 + 二分)

AcWing 1945. 奶牛棒球(枚举+二分)

1100. 抓住那头牛最短路的特殊移动

AcWing 1945. 奶牛棒球

AcWing 1945. 奶牛棒球

acwing 1904 奶牛慢跑