首页 > 其他分享 >猴子拆房 题解

猴子拆房 题解

时间:2023-08-13 09:57:10浏览次数:36  
标签:题解 ll t2 猴子 t1 样例 swap 拆房 200010

题目描述

输入

输出

样例输入

【样例输入1】
2 
2 3
4 5

【样例输入2】
3
2 4
2 5
1 3

【样例输入3】
6
3 5
3 4
1 7
1 7
4 2
4 1

样例输出

【样例输出1】
3

【样例输出2】
0

【样例输出3】
10

数据范围限制

提示

这个是我的,是我的QWQ,我没有转载,只是把以前的博客搬运过来了。

然后就是因为markdown丢了,所以我截图:

不过代码还在OJ上存着,你们放心:

#include<cstdio>
#include<algorithm>
#define ll long long
#define INF 1e12
using namespace std;
ll n;
struct node{
	friend bool operator <(const node &x,const node &y){	// 懒得改了 
		return x.v<y.v;
	}
	friend bool operator >(const node &x,const node &y){
		return x.v>y.v;
	}
	ll h,v;			// 小根堆     大根堆 
} a[200010],b[200010],t1[200010],t2[200010];


ll num[200010];
ll cnt1,cnt2;
ll big,sum,mn=INF;
ll spend[200010];
ll s[200010];




// 下面是手写堆
// 下面的肯定对了! 
void insert1(node k){
	t1[++cnt1]=k;
	ll x=cnt1;
	while(x>1 && t1[x/2]>t1[x]){
		swap(t1[x/2],t1[x]);
		x/=2;
	}
}
void pop1(){
	swap(t1[1],t1[cnt1]);
	cnt1--;
	ll x=1;
	while(2*x<=cnt1&&((2*x+1<=cnt1 && t1[x*2+1]<t1[x]) || t1[x*2]<t1[x])){
		if(2*x+1>cnt1){
			swap(t1[x*2],t1[x]);
			x*=2;
		}
		else if(t1[x*2+1]<t1[x*2]){
			swap(t1[x*2+1],t1[x]);
			x=x*2+1;
		}
		else{
			swap(t1[x*2],t1[x]);
			x*=2;
		}
	}
}

void insert2(node k){
	t2[++cnt2]=k;
	ll x = cnt2;
	while(x>1 && t2[x/2]<t2[x]){
		swap(t2[x/2],t2[x]);
		x/=2;
	}
}
void pop2(){
	swap(t2[1],t2[cnt2]);
	cnt2--;
	ll x=1;
	while(2*x<=cnt2&&((2*x+1<=cnt2 && t2[x*2+1]>t2[x]) || t2[x*2]>t2[x])){
		if(2*x+1>cnt2){
			swap(t2[x*2],t2[x]);
			x*=2;
		}
		else if(t2[x*2+1]>t2[x*2]){
			swap(t2[x*2+1],t2[x]);
			x=x*2+1;
		}
		else{
			swap(t2[x*2],t2[x]);
			x*=2;
		}
	}
}

void solve(ll l,ll r){
	if(l==r) return;
	ll mid=(l+r)>>1;
	solve(l,mid);
	solve(mid+1,r);
	
	ll pos1=l,pos2=mid+1;
	for(ll i=l;i<=r;i++){
		if(pos2>r||(pos1<=mid && a[pos1].h<a[pos2].h)){
			b[i]=a[pos1++];
		}
		else if(pos2<=r){
			b[i]=a[pos2++];
		}
	}


	for(ll i=l;i<=r;i++){
		a[i]=b[i];
	}
}
// 上面的肯定对了! 


// 代码主要部分
void run(ll h){
	ll k=(n-s[h])-(num[h]-1);	// 最少拆多少个房子 
	
	
	
	while(k<cnt2 && cnt2){	// 多了 
		insert1(t2[1]);
		sum-=t2[1].v;
		pop2();
	}
	
	
	
	while(cnt2<k){	// 不够 
		if(!cnt1){
			return;
		}
		insert2(t1[1]);
		sum+=t1[1].v;
		pop1();
	} 
	
	
	
	
	big-=spend[h];
	mn=min(mn,sum+big);
}



int main(){
	freopen("house.in","r",stdin);
	freopen("house.out","w",stdout);



	scanf("%lld",&n);
	
	
	for(ll i=1;i<=n;i++){
		scanf("%lld %lld",&a[i].h,&a[i].v);
		num[a[i].h]++;
		spend[a[i].h]+=a[i].v;
	}
	
	
	solve(1,n);
	
	
	for(ll i=100000;i>=1;i--){
		s[i]=s[i+1]+num[i];
		big+=spend[i];
	}
	
	
	
	ll i=1;
	for(ll h=1;h<=100000;h++){
		if(num[h]){
			while(i<=n){
				if(a[i].h>=h) break;
				insert2(a[i]);
				sum+=a[i].v;
				insert1(t2[1]);
				sum-=t2[1].v;
				pop2();
				i++;
			}
			run(h);
		}
	}
	printf("%lld",mn);
}

