首页 > 其他分享 >NOIP 2023 模拟赛 20230712 C 论剑

NOIP 2023 模拟赛 20230712 C 论剑

时间:2023-07-12 20:34:30浏览次数:41  
标签:log NOIP int void gc && 20230712 论剑 define

首先是伟大的题面
image
然后是数据范围
image

先解决1-4号数据点
1.枚举每个gcd的值p,统计一次答案,得到最小值(期望得分20)

\[ans=\min_{p=2}^{\max a}\sum^n_{i=1}\min(a_i \bmod p,p-(a_i \bmod p)(a>p )) \]

2.我们可以发现p仅在为质数时不会重复,也可以将p换为质数(期望得分40)

两种的时间复杂度:
1.$$O(n\max a)$$
2.$$O(nP(\max a))$$

博主比较蒟蒻,只会带log的求质数,所以复杂度为\(O(n\log(\max a))\),也可以拿到40
(实际上我只枚举到1000,但还是用40分的代码拿到80分)

继续发呆思考
可以发现gcd为2时,每个\(a_i\)只需要+1或-1(\(a_i\neq 1\))
答案不会超过n

惊人的发现:
修改的次数超过1的最多有\(\frac n 2\)个(可以用反证法证明,若修改超过1的超过\(\frac n 2\)个则答案会大于n)
我们又可以得到修改次数不超过1的(即修改次数为1的)大于\(\frac n 2\)个
有什么用呢?没有什么用

如果我们找到了修改次数不超过1的,那它修改后可能为\(a_i-1(a\neq1)、a_i、a_i+1\),而答案的质因数就在里面
我们只需要预处理出质数,求出\(a_i-1(a\neq1)、a_i、a_i+1\)的所有质因数,每个像1、2中那样跑一遍,即可求出答案
复杂度\(O(n)\),如此优秀,直接碾过去

什么,万一这个不是修改不超过1的数?没关系,抽到的概率至少大于50%,稳赚不亏
保守的办法是枚举\(\frac n 2 +1\)个数,但复杂度又变回了\(O(n^2P(a_i))\)运气不好甚至没有40分,所以我说没有用

既然提到了“保守”,那肯定有“激进”的方法
看眼复杂度,如果\(n^2\)可以变为\(n\log n\),那就可以有惊无险的通过这道题
那我们就抽\(\log n\)个数,每个跑一次上述的方法

