2025.10.29 CSP-S模拟赛总结

今天模拟赛没打好,只拿了 \(124\) 分,连一等线都没到,哎
题目链接
题解链接
T1
这道题竟然花了我一个小时的时间!!!,一个裸的线段树板子,只是区间修改为一个点忘了,跟个躺尸一样想半天,还花了 \(10\) 分钟去模拟阳历,无语

T2
想半天贪心假了,只拿了 \(24\) 分,正解应为二分查找(二分太烂了)
补题链接
用二分查找在 \(mid\) 个小时内送完所有的订单,现将距离性骑士和重量型骑士从小到大排序,并把订单按照重量从小到大排序,先处理距离性选手,把每个选手可以送的订单放入一个大根堆里(如果前面的骑士可以送的订单那么后面的骑士一定也可以送),每次让当前骑士送大根堆里前 \(mid\) 个订单,即先处理对于当前骑士最难处理的订单(如果堆中元素不满 \(mid\) 取整个堆),然后把剩下的订单加入堆中,按照上面的方式让重量型骑士来送他能送的最大距离的不大于 \(mid\) 个订单,处理中如果某个骑士无法送当前的订单,那么他后面的骑士也无法送(因为是从大到小排序),那么直接结束,最后如果订单有剩余,即没送完,则当前 \(mid\) 个小时送不完全部订单,否则可以。
二分的左边界为每个骑士每一小时都在工作,右边界为只有一个骑士在工作,注意统计答案用一个 \(ans\) 来统计,\(l\)\(r\) 的区间变化为 \(l=mid+1\)\(r=mid-1\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+6;
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9'){
		if(c=='-')
			f=-1;
		c=getchar();
	}
	while(c>='0' && c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
struct Node{
	int w,d;
	bool operator < (const Node &A){
		return w<A.w;
	}
}s[N];
//将订单按照重量从小到大排序 
int n,m,q,l,r,ans;
int a[N],b[N];
inline bool check(int mid){
	priority_queue<int> p; 
	//维护一个大根堆,让每位骑士送他能送的mid个最大距离的订单 
	int k=1;//依次枚举订单 
	for(int i=1;i<=n;i++){
		for(;k<=q && s[k].w<a[i];k++)
			p.push(s[k].d);	//如果可以送这个订单就加入对 
		for(int j=1;j<=mid && !p.empty();j++)
			p.pop();//让这名骑手送<=mid的最大距离个订单 
	}
	for(;k<=q;k++)
		p.push(s[k].b);//把剩下的订单加入堆 
	for(int i=m;i;i--){
		for(int j=1;j<=mid && !p.empty();j++){//把剩下的订单按照上面的方法分配 
			if(p.top()>=b[i])	//如果当前骑士无法送这个订单,则当前无法在mid个小时内送完订单 
				return false;
			p.pop();	
		}
	}
	if(!p.empty())//如果订单有剩余,证明无法在mid的时间内完成 
		return false;
	else
		return true;		
}
signed main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	for(int i=1;i<=m;i++)
		b[i]=read();
	sort(a+1,a+n+1);
	sort(b+1,b+m+1);
	for(int i=1;i<=q;i++)
		s[i].w=read(),s[i].d=read();
	sort(s+1,s+q+1);
	int ans=-1,l=q/(n+m),r=q;//左边界为每个骑士每一小时都在工作,右边界为只有一个骑士在工作 
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid))
			ans=mid,r=mid-1;
		else
			l=mid+1;
	}
	printf("%lld",ans);
	return 0;
}

T3
推了半个小时的阳历,又花了半个小时推特殊性质,结果爆 \(0\) 了,啊啊啊,正解为 DP,挺诡异的,学了好久 DP 还是不会用,哎

T4
不是 meet in the middle 是啥?折半搜索一点也不会,没时间打暴力直接用随机化还 TM 的写错了,还不瑞输出 \(1\)
总结:板子还是没记全记准,还需再练习一下,时间分配不合理,还是太菜了,根本不会做,哎

posted @ 2025-11-03 16:05  See_you_soon  阅读(6)  评论(0)    收藏  举报