首页 > 其他分享 >NOIP2024 前集训:MX 炼石计划 NOIP 模拟赛 20

NOIP2024 前集训:MX 炼石计划 NOIP 模拟赛 20

时间:2024-11-14 21:07:59浏览次数:1  
标签:20 炼石 NOIP int void mid dep inline define

前言

今天不知道为啥去打 MX 了,bug 不少啊,包括但不限于赛时能通过自己主页看自己题过没过,赛时可以进入“补题”的比赛交从而直接成 IOI 赛制,文件还有点问题?

0+100+12+0,T1 读假题:\(\ge×,>√\),喜提爆零,但是本来就不会正解,我去我表都打出来了不知道二分??!?!!?

不打 T4 是错误的,乱搞能得的分挺多的。

T2 是签,线段树直接跑就行了,行为是值域线段树所以从 \(0\) 开始,结果查询的时候忘了还是从 \(1\) 开始的,唐了好长时间,然后因为有 \(0\),所以不能用查理线段树。

下午到机房不知道为啥困得快死了,在机房睡了不知道多长时间。

T1 邻间的骰子之舞

设 \(x\) 表示复制,\(y\) 表示粘贴,打表或者基本不等式证一下,则最优解一定是形如 \(x~k\cdot y~x~k\cdot y…x~(k-1)\cdot y~x~(k-1)\cdot y…\) 的形式,发现 \(x\) 的个数 \(\le\log_2(n)\),可以直接枚举,\(k\) 则可以直接二分,再枚举 \(k\) 和 \(k-1\) 的断点,复杂度 \(O(\log^3)\),发现每次都枚举 \(k\) 是唐氏,改成 \(O(\log^2)\) 的。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define ull __int128
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=1e6+10;
template<typename Tp> inline void read(Tp&x)
{
	x=0;register bool z=true;
	register char c=getchar_unlocked();
	for(;!isdigit(c);c=getchar_unlocked()) if(c=='-') z=0;
	for(;isdigit(c);c=getchar_unlocked()) x=(x<<1)+(x<<3)+(c^48);
	x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
ll n; int m; ull x,y,ans=1e27;
inline bool check(int x,ll y)
{ull res=1; while(x--) {res*=y; if(res>n) return 1;} return 0;}
inline ull qpow(ull a,int b)
{ull res=1; for(;b;a*=a,b>>=1) (b&1)&&(res*=a); return res;}
signed main()
{
	freopen("dice.in","r",stdin),freopen("dice.out","w",stdout);
	read(n,x,y),m=log2(n)+1;
	for(int i=1;i<=m;i++)
	{
		ll l=0,r=n,mid,res;
		while(l<=r) check(i,(mid=l+r>>1)+1)?r=(res=mid)-1:l=mid+1;
		ull sum=qpow(res,i); for(int j=1;j<=i;j++)
		{
			sum/=res,sum*=(res+1);
			sum>n&&(ans=min(ans,(x+(res-1)*y)*i+y*j));
		}
	}
	write(ans);
}

T2 星海浮沉录

对于一个值 \(pre_i\),表示 \(i\) 距离上一个 \(a_i\) 出现位置的距离,那么若存在 \(pre_i>x\) 则 \(a_i\) 就可能成为 \(mex\),那么对于每一个权值维护其最大的 \(pre\),最后在线段树上跑二分找到最小的 \(a_i\) 满足 \(pre_i>a_i\) 即可。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define mid (l+r>>1)
#define ls (p<<1)
#define rs (p<<1|1)
#define pb push_back
using namespace std;
const int N=1e6+10;
template<typename Tp> inline void read(Tp&x)
{
	x=0;register bool z=true;
	register char c=getchar_unlocked();
	for(;!isdigit(c);c=getchar_unlocked()) if(c=='-') z=0;
	for(;isdigit(c);c=getchar_unlocked()) x=(x<<1)+(x<<3)+(c^48);
	x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,a[N],rk[N],pre[N],now[N]; vector<int>e[N],pos[N];
struct private_tree
{
	vector<int>mx;
	inline void build(int p,int l,int r,int x)
	{
		if(l==r) return mx[p]=pre[e[x][l-1]],void();
		build(ls,l,mid,x),build(rs,mid+1,r,x),mx[p]=max(mx[ls],mx[rs]);
	}
	inline void init(int x,int siz) {mx.resize((siz+5)<<2),build(1,1,siz,x);}
	inline void change(int p,int l,int r,int x,int d)
	{
		if(l==r) return mx[p]=d,void();
		x<=mid?change(ls,l,mid,x,d):change(rs,mid+1,r,x,d);
		mx[p]=max(mx[ls],mx[rs]);
	}
}t[N];
struct total_tree
{
	int mx[N<<2];
	inline void build(int p,int l,int r)
	{
		if(l==r) return mx[p]=t[l].mx[1],void();
		build(ls,l,mid),build(rs,mid+1,r),mx[p]=max(mx[ls],mx[rs]);
	}
	inline void change(int p,int l,int r,int x,int d)
	{
		if(l==r) return mx[p]=d,void();
		x<=mid?change(ls,l,mid,x,d):change(rs,mid+1,r,x,d);
		mx[p]=max(mx[ls],mx[rs]);
	}
	inline int ask(int p,int l,int r,int x)
	{
		if(l==r) return l;
		if(mx[ls]>=x) return ask(ls,l,mid,x);
		if(mx[rs]>=x) return ask(rs,mid+1,r,x);
		return n+1;
	}
}T;
signed main()
{
	freopen("star.in","r",stdin),freopen("star.out","w",stdout);
	read(n,m); for(int i=1;i<=n;i++)
		read(a[i]),pre[i]=i-now[a[i]]-1,e[a[i]].pb(now[a[i]]=i);
	for(int i=0;i<=n;i++)
		pre[n+i+1]=n-now[i],e[i].pb(n+i+1),t[i].init(i,e[i].size());
	T.build(1,0,n); for(int i=0;i<=n;i++)
	{
		pos[i].pb(0); for(int j=0;j<e[i].size();j++)
			rk[e[i][j]]=j+1,pos[i].pb(e[i][j]);
	}
	for(int op,x;m;m--)
	{
		read(op,x); if(op==1)
		{
			if(a[x]==a[x+1]) continue;
			t[a[x]].change(1,1,e[a[x]].size(),rk[x],++pre[x]);
			t[a[x]].change(1,1,e[a[x]].size(),rk[x]+1,--pre[pos[a[x]][rk[x]+1]]);
			T.change(1,0,n,a[x],t[a[x]].mx[1]);
			t[a[x+1]].change(1,1,e[a[x+1]].size(),rk[x+1],--pre[x+1]);
			t[a[x+1]].change(1,1,e[a[x+1]].size(),rk[x+1]+1,++pre[pos[a[x+1]][rk[x+1]+1]]);
			T.change(1,0,n,a[x+1],t[a[x+1]].mx[1]);
			swap(pos[a[x]][rk[x]],pos[a[x+1]][rk[x+1]]);
			swap(a[x],a[x+1]),swap(rk[x],rk[x+1]),swap(pre[x],pre[x+1]);
		}
		else write(T.ask(1,0,n,x)),puts("");
	}
}

T3 勾指起誓

高级多项式题,再见。

T4 第八交响曲

双调排序。

对于一个单峰序列,设 \(n=2^k\),对于 \(i\in [1,2^{k-1}]\) 执行一次 \((i,i+2^{k-1})\) 操作,则序列会变成一个满足 \(\forall i\in[1,2^{k-1}],j\in [2^{k-1}+1,2^k],a_i<a_j\) 的两个单峰序列。

那么对于一个乱序的序列,假设可以将他变成两个有序序列,考虑合并两个有序序列,发现只有把有区间的所有数翻转就和上面一样了,于是就可以递归求解了,复杂度 \(O(\frac{k(k+1)}{2})\)。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define pb push_back
#define mkp make_pair
#define fi first
#define se second
using namespace std;
const int N=110;
int n,ans,pos1[N],pos2[N][N]; vector<pair<int,int> >e[N];
inline void solve2(int l,int r,int dep,int top)
{
	if(l==r) return ; int mid=l+r>>1;
	if(!pos2[top][dep]) pos2[top][dep]=++ans;
	for(int i=l,j=mid+1;j<=r;i++,j++) e[pos2[top][dep]].pb(mkp(i,j));
	solve2(l,mid,dep+1,top),solve2(mid+1,r,dep+1,top);
}
inline void solve1(int l,int r,int dep)
{
	if(l==r) return ; int mid=l+r>>1;
	solve1(l,mid,dep+1),solve1(mid+1,r,dep+1);
	if(!pos1[dep]) pos1[dep]=++ans;
	for(int i=l,j=r;j>mid;i++,j--) e[pos1[dep]].pb(mkp(i,j));
	solve2(l,mid,dep+1,dep),solve2(mid+1,r,dep+1,dep);
}
signed main()
{
	freopen("symphony.in","r",stdin),freopen("symphony.out","w",stdout); 
	scanf("%d",&n); int tmp=n; n=powl(2,ceil(log2(n)));
	solve1(1,n,1),printf("%d\n",ans);
	for(int i=1;i<=ans;i++,puts("")) for(auto j:e[i])
		if(j.fi<=tmp&&j.se<=tmp) printf("CMPSWP R%d R%d ",j.fi,j.se);
}

标签:20,炼石,NOIP,int,void,mid,dep,inline,define
From: https://www.cnblogs.com/Charlieljk/p/18546827

相关文章

  • [GXOI/GZOI2019] 旅行者
    算法\(O(Tn\log^2n)\)对于\(\rm{Subtask}\text{}1\),直接跑\(n\)遍\(\rm{dijkstra}\)就可以,这是\(O(Tn^2\logn)\)的对于\(\rm{Subtask}\text{}1\)的优化:显然的,每次\(\rm{dijkstra}\)只需要跑到离自己最近的感兴趣的点即可,因为后面的不可能......
  • 2024.11.14 鲜花
    双调排序的正确性证明暨第八交响曲题解推歌:DoubleAgent好多题解都写的或多或少有问题(包括那篇\(30\)分钟速通),终于是整明白了。首先给出双调序列的定义:满足一下条件之一的序列\(\existsk,\foralli<k,a_i>a_{i+1}\land\foralli>k,a_i<a_{i+1}\)即是单谷。其可以通过......
  • 2024/11/13日 日志 代码优化 以及 JSP 的快速入门、原理、脚本、缺点 和 EL表达式 以
    代码优化--创建SqlSessionFactory代码优化点击查看代码--//2.1获取SqlSessionFactory对象--Stringresource="mybatis-config.xml";--InputStreaminputStream=Resources.getResourceAsStream(resource);--SqlsessionFactorysqlSessionFactory=newSqlSessio......
  • 241114 noip 模拟赛
    省流:\(90+100+20+10\)。t1t2花太久时间了。T1题意:给一张\(n\timesm\)的网格图,\((x,y)\)与\((x+1,y)\)的边为\(a_x+b_y\),\((x,y)\)与\((x,y+1)\)的边为\(c_x+d_y\)。求这张图的最小生成树的边权和。\(n,m\leq10^6\)。稍微画图注意到,一个点一定跟它......
  • 2024/11/14日 日志 关于 MVC 分层开发模式
    MVC是一种分层开发的模式,是我们在完成项目时常用的开发模式。点击查看代码--MVC模式--MVC是一种分层开发的模式,其中:--M:Model,业务模型,处理业务--V:View,视图,界面展示--C:Controller,控制器,处理请求,调用模型和视图----MVC好处--职责单一,互不影响--有利于分......
  • [68] (炼石计划) NOIP 模拟赛 #20
    学了一个挺帅的MerMaid所以用一下MerMaid就是你们接下来会看到的好看小标题但是实际上它是用来画流程图的……flowchartTB A(邻间的骰子之舞) styleAcolor:#ffffff,fill:#00c0c0,stroke:#ffffff考虑每次复制以后一定会粘贴若干次(大于零,否则没有意义),因此将复制粘贴捆绑......
  • 代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II
    文档讲解:代码随想录视频讲解:代码随想录状态:完成2道题滑动窗口滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题适用场景:字符串匹配问题、子数组问题、定长问题滑动窗口模板:如果一个字符进入窗口,应该增加windows计数器;如果一个字符将移除窗口的......
  • MX 2025--炼石计划 NOIP 模拟赛 #20
    打得抽象。T3,T4放俩难的板子。由于是MX的题,就不放题意了。邻间的骰子之舞发现复制操作不会超过\(64\)次,而粘贴操作肯定是越均匀越好,直接二分暴力跑就行了。点此查看代码#include<bits/stdc++.h>usingnamespacestd;#definerep(i,s,t,p)for(inti=s;i<=t;i+=p)#......
  • 2024年秋国开电大《建筑结构试验》形考任务1-4
    形考作业一1.下列选项中,()项不属于科学研究性试验。答案:检验结构的质量,说明工程的可靠性2.下列各项,()项不属于工程鉴定性试验。答案:验证结构计算理论的假定3.按试验目的进行分类,可将结构试验分成()。答案:工程鉴定性试验和科学研究性试验4.按试验对象进行分类,可将结构试验分成()......
  • 2024/11/14
    修改数组(蓝桥杯)分数20作者liudan单位石家庄铁道大学给定一个长度为N的数组A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,AN。当修改Ai时,小明会检查Ai是否在A1∼Ai−1中出......