这就是正解了,但不完全正解(
可以想到,如果抽到的数中,没有一个是我们想要的,那就可以喜提“WA”了
算下概率
每次选择都有至少一半的概率,总共抽\(\log n\)次
概率为\(1-\frac 1 {n^{\log n}}\),在后面几个点中\(\log n\)大概为20左右遇到可以买彩票了
这个概率是很低的,根据“能AC的就是正解”,可以知道这就是一个正经的正解

WARN:前几个点n较小时会出现\(\log n\)较小的情况,可能会喜提彩票一等奖
所以我们要给选的数的个数设置个下界,或者将选的个数直接定为20左右

喜闻乐见的代码时间:

哦,对了,为了防止万恶的脑洞比较大的出题人将前面几个数全部设为不满足的数
我们可以加入随机数,或者直接看RP(

博主的超长代码
#include<bits/stdc++.h>
#define fo(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define Ts template<typename Ty,typename... Ar>
#define Tp template<typename Ty>
#define isdigit(c) ((c)>='0'&&(c)<='9')
#define ll long long
#define RS register
#define gc getchar
#define pc putchar
#define I inline
using namespace std;
Tp I Ty wmax(Ty a,Ty b){return a>=b? a:b;}
Tp I Ty wmin(Ty a,Ty b){return a<=b? a:b;}
namespace WrongIO
{
	Tp I void read(Ty &x){x=0;Ty opt=1;char c=gc();while(!isdigit(c)&&c!='-')c=gc();if(c=='-')opt=-1,c=gc();while(isdigit(c))x=(x<<3)+(x<<1),x+=c-'0',c=gc();x*=opt;return;}
	Tp I void write(Ty x){short OI_USE[50],OI_top=0;if(x<=0) if(x==0)pc('0');else pc('-'),x*=-1;while(x)OI_USE[++OI_top]=x%10,x/=10;while(OI_top--)pc(OI_USE[OI_top+1]+'0');return;}
    I void writec(char c[]){int len=strlen(c);for(int i=0;i<len;i++)pc(c[i]);}
    I void writes(string s){int len=s.length();for(int i=0;i<len;i++)pc(s[i]);}
    I void readc(char &c,int l,int r){c=gc(); while(c!=EOF&&(c<l||c>r)) c=gc();}
    I void readc(char &c,char val){c=gc();while(c!=EOF&&c!=val) c=gc();}
    I void readc(char val){char c;c=gc();while(c!=EOF&&c!=val) c=gc();}
    I void readls(string &s){char c=gc();while(c!='\n') s.push_back(c),c=gc();}
    Ts I void read(Ty &x,Ar &...y) {read(x),read(y...);}
} using namespace WrongIO;
ll n,e[200050],ans=1e12;
ll zs[1000050],tp;
void check(ll vl)
{
	ll ta=0;
	for(int i=1;i<=n;i++)
	{
		if(e[i]<vl) ta+=vl-e[i];
		else ta+=wmin(e[i]%vl,vl-(e[i]%vl));
	}
	if(ta<ans) ans=ta;
	return;
}
void Work(ll x)
{
	bool flag=1;
	for(int j=2;j<=sqrt(x);j++)
	{
		if(x%j==0)
		{
			flag=0;
			break;
		}
	}
	if(flag==1&&x!=1) check(x);
	for(int i=1;i<=tp;i++)
	{
		if(zs[i]>x) return;
		x%zs[i]==0&&(check(zs[i]),0);
	}
	return;
}
int main()
{

	read(n);
	for(int i=1;i<=n;i++) read(e[i]);
	for(int i=2;i<=1000001;i++)
	{
		bool flag=1;
		for(int j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				flag=0;
				break;
			}
		}
		if(flag==1) zs[++tp]=i;
	}
	ll ED=25; srand(43543);
	for(int i=1;i<=ED;i++)
	{
		ll ez=rand()%n+1;
		ll ee=e[ez];
		ee!=1&&(Work(ee-1),0);
		Work(ee);
		Work(ee+1);
	}
	write(ans);
	return 0;
}

以及给出巨佬兼命题人的cxr的超短代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
#define V 1000000
#define LL long long
using namespace std;
int n;LL a[N+5],p[N*30];set<LL> vis;
namespace FastIO
{
	#define FS 100000
	#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
	char oc,FI[FS],*FA=FI,*FB=FI;
	Tp I void read(Ty& x) {x=0;W(!isdigit(oc=tc()));W(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));}
	Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}using namespace FastIO;
int Pt,P[V+5];I void Sieve() {for(RI i=2,j;i<=V;++i)
	for(!P[i]&&(P[++Pt]=i),j=1;j<=Pt&&i*P[j]<=V;++j) if(P[i*P[j]]=1,!(i%P[j])) break;}
int ans;I void Check(Con LL& x)
{
	if(vis.find(x)!=vis.end()) return;vis.insert(x);
	LL res=0;for(RI i=1;i<=n&&res<ans;++i) res+=a[i]<x?x-a[i]:min(a[i]%x,x-a[i]%x);
	ans>res&&(ans=res);
}
I void Work(LL x)
{
	for(RI i=1;i<=Pt&&P[i]<=x;++i) if(!(x%P[i])) {Check(P[i]);W(!(x%P[i])) x/=P[i];}
	x^1&&(Check(x),0);
}
int main()
{
	RI T,i;LL x;for(srand(998244353),Sieve(),read(n),i=1;i<=n;++i) read(a[i]);
	for(ans=n,T=1;T<=30;++T) x=a[1ull*rand()*rand()*rand()%n+1],Work(x),Work(x+1),x^1&&(Work(x-1),0);
	return printf("%d\n",ans),0;
}

蒟蒻的第一遍题解,全是文字不是还有两张题面吗,非常不好

给上样例
输入1
3
1 3 9
输出1
2

输入2
3
1001 1999 3000
输出2
2

样例3(太大了)
放不下

标签:log,NOIP,int,void,gc,&&,20230712,论剑,define
From: https://www.cnblogs.com/JuyeScene/p/17548759.html

