首页 > 其他分享 >2024.8.10模拟赛17

2024.8.10模拟赛17

时间:2024-09-05 10:51:57浏览次数:9  
标签:10 17 2024.8 ++ int ans pair define op

模拟赛

今天是七夕耶!

哦,今天是七夕呀。。。

T1 Non-decreasing

题目背景

先拿部分分,当全正或全负时很显然,只需要 \(n\) 次操作:

  • 正:如果 \(a_i \gt a_{i+1},a_{i+1} \gets (a_i+a_{i+1})\)。
  • 负:如果 \(a_i \lt a_{i-1},a_{i-1} \gets (a_i+a_{i-1})\)。

然后开始想有正有负的情况,因为上述的做法保证只会对单一方向产生影响,而双向的会有后效性。。。

其实总操作数给到了 \(2n\) 次,而我们只需要找出绝对值最大的那个数就可以在 \(n\) 次操作内使序列变为全正或全负,然后按上面的做法就好啦。

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define fi first
#define se second
const int N = 2e5+5;
int n,ans;
long long a[N],b[N];
pair<int,int> op[N];

int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]),b[i]=a[i];
	sort(b+1,b+1+n);
	if(b[1]>=0)
	{
		for(int i=1;i<n;i++)
		{
			if(a[i]>a[i+1])
			{
				op[++ans]=make_pair(i,i+1);
				a[i+1]=a[i]+a[i+1];
			}
		}
		printf("%d\n",ans);
		for(int i=1;i<=ans;i++) printf("%d %d\n",op[i].fi,op[i].se);
	}
	else if(b[n]<=0)
	{
		for(int i=n;i>1;i--)
		{
			if(a[i-1]>a[i])
			{
				op[++ans]=make_pair(i,i-1);
				a[i-1]=a[i]+a[i-1];
			}
		}
		printf("%d\n",ans);
		for(int i=1;i<=ans;i++) printf("%d %d\n",op[i].fi,op[i].se);		
	}
	else
	{
		if(b[n]>=abs(b[1]))
		{
			int tmp=0;
			for(int i=1;i<=n;i++)
			{
				if(a[i]==b[n])
				{
					tmp=i; break;
				}
			}
			for(int i=1;i<=n;i++)
			{
				if(a[i]<0)
				{
					op[++ans]=make_pair(tmp,i);
					a[i]+=b[n];
				}
			}
			for(int i=1;i<n;i++)
			{
				if(a[i]>a[i+1])
				{
					op[++ans]=make_pair(i,i+1);
					a[i+1]=a[i]+a[i+1];
				}
			}			
		}
		else
		{
			int tmp=0;
			for(int i=1;i<=n;i++)
			{
				if(a[i]==b[1])
				{
					tmp=i; break;
				}
			}
			for(int i=1;i<=n;i++)
			{
				if(a[i]>0) 
				{
					op[++ans]=make_pair(tmp,i);
					a[i]+=b[1];
				}
			}
			for(int i=n;i>1;i--)
			{
				if(a[i-1]>a[i])
				{
					op[++ans]=make_pair(i,i-1);
					a[i-1]=a[i]+a[i-1];
				}
			}		
		}
		printf("%d\n",ans);
		for(int i=1;i<=ans;i++) printf("%d %d\n",op[i].fi,op[i].se);		
	}
	return 0;
}

T2 矩阵

题目背景

很巧妙的一道题,我们发现 \(n^3\) 显然过不了。考虑如何优化。

因为三个矩阵都是 \(n \times n\),人类智慧发现如果在等式左右同时左乘一个 \(1 \times n\) 的矩阵,矩乘的复杂度就变成 \(n^2\)。

然后随便做了。(据说重复几次会防止冲突,其实不用)

(还有 Hash 做法)

code
#include<bits/stdc++.h>
using namespace std;
#define scan __builtin_scanf
const int N = 3005,mod = 998244353;
int t;
int n,a[N][N],b[N][N],c[N][N],d[N],tmp[N],tmp2[N],tmp3[N];

bool check()
{
	for(int i=1;i<=n;i++) tmp[i]=tmp2[i]=tmp3[i]=0;
	for(int i=1;i<=n;i++) d[i]=rand()%100000+998244;
	for(int k=1;k<=n;k++)
		for(int j=1;j<=n;j++) tmp[j]=(tmp[j]+1ll*d[k]*a[k][j]%mod)%mod;
	for(int k=1;k<=n;k++)
		for(int j=1;j<=n;j++) tmp2[j]=(tmp2[j]+1ll*tmp[k]*b[k][j]%mod)%mod;
	for(int k=1;k<=n;k++)
		for(int j=1;j<=n;j++) tmp3[j]=(tmp3[j]+1ll*d[k]*c[k][j]%mod)%mod;
	for(int i=1;i<=n;i++) if(tmp2[i]!=tmp3[i]) return 0;
	return 1;
}

