首页 > 其他分享 >CSP2024 前集训:多校A层冲刺NOIP2024模拟赛10

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛10

时间:2024-10-21 21:09:59浏览次数:1  
标签:10 return val int void 多校 CSP2024 红蓝 dis

前言

不想说啥了最简单的一题是紫,去死吧只改了 T1、T2,T2 原题翻译和赛时题面描述都很唐,赛后断断续续加了好多 hack。

T1 岛屿

设 \(f_{a,b}\) 表示 \(a\) 条两端同色链,\(b\) 条两端异色链时连通块数量的期望。

  • 红红蓝蓝相连得到红蓝 \(\to f_{a-1,b+1}\)。
  • 红红红蓝相连得到红红 \(\to f_{a,b-1}\)。
  • 蓝蓝红蓝相连得到蓝蓝 \(\to f_{a,b-1}\).
  • 红蓝红蓝相连得到红蓝 \(\to f_{a,b-1}\) 或 \(f_{a,b-1}+1\),\(+1\) 表示首尾相连。

顺序不影响结果,不妨先匹配红蓝端的链,固有转移:

\[f_{a,b}=\begin{cases}\frac{1}{2a+b}(f_{a,b-1}+1)+\frac{2a+b-1}{2a+b}f_{a,b-1}=f_{a,b-1}+\frac{1}{2a+b} &b>0 \\ f_{a-1,1}=\frac{1}{2a-1}+f_{a-1,0} &b=0 \\ \end{cases}\]

\(f_{0,0}=0,ans=f_{x,y}=\sum\limits_{i=1}^y\frac{1}{2x+i}+\sum\limits_{i=1}^x\frac{1}{2a-1}\)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int x,y; double ans;
signed main()
{
	freopen("island.in","r",stdin),freopen("island.out","w",stdout);
	scanf("%d%d",&x,&y);
	for(int i=1;i<=x;i++) ans+=1.0/(2*i-1);
	for(int i=1;i<=y;i++) ans+=1.0/(2*x+i);
	printf("%.8lf",ans);
}

T2 最短路

建出最短路树,设当前点为 \(x\),其子树对应 dfs 序上区间 \([l,r]\),他的答案可以由子树外的原图子节点直接更新,即 \(dis_y+w_{(x,y)}\),也可以由子树内的原图子节点节点间接更新,设 \(z\) 表示子树外的任意节点,则可以通过 \(1\to z\to y\to x\) 更新 \(ans_x\),即 \(dis_z+w_{(z,y)}+w_{(y,x)}\)。

发现是单点修改区间查询最小值问题,可以从下往上线段树合并,树上差分直接维护,复杂度 \(O(m\log m+n\log n)\)。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define mid (l+r>>1)
using namespace std;
const int N=1e5+10,M=2e6+10; const ll inf=2e17;
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,tot,fa[N],in[N],out[N],ban[N]; ll dis[N],ans[N];
bitset<N>vis; bitset<(N<<2)>yet;
struct edge
{
	int tot,head[N],nxt[N<<2],to[N<<2],w[N<<2];
	inline void add(int x,int y,int z)
	{nxt[++tot]=head[x],to[tot]=y,w[tot]=z,head[x]=tot;}
}e,g;
struct tree
{
	int tot,top,rt[N],ls[M],rs[M],rub[M]; ll val[M];
	inline int add(int p=0) {return val[p=top?rub[top--]:++tot]=inf,p;}
	inline void del(int &p) {ls[p]=rs[p]=0,rub[++top]=p,p=0;}
	void change(int &p,int l,int r,int x,ll d)
	{
		(!p)&&(p=add());
		if(l==r) return val[p]=min(val[p],d),void();
		x<=mid?change(ls[p],l,mid,x,d):change(rs[p],mid+1,r,x,d);
		val[p]=min(val[ls[p]],val[rs[p]]);
	}
	ll ask(int p,int l,int r,int vl,int vr,ll res=inf)
	{
		if(val[p]>=inf||vl>vr) return inf;
		if(vl<=l&&vr>=r) return val[p];
		if(vl<=mid) res=min(res,ask(ls[p],l,mid,vl,vr));
		if(vr>mid) res=min(res,ask(rs[p],mid+1,r,vl,vr));
		return res;
	}
	void merge(int &x,int y,int l,int r)
	{
		if(!x||!y) return x|=y,void();
		if(l==r) return val[x]=min(val[x],val[y]),del(y),void();
		merge(ls[x],ls[y],l,mid),merge(rs[x],rs[y],mid+1,r);
		val[x]=min(val[ls[x]],val[rs[x]]),del(y);
	}
}T;
inline int oth(int x) {return !x?0:((x&1)?x+1:x-1);}
void dijkstra()
{
	memset(dis,0x3f,sizeof(dis)),dis[1]=0;
	priority_queue<pair<ll,int> >q; q.push({0,1});
	while(!q.empty())
	{
		int x=q.top().second; q.pop();
		if(vis[x]) continue; vis.set(x);
		for(int i=e.head[x],y;y=e.to[i];i=e.nxt[i]) if(dis[y]>dis[x]+e.w[i])
		{
			dis[y]=dis[x]+e.w[i],fa[y]=x,q.push({-dis[y],y});
			yet[ban[y]]=yet[oth(ban[y])]=0,yet[ban[y]=i]=yet[oth(i)]=1;
		}
	}
	for(int i=2;i<=n;i++) g.add(fa[i],i,e.w[ban[i]]);
}
void dfs(int x)
{
	in[x]=++tot;
	for(int i=g.head[x],y;y=g.to[i];i=g.nxt[i]) dfs(y); 
	out[x]=tot;
}
void solve(int x,ll dep)
{
	for(int i=g.head[x],y;y=g.to[i];i=g.nxt[i])
		solve(y,dep+g.w[i]),T.merge(T.rt[x],T.rt[y],1,n);
	if(x==1) return ;
	ans[x]=min(ans[x],min(T.ask(T.rt[x],1,n,1,in[x]-1),T.ask(T.rt[x],1,n,out[x]+1,n))-dep);
	for(int i=e.head[x],y;y=e.to[i];i=e.nxt[i])
	{
		if(yet[i]||(in[y]>=in[x]&&out[y]<=out[x])) continue;
		T.change(T.rt[x],1,n,in[y],dis[y]+e.w[i]+dep);
		ans[x]=min(ans[x],dis[y]+e.w[i]);
	}
}
signed main()
{
	freopen("path.in","r",stdin),freopen("path.out","w",stdout);
	read(n,m),memset(ans,0x3f,sizeof(ans)),T.val[0]=inf;
	for(int i=1,x,y,z;i<=m;i++) read(x,y,z),e.add(x,y,z),e.add(y,x,z);
	dijkstra(),dfs(1),solve(1,0);
	for(int i=2;i<=n;i++) write(ans[i]>=(inf>>1)?-1:ans[i]),puts("");
}