相关文章

  • CSP&NOIP2022游记
    今年是最后一年了,真的是来划水的了已经无欲无求了,只是最好能有个七级吧,要是没有也无所谓,反正我自始至终都是个OI废物已经完全回归whk咯谢幕之战,你会变好,还是更烂?冷知识:从去年CSP结束至今,Bosun在LG上只做了9题初赛前一天住了旅馆,周边玩了一下,感觉苏州古城区真的是一点意思也......
  • P1002 [NOIP2002 普及组] 过河卒 入门级别的dp
     思路:1.标记马点z[i][[j]=02.正常z[i][j]=z[i-1][j]+z[i][j-1]#include<iostream>usingnamespacestd;intn,m,a,b;longlongma[30][30],bck[30][30];intdx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1};voidcan_not_reach(intx,inty){ma[......
  • NOIP2020游记
    (把很久之前博客漏掉的一篇搬上来了,以此勉励自己每次考试测一遍极限数据,观察大样例)看到这篇游记,您会发现2/3年前的zbs是多么naive啊!时间2020年12月5日下午以下正文:这是我到初二为止获得的第四个二等奖了,离一等,就差把乘/除号换个位置的距离啊!Day-1周五像往常一样回家,瞬间躺......
  • HHHOJ #1238. 「NOIP 2023 模拟赛 20230712 D」但战斗还未结束 思考--zhengjun
    赛时想写60pts,结果cxr似乎少算了一点空间,导致我一直没把空间卡过去QWQ。当时不会dfs求拓扑序,这里讲一下。枚举所有非访问过的点依次dfs,每次进行下列操作:找出\(v\)的一个未访问过的入点\(u\),调用dfs(u);找不到\(u\)的时候,把\(v\)加入拓扑序列中。代码#inc......
  • 成语积累 20230712
    惨淡经营:惨淡:苦费心思;经营:筹划。原指煞费苦心地从事绘画或诗文创作,今泛指在困难的境况中艰苦的从事某种事业。作谓语,定语。不吐不茹:不吐刚,不茹柔:不吐坚硬的东西,不吞柔软的东西,即吞坚硬的东西。形容人正直不阿,不欺软怕硬。作谓语,定语。近义:刚正不阿。反义:柔茹刚吐。例句:我们就是......
  • 20230712 讲题
    CF1364DEhab'sLastCorollary简单题。特判掉\(m=n-1\)的情况,此时一定能找到一个大小为\(\left\lceil\frac{k}{2}\right\rceil\)的独立集,二分图染色即可。否则,我们建出dfstree,找到一条连接的两个端点深度之差最小的返祖边,设它为\((u,v)\),且\(dep_u>dep_v\)。......
  • 题解 [NOIP2011 提高组] 聪明的质监员
    题目链接不难发现,\(W\)越大,\(y_i\)以及\(y\)就越小,\(W\)越小,\(y_i,y\)就越大。所以这是一个二分答案。考虑如何\(check\)。观察\[y_i=\sum\limits_{j=l_i}^{r_i}[w_j\geW]\times\sum\limits_{j=l_i}^{r_i}[w_j\geW]v_j\]不难发现,乘号的前后都是区间和的形式,有......
  • 「NOIP 2023 模拟赛 20230711 B」过往未来
    summarization给定一个\(n\)个节点的树,定义\(x_1,x_2,\cdots,x_k\)生成的子树为树中边数最少的包含\(x_1,x_2,\cdots,x_k\)的连通块。对所有可能的\(x_1,x_2,\cdots,x_k\quad(1\lex_1<x_2<\cdots<x_k\len)\),求\(x_1,x_2,\cdots,x_k\)生成的子树的大小(边数和)总和。so......
  • NOIP2013-2023题解
    本文章主要是为了不想卷题的时候不是特别颓废而准备本文章是为了总结NOIP最近的题目(为了今年NOIP做准备),目前还没写完,尽量做的全面一些。2013积木大赛给定一个长度为\(n\)的序列\(h_i\),初始有一个全为\(0\)的序列,每次操作可以任意选择\(L,R\),使得\([L,R]\)这段区......
  • 「NOIP 模拟赛 20230709」T3 - 与行星相会 题解
    题目大意原题有一个\(n\timesn\)的点阵,将相邻的点连边得到一个\((n-1)\times(n-1)\)的网格。\(q\)次操作,每次删掉一条边,求删掉后边两端的点是否仍在一个连通块内。强制在线。题解显然,由于对偶图的性质,原图的一个割对应对偶图中的一个环,所以只需要删掉一条边时在对偶图中......