首页 > 其他分享 >『模拟赛』暑假集训CSP提高模拟21

『模拟赛』暑假集训CSP提高模拟21

时间:2024-08-15 18:17:26浏览次数:14  
标签:cnt 21 idx int rd 模拟 CSP hd dis

『模拟赛』暑假集训CSP提高模拟21

终于没RE了!不枉我辛辛苦苦调了几个小时...(

但是暴力没打完...(逃

T1 黎明与萤火

DFS序乱糊+贪心

注意要先消除叶子结点。

Elaina's Code
int n,fa[N],rdeg[N],hd[N],idx,ans[N],cnt;
bool vis[N];
stack<int> sta;
struct EDGE{
	int nxt,to;
}e[N<<1];

void add(int x,int y){
	e[++idx]=(EDGE){hd[x],y};
	hd[x]=idx;
}

void dfs(int x,int f){
	fa[x]=f;
	sta.push(x);
	for(int i=hd[x];i;i=e[i].nxt){
		int to=e[i].to;
		if(to==f) continue;
		dfs(to,x);
	}
}

void dfs2(int x){
	vis[x]=1;
	ans[++cnt]=x;
	for(int i=hd[x];i;i=e[i].nxt){
		int to=e[i].to;
		--rdeg[to];
		if(to==fa[x] || vis[to]) continue;
		if(!(rdeg[to]&1)) dfs2(to);
	}
}

signed main(){
	n=rd;
	for(int i=1;i<=n;i++){
		int x=rd;
		if(x){
			add(i,x),add(x,i);
			++rdeg[i],++rdeg[x];
		}
	}
	
	dfs(1,0);
	while(!sta.empty()){
		int k=sta.top();
		sta.pop();
		if(!(rdeg[k]&1)) dfs2(k);
	}
	
	if(cnt==n){
		puts("YES");
		for(int i=1;i<=cnt;i++){
			printf("%lld\n",ans[i]);
		}
	}else{
		puts("NO");
	}
	
	return Elaina;
}

T2 Darling Dance

之前刷题好像刷到过一个类似的?但还是调了我好久...................... \(\ :(((((((((((((((((((((\)

赛时思路不是很清晰,简直一通乱维护...

贪心搞了搞,若当前答案集合的大小小于 \(K\) 且优先队列非空,则继续优先队列遍历,每次把一条边加入到答案集合中...

Elaina's Code
int hd[N],n,m,k,pre[N],vis[N],idx=1;
struct node{
    int nxt,to,w;
}e[N<<1];
inline void add(int x,int y,int w){
    e[++idx]=node{hd[x],y,w};
	hd[x]=idx;
}
int dis[N];
vector<int> ans;
priority_queue<pair<int,int> > q;

void dij(){
    for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
    dis[1]=0;
    q.push(make_pair(0,1));
    while(!q.empty()&&ans.size()<k){
        int u = q.top().second;
		q.pop();
        if(vis[u]) continue;
        
        if(u^1) ans.push_back(pre[u]/2);
        vis[u]=1;
        for(int i=hd[u];i;i=e[i].nxt){
            int to=e[i].to,w=e[i].w;
            if(dis[to]>dis[u]+w){
                dis[to]=dis[u]+w;
				pre[to]=i;
                q.push(make_pair(-dis[to],to));
            }
        }
    }
}

signed main(){
//	freopen("T2.in","r",stdin);
//  freopen("out.out","w",stdout);
	
	n=rd,m=rd,k=rd;
    for(int i=1;i<=m;i++){
        int x=rd,y=rd,w=rd;
        add(x,y,w),add(y,x,w);
    }
    
	dij();
    k=ans.size();
    
    printf("%lld\n",k);
    for(int i=0;i<k;i++) 
		printf("%lld ",ans[i]);
	return Elaina;
}

其实这是一个最短路径树(SPT)的板子,由于 SPT 只需要 \(n−1\) 条边,我们删边只需要留下 \(min(k,n−1)\) 条边就行。

Dijkstra 跑完后 dfs 判断是否为 SPT 上的边并输出就行。不过 \(k=0\) 要特判。

Elaina's Code
int n,m,k,cnt;
int hd[N],idx;
struct EDGE{
	int nxt,to,w;
}e[N];
int dis[N],pre[N];
bool vis[N];
struct node{
	int to,w;
	bool operator < (const node& a)const{
		return w>a.w;
	}
};
priority_queue<node>q;

inline void add(int x,int y,int z){
	e[++idx]=(EDGE){hd[x],y,z};
	hd[x]=idx;
}

void dij(int s){
	memset(dis,0x7f,sizeof dis);
	dis[s]=0;
	q.push((node){s,0});
	while(!q.empty()){
		int u=q.top().to;q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=hd[u];i;i=e[i].nxt){
			int to=e[i].to;
			if(dis[to]>=dis[u]+e[i].w){
				dis[to]=dis[u]+e[i].w;
				q.push((node){to,dis[to]});
				pre[to]=i;
			}
		}
	}
}
void dfs(int u){
	for(int i=hd[u];i;i=e[i].nxt){
		int to=e[i].to;
		if(i==pre[to]){
			++cnt;
			if(cnt>k||cnt==n) exit(0);
			printf("%lld ",i+1>>1);
			dfs(to);
		}
	}
}

signed main(){
	n=rd,m=rd,k=rd;
	for(int i=1;i<=m;++i){
		int a,b,c;
		a=rd,b=rd,c=rd;
		add(a,b,c),add(b,a,c);
	}
	dij(1);
	printf("%lld\n",k>n-1?n-1:k);
	dfs(1);
	return 0;
}

T3 Non-breath oblige

亖了。

看什么看,暴力打挂了不行吗?

T4 妄想感伤代偿联盟

我看你是在妄想。

翻到一张 罕见 莲莲的图

标签:cnt,21,idx,int,rd,模拟,CSP,hd,dis
From: https://www.cnblogs.com/Elaina-0/p/18360650

相关文章

  • EndNote21.4安装教程(最新版)
    下载链接:https://docs.qq.com/doc/DSVZXTVRvYXdEd21q软件介绍、EndNote文献管理软件是由科睿唯安公司开发的文献管理软件,可用于帮助研究人员管理和组织参考文献、引用和注释,从文献检索、组织科研活动、撰写论文,到发表文章和共享科研成果,助力机构用户加速科研流程。EndNote......
  • 暑假集训CSP提高模拟21
    暑假集训CSP提高模拟21组题人:@Muel_imj\(T1\)P241.黎明与萤火\(10pts\)原题:CF963BDestructionofaTree部分分\(10pts\):生成\(1\simn\)的全排列然后依次判断。\(20pts\):输出NO。正解叶子节点的度数为\(1\),不能直接删除,只能先删除父亲节点后再......
  • 生态系统NPP及碳源、碳汇模拟(土地利用变化、未来气候变化、空间动态模拟)
    由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作用,准确地评估陆地生态系统碳汇及碳源变化对于研究碳循环过程、预......
  • 假设Sigmund Landers在商业街设置了一个提供建议的摊位,顾客可以购买1分钟,2分钟,或3分钟
    /假设SigmundLanders在商业街设置了一个提供建议的摊位,顾客可以购买1分钟,2分钟,或3分钟的建议,为确保交通每个摊位前排队等待的顾客最多10人,用两个队列模拟两个摊位/#include<stdio.h>#include<stdlib.h>#defineMAX_SIZE10typedefstruct{intitems[MAX_SIZE];......
  • C++趣味实验之:设计一个模拟公司运营的程序(极简版)
    根据剩余价值理论,设计一个模拟公司运营的程序原理非常简单: (此公式为企业扩大再生产的基本规律)同理,我们可以利用C++来实现这个操作,这就需要使用递归函数doublen,c,sum1,d1,z1;cout<<"输入启动资金(万元):"<<endl;cin>>n;intb;cout<<"输入市场劳动力数目:"<<endl;ci......
  • 计算机图形学 | 动画模拟
    动画模拟布料模拟质点弹簧系统:红色部分很弱地阻挡对折SteepconnectionFEM:有限元方法粒子系统粒子系统本质上就是在定义个体和群体的关系。动画帧率VR游戏要不晕需要达到90fpsForwardKinematicsInverseKinematics只告诉末端p点,中间随便怎么连。解不一......
  • 『模拟赛』暑假集训CSP提高模拟20
    Rank有点可惜,暴力打满就并列Rank1了。A.Kanon原[JOI2021Final]雪玉签。考虑到每两个球之间的距离是恒不变的,因此我们可以通过找到每个球控制的边界得到答案,每个区间正好可以得出左边球的右边界和右边球的左边界。记录每个区间的标号和长度,按长度升序sort一遍,然......
  • 考研数学模拟考试
         欧几里得8月模考正式开始报名了,走过路过千万不要错过,这是各位小伙伴检验复习成果、提升实力的大好机会哦,接下来是考试的一些信息:首先是所有小伙伴都会关心的一个问题,那就是考试收费吗?答案是考试全程免费,无隐性收费。参与模考、批改处分、直播解析等各个环节......
  • CSP/NOIP计数题一些奇奇怪怪的东西
    卡特兰数常见公式:不是很懂。\[H_n=C_{2n}^n-C_{2n}^{n-1}\]应用:折线计数。第二类斯特林数在小球与盒子那道模板题中见到的,表示表示将\(n\)个两两不同的元素,划分为\(k\)个互不区分的非空子集的方案数。递推式:\[\operatorname{S2}_{i,j}=j\times\operatorname{S2}_{i-......
  • 不同类型电动汽车充电负荷蒙特卡洛法模拟(常规充电、快速充电、更换电池)(Matlab代码实现
     ......