CSP J 2022 第二轮 VP 划水记

\(day0\)

处于广州三区,CSP 直接停掉。但是听说后续会有补测,但是无论如何,钩子应该是没有了。

晚上最后复习了快速幂,线段树,树状数组,就去睡觉了。

收到某人的祝福,挺好的(虽然远在我家隔壁一条街?)。

\(day1\)

中午 \(12\) 点开始考试,定个闹钟,到 \(3:30\)。准时结束。

开了第一题。

题意:给出 \(n\)\(k\),求 \(n^k\) 是否大于 \(10^9\) 是则输出 \(-1\),否则则输出 \(n^k\)

额,居然考了快速幂!刚刚好复习到,模板记得很清楚,打出来了。(虽然也很简单),然后开计算器算了一下 \(sqrt(10^9)\),大于他判一下就可以。

用了不到 \(10min\) 轻松 \(AC\)

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define ll long long
ll ans=1;
void Slove(ll a,ll b)
{
	ll base=a;
	while(b>0)
	{
		if(b&1)
			ans*=base;
		base*=base;
		b>>=1;
		if(ans>1000000000)
			cout<<"-1"<<endl,exit(0);
	}
}
int main()
{
// 	freopen(".in","r",stdin);
// 	freopen(".out","w",stdout);
	ll a,b;
	cin>>a>>b;
	if(a>31622&&b>2)
		cout<<"-1"<<endl,exit(0);
	Slove(a,b);
	cout<<ans<<endl;
	return 0;
}

很快开了第二题。

题意:

求两个正整数 \(p\)\(q\),使 \(n=p\times q\)\((p-1)\times (q-1)=e\times d\)。给出 \(n\)\(d\)\(e\),同时有多测。

通过移项,带入,可以得到:

\[\begin{cases}p\times q=n \\p+q=n+2-e \times d\end{cases} \]

一开始我还想着去枚举因数,但是发现 \(n\) 的值过大,不可做。

正在想期间,我突然回想起我们最近数学学的,完全平方公式。

\((p-q)^2=(p+q)^2-4\times p\times q\)

再连立 \(p+q\)\(p-q\) 即可求出 \(p\)\(q\)

还要考虑当前的数开平方后进行验证,即这个数是不是完全平方,还有除以 \(2\) 的部分也要判一下。因为在这两个操作会有精度损失。

最后还要记得要先输出小的。

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define ll long long
int main()
{
// 	freopen(".in","r",stdin);
// 	freopen(".out","w",stdout);
	int t;
	cin>>t;
	while(t--)
	{
		ll n,e,d;
		cin>>n>>d>>e;
		ll m=n-e*d+2;
		ll s=sqrt(m*m-4*n);
		if(s*s!=m*m-4*n){
			cout<<"NO"<<endl;continue;
		}
		ll p=(m+s)>>1;
		if(p*2!=m+s)
		{
			cout<<"NO"<<endl;continue;
		}
		ll q=n/p;
		if(p>q)
			swap(p,q);
		cout<<p<<" "<<q<<endl;
	 } 
	return 0;
}


考试的时候输入顺序写错了,调了 \(10min\) 才发现,我真的会谢。

看到 \(T3\) 题目很长,果断跳开,选择性躲避,开了 \(T4\)

\(T4\) 一开始没认真读题,理解错题目以为线只可以平行于 \(x\) 或者 \(y\) 轴,对了样例看了一会,才发现他是可以斜着走的。。。

给出 \(n\) 个点坐标,以及可以添加 \(k\) 个点。从中挑选出一些点,加入一些点,是的点两两之间 即 \(x[i+1]-x[i]=1,y[i+1]=y[i]\) 或者 \(y[i+1]-y[i]=1,x[i+1]=x[i]\)

\(30\) 分的做法显然,就是找个最长不下降子序列且公差为 \(1\) 即可。

正解还是 \(dp\)

\(dp[i][j]\) 表示 第 \(i\) 个点结尾,添加 \(j\) 个点的最大值, \(dis(i,j)\) 表两点距离(也就是两个点之间至少还要添几个点)。

其中 \(l\) 枚举可以添加点的数量。

\[dp[i][l+dis(i,j)-1]=\max(dp[i][l+dis(i,j)-1],dp[j][l]+dis(i,j)) \]

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
int dp[1000][1000];
struct node
{
	int x,y;
}a[N];
int dis(int i,int j)
{
	return abs(a[i].x-a[j].x+a[i].y-a[j].y);
}
bool cmp(node a,node b)
{
	return a.x==b.x?a.y<b.y:a.x<b.x;
}
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i].x>>a[i].y;
	for(int i=1;i<=n;i++)
		dp[i][0]=1;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<i;j++)
		{
			if(a[j].y<=a[i].y)
				for(int l=0;(l+dis(i,j)-1)<=k;l++)
					dp[i][l+dis(i,j)-1]=max(dp[i][l+dis(i,j)-1],dp[j][l]+dis(i,j));
		}
	}
	int maxx=-INT_MAX;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=k;j++)
			maxx=max(maxx,dp[i][j]+k-j);
	cout<<maxx<<endl;
 } 

考试的时候在判最大值的之后写了 \(j=1\) 开始,直接爆掉 \(30\) 分。

笑了,最简单的最长不下降序列的 \(30\) 分我反而没拿到。

考完还去问了学长正解,结果差点尴尬了。

\(T4\) 搞了差不多有 \(1h\) \(30min\),留给我的时间不多了。

看回 \(T3\),是一道大模拟。先看特殊性质的分很好搞(主要是没有优先级),括号的话通过搜索判左右区间即可。

虽然剩下还有时间,但是我还是不想搞了。(这一部分搜索不太熟练。)

最后看到了\(|s|\leq3\) 还有 \(15\) 分钟,因为不用检查文件,我开始了闲情雅致。开始枚举情况,成功的得到了 \(10\) 分。

赛时代码不堪入目,都懂的。

赛后参考了一下题解也打出来了,原来使用栈和 \(vecotr\) 维护。麻了。

结束了。。。等 \(GD\) 自主举行的考试罢。

成绩:\(100+100+60+70=330\)

晚上和 \(npy\) 聊天,瞬间觉悟:还是 \(npy\) 好。

posted @   June_Failure  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示