标签:题解,ll,t2,猴子,t1,样例,swap,拆房,200010
From: https://www.cnblogs.com/znpdco/p/17626184.html

相关文章

  • 「题解注释」P7518 [省选联考 2021 A/B 卷] 宝石
    联合省选2021宝石题解-hezlik的博客-洛谷博客(luogu.com.cn)耗时:一晚上+半个上午代码注释:#include<bits/stdc++.h>usingnamespacestd;constintN=500000,C=21;intRi(){intx=0,y=1;charc=getchar();for(;c<'0'||c>'9';c=getchar())if......
  • CF452C 题解
    洛谷链接&CF链接题目简述有\(m\timesn\)张牌,有\(n\)个种类,每个种类有\(m\)张,现在抽一张放回,再抽一张,求这张牌与第一张抽出的牌种类相同的概率。思路本题是一道结论题,我们来推一下公式。首先需要特判一个点:只有\(1\)张牌,即\(n=m=1\),那么两次抽都会是这张牌,所......
  • acwing 116.飞行员兄弟 (算法竞赛进阶指南 p48 t1 ) 题解
    原题链接https://www.acwing.com/problem/content/description/118/题目描述“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个4х4的矩阵,您可以......
  • IDEA/Android Studio的gradle控制台输出中文乱码问题解决
    原文地址:IDEA/AndroidStudio的gradle控制台输出中文乱码问题解决-Stars-One的杂货小窝在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变成乱码了..本篇就介绍下解决方法乱码效果如下图所示步骤我是window系统,不知道其他系统会不会出现这个问题乱......
  • Codeforces Round 874 G题解
    做不动那么多题了,来个GG就是问你一棵树能切成多少个大小为3的链,想了半天,想过dp啥的,但是后来发现这个贪心就好了,可以证明贪心找不到的,其他方法也找不到好久没复健了,这是第一次,感觉以后要多做题才可以#include<bits/stdc++.h>usingnamespacestd;constexprintlimit=(4e......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频云服务平台主子码流都为H.265时,切换出现花
    国标视频云服务LntonGBS平台是基于国标GB28181协议的平台,可实现的视频能力有:实时直播、视频录像、语音对讲、云存储、检索及回放、告警、级联等。平台支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。最近有用户反馈,在LntonGBS平台......
  • RTSP流媒体服务器LntonNVR(源码版)安防监控平台开启录像后,录像回看无数据的问题解决方案
    LntonNVR平台通过RTSP/ONVIF协议实现了优秀的视频能力。它可以采集前端接入设备的音视频资源,并将其转码成适用于全平台、全终端分发的视频流格式,包括RTMP、FLV、HLS、WebRTC等格式。这使得LntonNVR平台具备了视频监控直播、云端录像、检索与回看、告警等安防监控功能。平台部署轻快......
  • P7438 更简单的排列计数 题解
    前置芝士:伯努利数等幂求和。其中伯努利数\(B_i\)的生成函数为\(\frac{x}{e^x-1}\)。首先这种逆序对有个套路的dp:令\(f_{i,j}\)表示填了前\(i\)个数,逆序对为\(j\),这时排列的\(val_{\pi}\)的乘积之和。有转移:\(f_{i,j}=\sum\limits_{k=0}^{i-1}f_{i-1,j-k}i^k\),初始......
  • P7092 计数题 题解
    前置题目:P5748集合划分计数。我们令\(Bell_n\)表示将\(n\)个有标号的球划分为若干集合的方案数。且\(Bell_n=n![x^n]e^{e^x-1}\)。首先,当\(k=0\)时,\(\mu(S)=0\),答案为\(0\)。当\(k=1\)时,\(\mu(S)=(-1)^{|S|},\varphi(S)=\prod\limits_{x\inS}(x-1)\)。记\(\pi(S)......
  • [ABC309G] - Ban Permutation 题解
    [ABC309G]-BanPermutation题解题目描述求长为\(N(N\leq100)\)且满足以下条件的排列\(P=(P_1,P_2,...,P_N)\)的个数,模\(998244353\):\(\forall1\leqi\leqN\),\(|P_i-i|\geqX(X\leq5)\)。思路首先拆绝对值,得到:\[P_i\geX+i\veeP_i\leX-i\]数数题除了排列......