首页 > 其他分享 >2024.10.31模拟赛

2024.10.31模拟赛

时间:2024-10-31 18:32:25浏览次数:1  
标签:2024.10 int 31 mn T2 bi long 序列 模拟

一定要好好睡觉啊,不然打模拟赛的时候会困死的!!!

非常非常困的7:50时就开始打模拟赛,还是打了四个小时。打了T1、T2的正解,T3的5分特殊样例、T3的10分特殊样例,预计总215分。
然后经过漫长的三个小时的等待,出现了 T1 100分,T2 65分,T3 60分,T4 10分、总分235分 的神奇成绩。虽然结果比预估的高,但我的T2挂了整整35分!这让我非常的不爽。当我发现是因为没开long long时,不开心的心情到达了顶峰————

不然我就可以排名第二了!!

题目小链接


T1【恋曲】

题目大意:

给出n,t,x,与长度为n(1<=n<=1e6)的两个序列a,b。每次操作可以使ci=min(ci+bi,ai),最多操作t(1<=t<=1e9)次,问是否可以使∑ci>=x(ci初始化为0)

解题思路:

感觉可以贪心。每次操作花费代价一定,所以能取大的bi就取。于是乎,想到用大根堆维护最大值,类型为pair<int,int>,第一个为bi,第二个为可使用的次数。我们注意到,对于每个bi可以分为两个部分,一部分是每次取bi,一共可取ai/bi(下取整)次;另一部分是取ai%bi,只可以取一次(总和ai可以分成大小为bi的若干整份,但总会剩下分不成bi的一份),在输入时预处理为两部分、插入大根堆即可。

完了后每次取堆顶,然后操作,判断操作次数与总和的边界输出即可。

可爱的小代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,t,x;
int a[N],b[N];
long long sum;
long long tol;
priority_queue < pair<int,int> > q;

