首页 > 其他分享 >洛谷P3045

洛谷P3045

时间:2024-01-18 14:16:31浏览次数:27  
标签:洛谷 int 优惠 P3045 lsh 原价 add return

记 \(d_i=P_i-C_i\),表示用优惠劵能优惠的钱数。

最后会有一些牛用优惠劵买,有一些牛用原价买,那么用优惠劵买的牛的 \(d\) 一定大于用原价买的牛的 \(d\),否则把这张优惠劵用来买原价的这头牛肯定更优。

所以把所有牛按 \(d\) 排序后,一定可以找到一个分界点 \(i\),使得 \(i\) 之前的牛都只用优惠劵买,\(i + 1\) 及之后的牛都只用原价买,那么我们把 \(1\sim i\) 的牛前 \(k\) 小的优惠价格和 \(i+1\sim n\) 的牛的原价拿出来排序,一个一个取直到取到总价格超过 \(m\)。

然后你发现,分界点 \(i\) 右移的过程中,只有 \(i\) 和 \(i+1\) 的状态发生了切换,因此我们可以用一个数据结构来维护所有价格,支持插入删除以及查不超过 \(m\) 最多选几个,可以使用权值线段树然后线段树上二分,也可以像我一样离散化后树状数组上二分。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n, k, tot, cnt[N], lsh[N], ans;
priority_queue<int> q;
LL m, sum[N];
struct node {
	int c, p;
	bool operator<(const node &B) {
		return p - c > B.p - B.c;
	}
}a[N];
int find(int x) {
	return lower_bound(lsh + 1, lsh + 1 + tot, x) - lsh;
}
int lowbit(int x) {
	return x & (-x);
}
void add(int x, int v) {
	for(int i = x; i <= tot; i += lowbit(i))
		cnt[i] += v, sum[i] += lsh[x] * v;
}
int qry() {
	LL now = 0;
	int pos = 0, res = 0;
	for(int i = 18; i >= 0; i--)
		if(pos + (1 << i) <= tot && now + sum[pos + (1 << i)] <= m)
			pos += 1 << i, res += cnt[pos], now += sum[pos];
	return res;
}
int main() {
	cin>>n>>k>>m;
	for(int i = 1; i <= n; i++) {
		scanf("%d%d", &a[i].p, &a[i].c);
		lsh[++tot] = a[i].c;
		lsh[++tot] = a[i].p;	
	}
	sort(a + 1, a + 1 + n);
	sort(lsh + 1, lsh + 1 + tot), tot = unique(lsh + 1, lsh + 1 + tot) - lsh - 1;
	for(int i = 1; i <= n; i++) add(find(a[i].p), 1);
	for(int i = 0; i <= n; i++) {
		ans = max(ans, qry());
		if(i < n) {
			add(find(a[i + 1].p), -1);
			add(find(a[i + 1].c), 1);
			q.push(a[i + 1].c);
			if((int)q.size() > k) {
				int val = q.top();
				q.pop();
				add(find(val), -1);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

标签:洛谷,int,优惠,P3045,lsh,原价,add,return
From: https://www.cnblogs.com/cooltyl/p/17972361

相关文章

  • 树形DP->没有上司的舞会(洛谷1352)
    题意:每个人有一个happ值,n个人,n-1条有向边,u是v的上司,求happy值最大。限制条件是u和v不能同时参加。分析:没想到一个v居然有很多上司,更没想到n-1条边居然是个森林。//没想到,一个员工居然可以有那么多上司。。voidsolve(){intn;cin>>n;vector<int>happy(n......
  • 洛谷题单指南-模拟和高精度-P1601 A+B Problem
    原题链接:https://www.luogu.com.cn/problem/P1601题意解读:本题是高精度加法的模版题。知识点解析:  高精度加法:  如果一个数大到远超过整形变量的范围时,就不能使用int、long、longlong等变量来存储整数,也不能直接通过变量加法来求和。  因此,需要回到加法计算的本质,从个......
  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • 洛谷 P8426 [JOI Open 2022] 放学路(School Road)
    洛谷传送门LOJ传送门考虑整个图是一个点双怎么做。显然如果有重边并且两条边边权一样就寄了。否则我们可以把它们当成一条边。考虑一个二度点\(u\)和与它相连的边\((v,u),(u,w)\)。我们可以把它缩成边\((v,w)\)。如果新边已经存在并且边权不等于这两条边边权就寄了。......
  • 洛谷题单指南-模拟和高精度-P1042 [NOIP2003 普及组] 乒乓球
    原题链接:https://www.luogu.com.cn/problem/P1042题意解读:分别针对11分制和21分制,输出每局比分。只需要判断一局的结束条件:得分高者如果达到11或者21,且比分间隔大于等于2分,则表示一局结束,可开始下一局,用模拟法即可解决。100分代码:#include<bits/stdc++.h>usingnamespaces......
  • 洛谷P10058 题解
    这种翻转的题明显已经做烂了好吧……首先显而易见,翻转偶数次对结果没有影响,只需要考虑奇数次翻转的情况。由于是整体移动的操作,可以抓住一个点来移动,然后还原出原来的序列。需要注意的是字符串是环形移动,因此如果当前点的位置大于字符串长度,要对字符串的长度进行取余操作。写......
  • 洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛 #7 &「RHOI」Round 2 赛后总结
    洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛#7&「RHOI」Round2赛后总结比赛链接:https://www.luogu.com.cn/contest/146495建议先看原题再看文章。A-Water(P10056)有\(n\)个杯子,每个杯子的容积是\(a\),且初始装有\(b\)体积水。你可以进行任意次操作,每次操作选择任......
  • 洛谷 P5359 [SDOI2019] 染色
    洛谷传送门LOJ传送门dp好题。首先有一个显然的状态,设\(f_{i,x,y}\)为第\(i\)列上下两格的颜色分别为\(x,y\)的方案数。但是这样做时间复杂度至少为\(O(nm^2)\),无法接受。注意到全\(0\)列的转移是重复的。我们可以试着只在两个相邻非全\(0\)列转移。这样我们需......
  • 洛谷 P5996 [PA2014] Muzeum
    洛谷传送门考虑最大权闭合子图,第\(i\)个手办建点\(i\),第\(i\)个警察建点\(i'\)。我们有一些边:\(\foralli,(S,i,v_i),(i',T,v_i)\),以及对于能看见第\(i\)个手办的第\(j\)个警察,有\((i,j',\infty)\)。手办的\(\sumv_i\)减去最小割(最大流)即为答案。考虑转换......
  • 双向广搜->字符变换(洛谷P1032)
    题意:给起始和终止串A和B,以及不超过6个字符串变换规则,求A->B能否在10步以内变换完成。分析:暴力bfs每次有6条路可以走,时间复杂度是6^10大概6e8的时间复杂度,会TLE。于是这题是一道经典的双向bfs。直接开两个队列,两个map,暴力搜1~5步即可。双向bfs的时间复杂度是2*(6^5)=1e4......