int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	srand(time(0)); srand(rand());
	scan("%d",&t);
	while(t--)
	{
		scan("%d",&n);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				scan("%d",&a[i][j]);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				scan("%d",&b[i][j]);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				scan("%d",&c[i][j]);
		if(check()) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

T3 神奇纸牌

题目背景

看起来不太可做。。。

毒瘤出题人。。。

先咕着。。。

T4 Maximum Glutton

题目背景

小 trick,显然是背包,但是容积太大开不下。

经典做法是交换值域和其中一维,发现值域也只有 \(n\) 的,所有复杂度就是 \(O(n^2V)\)。

code
#include<bits/stdc++.h>
using namespace std;
#define mi(x,y) (x<y?x:y)
#define scan __builtin_scanf
#define print __builtin_printf
const int N = 81;
int n,A,B;
int f[N][10005];


int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	scan("%d%d%d",&n,&A,&B);
	for(int i=0;i<=n;i++) for(int j=0;j<=A;j++) f[i][j]=1e9+7; f[0][0]=0;
	for(int i=1;i<=n;i++) 
	{
		int x,y;
		scan("%d%d",&x,&y);
		for(int j=n;j;j--)
			for(int k=A;k>=x;k--)
				f[j][k]=mi(f[j][k],f[j-1][k-x]+y);
	}
	for(int i=n;~i;i--)
		for(int j=1;j<=A;j++)
		{
			if(f[i][j]<=B)
			print("%d\n",mi(i+1,n)),exit(0);
		}
	putchar('1'); putchar('\n');
	return 0;
}

标签:10,17,2024.8,++,int,ans,pair,define,op
From: https://www.cnblogs.com/ppllxx-9G/p/18353885

相关文章

  • 2024.8.7 模拟赛 15
    模拟赛。。。T1绿绿和串串学习manacher。先说求回文串,manacher算法,每次记录向右能延伸最长的回文串和回文中心。这样对于新扩展的字符,按已有的回文中心对称过去,会得到一个已经求出的回文长度,在这个基础上向两端扩展就好了。对于普通的回文串,有奇回文和偶回文两种,为了方便......
  • 2024.8.8模拟赛16
    模拟赛重拾题解(刚刚写过一版忘保存了)T1其实就是个最长公共子序列的变形。把一样的数才匹配换成有倍数关系就匹配。最长公共子序列:一般转化为最长上升子序列,即在一个串中的数\(a\),找到它在另一个串中的位置\(j\),从\(1\dotsj-1\)转移即可,取最大值可用树状数组维护前缀最......
  • pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire versio
    当你的PyMongo版本比较新时,如当前使用版本为v4.8.0,如果你尝试连接到MongoDBServerv3.4或更早版本,PyMongo可能会引发以下错误:pymongo.errors.ConfigurationError:Serveratlocalhost:27017reportswireversion5,butthisversionofPyMongorequiresatleast6(Mo......
  • 20240905_102100 mysql 备份与恢复 可视化软件sqlyog操作
    导出备份导入备份......
  • VMware Workstation 17.6 Pro Unlocker & OEM BIOS 2.7 for Windows & Linux
    VMwareWorkstation17.6ProUnlocker&OEMBIOS2.7forWindows&Linux在Windows和Linux上运行macOSSequoia请访问原文链接:https://sysin.cn/blog/vmware-workstation-17-unlocker/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2024-09-03,版本13.6更......
  • 14-STM32F103+ML307(中移4G Cat1)基本控制篇(自建物联网平台)-STM32+ML307以SSL单向认
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明安装的MQ......
  • 14-STM32F103+ML307(中移4G Cat1)基本控制篇(自建物联网平台)-STM32+ML307以SSL单向认
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明安装的MQ......
  • LeeCode-104. 二叉树的最大深度
    要求给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。如下图所示的二叉树最大深度为5.解题思路与94题类似,采用递归调用遍历子节点。在基本结构中,节点的最大深度等于根深度(1)加上左右较大深度,左右较大的深度可以......
  • 洛谷刷题之P1046
    [NOIP2005普及组]陶陶摘苹果题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出101010个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个......
  • 洛谷刷题之P1009
    [NOIP1998普及组]阶乘之和题目描述用高精度计算出S=1!+2......