void read()
{
	scanf("%d%d%d",&n,&t,&x);
	for (int i=1;i<=n;i++) 
	{
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	for (int i=1;i<=n;i++) 
	{
		scanf("%d",&b[i]);
		if (b[i]>a[i]) b[i]=a[i];//防止溢出 
		q.push(make_pair(b[i],a[i]/b[i]));
		if (a[i]%b[i]) q.push(make_pair(a[i]%b[i],1));
	}
}
int main()
{
	read();
	if (sum<x)//就算全部取到也不够
	{
		printf("No");
		return 0;
	}
	while (!q.empty())
	{
		int bb=q.top().first,dd=q.top().second;
		q.pop();
		tol+=min(dd,t)*bb;
		t-=min(t,dd);
		if (t==0)//边界 
		{
			if (tol>=x) printf("Yes");
			else printf("No");
			break;
		}
		if (tol>=x)//边界 
		{
			printf("Yes");
			break;
		}		
	}
	return 0;
}

T2【留校丕】

题目大意:

给出一个长度为n(2<=n<=1e6)的序列p(保证p是排列),每次操作可以交换p中相邻的两个数,求使p变成单峰的最小操作次数

解题思路:

本来想的p中最大值一定是会是那个“峰”,但显然看最大值很不好操作。通过群中fjj思路的启示,我们想到p中的最小值一定需要在序列两边;又因为每次操作只能交换相邻的两个数,所以移动最小值后序列中的其他数不变(比如序列3 1 2 4 5,不论是将1移到序列左边或是右边,3 2 4 5的序列位置都没有改变)。

于是乎,可以把移动mn看作删除mn(显而易见,mn是指当前序列中的最小值),那么每次移动一定要往移动次数少的一边移动,这样的贪心才可使ans最小。但是因为“删除mn”的操作,序列中数的个数会发生改变,也就是说我们要对这个序列进行单点修改与区间查询,一下子就想到了树状数组。但是,作为一个大蒟蒻,我只能写一个线段树来(还好没被卡)。

但!是!不!要!忘!记!ans!要!开!long!long!


不可爱的小代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n;
int p[N],t[N]; 
int pos[N];
int sum[N*4];
long long ans;

void read()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%lld",&p[i]);
		pos[p[i]]=i;//记录一下每个值的位置 
	}
}
void pushup(int id)
{
	sum[id]=sum[id*2]+sum[id*2+1];
}
void build(int id,int l,int r)
{
	if (l==r)
	{
		sum[id]=1;
		return ;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	pushup(id);
}
int query2(int id,int l,int r,int i,int j)
{
	if (j==0||i==n+1) return 0;//特判目前最小值已在序列边界 不然会死循环 
	if (l>=i&&r<=j) return sum[id];
	int mid=(l+r)/2,sm=0;
	if (i<=mid) sm+=query2(id*2,l,mid,i,j);
	if (mid+1<=j) sm+=query2(id*2+1,mid+1,r,i,j);
	return sm;
}
void del(int id,int l,int r,int x)
{
	if (x==l&&x==r)
	{
		sum[id]-=1;
		return ;
	}
	int mid=(l+r)/2;
	if (x<=mid) del(id*2,l,mid,x);
	if (mid+1<=x) del(id*2+1,mid+1,r,x);
	pushup(id);
}
signed main()
{
	read();
	build(1,1,n);//建树 
	int mn=0;//序列当前最小值 
	for (int i=1;i<=n;i++)
	{
		mn++;
		ans+=min(query2(1,1,n,1,pos[mn]-1),query2(1,1,n,pos[mn]+1,n));//取移到最左边、最右边的更小值 
		del(1,1,n,pos[mn]);
	}
	printf("%lld",ans);
	return 0;
}

标签:2024.10,int,31,mn,T2,bi,long,序列,模拟
From: https://www.cnblogs.com/Myyy-L/p/18518620

相关文章

  • 『模拟赛』多校A层冲刺NOIP2024模拟赛16
    Rank依托,给我烂完了(A.四舍五入唐题,赛时被硬控3h。发现枚举\(i\)是一个很没前途的选择,分成三段后仍然需要\(\mathcal{O(n)}\)去跑\(\left[1,\lfloor{\frac{i}{2}}\rfloor\right]\)这一段,复杂度仍是\(\mathcal{O(n^2)}\)的,只有30pts。正难则反,我们换个角度考虑枚......
  • Filter -2024/10/31
    Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一packagecom.stdu.web.filter;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;@WebFilter("/*")publicclassFilter_demoimplementsFilter{......
  • 20241031模拟赛题解
    T1题目描述给定一个圆形蛋糕,被\(n\)条切割线分成\(n\)个扇形蛋糕块,按照顺时针编号,第\(i\)块上有\(a_i\)个草莓,第\(i\)条切割线到第\(i+1\)条切割线之间的部分是第\(i\)块蛋糕。Alice和Bob流选择切割线,假设Alice选择了第\(i\)条切割线,Bob选择了第\(j\)条......
  • 模拟用户登录网站
    模拟用户登录网站requests模块Requests继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码。requests的底层实现其实就是urllib3Requests的文档非常完备,中文......
  • NOIP 模拟赛:2024-10-28
    T1:给定两个数组\(a,b\),要求将\(b\)重排,使得\(b>a\)的位置个数最多,在此基础上最大化\(b\)的字典序。\(n\le5000\)。最多的位置个数是容易求的,排个序即可。如何最大化字典序?依次枚举\(i=1\simn\),然后从大到小枚举\(j\)看看\(b_i=j\)是否可以让后面依然保持大于位......
  • 2024.10.31总结
    本文于github同步更新。最后一天喽A:卡双模哈希......
  • 20222314 2024-2025-1 《网络与系统攻防技术》 实验三实验报告
    网络与系统攻防实验报告实验时间:2024-10-25~2024-10-31实验人员:20222314陈振烨实验地点:地下机房指导教师:王志强本周学习内容学习了免杀的相关原理,掌握了msf的编码免杀基本操作,成功下载了veil加壳器并进行加壳免杀实践内容(1)正确使用msf编码器,veil-evasion,自己利用shell......
  • 【10-31模拟赛T1】四舍五入
    给出\(n\),对于任意正整数\(i\)满足\(1\leqi\leqn\),求有多少个正整数\(j\)满足\(1\leqj\leqn\)且\(i\bmodj\leq\frac{j}{2}\)。枚举\(i\)不好处理,可以反过来,外层枚举\(j\),内层枚举左右端点\(l=kj,r=kj+\lfloor\frac{j}{2}\rfloor\)(\(k\)为自然......
  • 杂题随笔 10.31 两道LIS相关的题
    https://www.luogu.com.cn/problem/AT_abc354_f题意:给定一个序列a,求出所有的i使得任意一个a的最长子序列包含i。解法:我们先求这个序列的LIS的长度maxx,然后再去正着求一遍最长上升子序列和反着求一遍最长下降子序列即可,如果拼起来等于maxx那么说明i这个点是满足要求的点。注意细......
  • Leetcode刷题Python之3165.不包含相邻元素的子序列的最大和
    提示:利用线段树解决不包含相邻元素的子序列最大和问题。文章目录一、题目描述示例二、解题思路1.思路分析2.线段树的状态设计3.线段树的操作三、代码实现代码详细解释四、总结时间复杂度分析一、题目描述给定一个整数数组nums和一个二维数组queries,其中q......