T3 列表

咕了。

T4 种植

咕了咕了。

标签:10,return,val,int,void,多校,CSP2024,红蓝,dis
From: https://www.cnblogs.com/Charlieljk/p/18490429

相关文章

  • 1107. 每日新用户统计
    力扣题目跳转(1107.每日新用户统计-力扣(LeetCode))Traffic 表:+---------------+---------+|ColumnName|Type|+---------------+---------+|user_id|int||activity|enum||activity_date|date|+---------------+---------+......
  • [20241021]使用gdb查看修改内存地址以及相关值.txt
    [20241021]使用gdb查看修改内存地址以及相关值.txt--//执行oradebugpoke报错,感觉oracle已经禁止这类hack操作。1.环境:SYS@book>@ver2==============================PORT_STRING                  :x86_64/Linux2.4.xxVERSION              ......
  • 10.21 ~ 10.27
    10.21Day-4快CSP啦……话说真的应该这么早就开始记“Dayx”吗为啥这几天这么冷啊要冻死了......
  • csp2024 复习计划
    啊啊啊啊啊啊啊啊啊啊啊啊啊啊先复习板子,再复习Trick和题目。1.数据结构平衡树笛卡尔树线段树、树状数组的各种Trick哈希的方法、题目2.杂算法CDQ分治、整体二分、点分治、点分树KMP可以做道大搜索练练手3.图论最小生成树、最短路建模相关......
  • 24.10.21
    嘛,我是个非常没有动力的人啊现在大概只想躺平哦有时候也可能会有一点点干劲吧,不过属于是过一两个小时就会消失的那种大概是因为没有目标吧,也可以说是没有我特别感兴趣的事其实硬要说感兴趣的事嘛,也有,不过基本都不切实际罢了我倒是想去学钢琴,画画,日语啊啥的,但是家庭条件和生活......
  • [赛记] 多校A层冲刺NOIP2024模拟赛09 && 10
    排列最小生成树(pmst)50pts又是诈骗题,然后又不会。。。暴力很暴力,直接建个完全图跑Kruskal即可;正解考虑如果我们连接编号相邻的点,那么每个边的边权都小于$n$真能考虑到吗?;所以我们最终的最小生成树中的边边权都小于$n$;那么对于$|p_i-p_j|\times|i-j|<n$......
  • 10.23 模拟赛
    炼石计划10月05日NOIP模拟赛#9【补题】-比赛-梦熊联盟复盘既然以前做过,复盘貌似不重要了吧?T2很快写完了。T1想到堆就做完了。T3忘了咋做了,好像是个DP但剩下忘了。于是写了暴力分跑路了。T4正解显然不可能会的。打满了暴力。最后T1数组开小挂了\(50\)。......
  • 1021
    1.在子类的构造方法运行之前,必须调用父类的构造方法,,不能反过来classGrandparent{publicGrandparent(){System.out.println("GrandParentCreated.");}publicGrandparent(Stringstring){System.out.println("GrandParentCreated.String:"+string); }}classParen......
  • 10.21日每日收获
    1、扇区擦除时按首地址擦除,若设定地址不是首地址也从首地址开始擦除,每512个字节为一组,如00H-200H为一组,200H-400H为一组,擦除数据时按组擦除,若果设置擦除开始地址为100h,则仍然会从00H-200H擦除,而不是100H-300H2、有些芯片的FLASHROM结构是类RAM结构,也就是无需擦除可以直接覆盖......
  • 2024.10.21训练记录
    上午NOIP模拟赛A猜了结论。一个一个数做。当前这个数插进去的时候,设前驱为pre[i],后继为nxt[i]。设\(x=max(a[pre[i]],a[nxt[i]]),y=min(a[pre[i]],a[nxt[i]])\)。则:当\(a[i]>x\)时,\(ans+=a[i]-x\);当\(a[i]<y\)时,\(ans+=y-a[i]\);否则\(ans\)不......