暑假集训CSP提高模拟8

news/2024/9/20 5:51:58/文章来源:https://www.cnblogs.com/wlesq/p/18325507

T2
赛时想法是维护\(m\)个并查集,二分答案,然后比较祖先是否相同,\(O(mlogn+qmlogn)\)的复杂度,而且内存开不下,只拿\(20pts\)

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N = 1e5+5;
vector <int> fa[N*2];
vector <pair<int,int>> G;
int n,m,q;
inline int find(int u,int id)
{if(fa[id][u]!=u)fa[id][u]=find(fa[id][u],id);return fa[id][u];
}
inline bool check(int mid,int L,int R)
{int c=find(L,mid);
//	cout<<c<<endl;for(int i=L+1;i<=R;i++){if(find(i,mid)!=c)return 0;}return 1;
}
inline int fen(int l,int r,int L,int R)
{int ans=0;while(l<=r){int mid=(l+r)>>1;if(check(mid,L,R)){ans=mid;r=mid-1;}else{l=mid+1;}}return ans;
}
inline void work1()
{int u,v;for(int i=0;i<=m;i++)fa[i].resize(n+1);for(int i=1;i<=n;i++)fa[0][i]=i;for(int i=1;i<=m;i++){copy(fa[i-1].begin(),fa[i-1].end(),fa[i].begin());u=G[i].first,v=G[i].second;int fu=find(u,i),fv=find(v,i);if(fu!=fv)fa[i][fu]=fv;}int l,r;while(q--){cin>>l>>r;if(l==r)cout<<0<<endl;else{cout<<fen(1,m,l,r)<<endl;}}
}
int w2(int l,int r,int L,int R)
{int ans=0;while(l<=r){int mid=(l+r)>>1;if(check(0,L,R)){ans=mid;r=mid-1;}else{l=mid+1;}}return ans;
}
void work2()
{int l,r;cin>>l>>r;
//	cout<<l<<" "<<r<<endl;int u,v;fa[0].resize(n+1);for(int i=1;i<=n;i++)fa[0][i]=i;for(int i=1;i<=m;i++){u=G[i].first,v=G[i].second;int fu=find(u,0),fv=find(v,0);if(fu!=fv)fa[0][fu]=fv;
//		if(i>=r-l+1)
//		{if(check(0,l,r)){cout<<i<<endl;break;}
//		}
//		cout<<fu<<" "<<fv<<endl;}	
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);	
//	freopen("lagrange2.in","r",stdin);cin>>n>>m>>q;int u,v;G.pb({0,0});for(int i=1;i<=m;i++){cin>>u>>v;G.pb({u,v});}if(n<=100&&m<=100){work1();}else if(q==1){
//		cout<<"*****"<<endl;work2();}else{work1();}return 0;
}

暴力部分分可以拿到\(35pts\)

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N = 1e5+5;
vector <pair<int,int>> edge[N];
int n,m,q;bool vis[N];
void dfs(int u,int fa,int lim)
{vis[u]=1;
//	cout<<u<<endl;for(int i=0;i<edge[u].size();i++){int to=edge[u][i].first,id=edge[u][i].second;if(id>lim)continue;if(to==fa||vis[to])continue;
//		cout<<to<<" "<<u<<" "<<lim<<endl;dfs(to,u,lim);}
}
bool check(int mid,int L,int R)
{
//	cout<<"CHECK"<<mid<<" "<<L<<" "<<R<<endl;//	for(int i=L;i<=R;i++)vis[i]=0;memset(vis,0,sizeof vis);dfs(L,0,mid);for(int i=L;i<=R;i++){if(!vis[i])return 0;}return 1;
}
int fen(int l,int r,int L,int R)
{int ans=0;while(l<=r){int mid=(l+r)>>1;if(check(mid,L,R)){ans=mid;r=mid-1;}else{l=mid+1;}}return ans;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);	
//	freopen("lagrange2.in","r",stdin);cin>>n>>m>>q;int u,v;for(int i=1;i<=m;i++){cin>>u>>v;
//		cout<<"***"<<u<<" "<<v<<endl;edge[u].pb({v,i});edge[v].pb({u,i});}int l,r;while(q--){cin>>l>>r;if(l==r)cout<<0<<endl;else{cout<<fen(1,m,l,r)<<endl;}}return 0;
}

image

正解,\(Kruskal\)重构树,边的编号即为边权,我考试并查集想到了,\(kruskal\)没想到,哎
image
image

其实\(m==n-1\)就是在启发树的时候如何处理,
我们想要知道\([l,r]\)即为\(l->r\)的边权最大值,相当于\(max(l->l+1,l+1->l+2,...,r-1->r)\),所以我们可以预处理出全部的\((i,i+1)\),然后查询可以用线段树,\(ST表\),查询\([l,r-1]\)即可

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N = 1e5+5;
//vector <pair<int,int>> edge[N];
int n,m,q,fa[N*2],f[N*2][25],now,st[N][25],val[N*3],dep[N*2];bool vis[N*3];
struct Node{int u,v,w;};vector <Node> G ;
//bool cmp(Node a,Node b){return a.w<b.w;}
vector <int> edge[N*2];
int find(int u)
{if(fa[u]!=u)fa[u]=find(fa[u]);return fa[u];
}
void dfs(int u,int fa)
{vis[u]=1;dep[u]=dep[fa]+1;f[u][0]=fa;for(int j=1;j<=20;j++)f[u][j]=f[f[u][j-1]][j-1];for(auto to:edge[u]){if(to==fa)continue;dfs(to,u);	}	
}
int lca(int x,int y)
{if(dep[x]<dep[y])swap(x,y);for(int j=20;j>=0;j--)if(dep[f[x][j]]>=dep[y])x=f[x][j];if(x==y)return x;for(int i=20;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];return f[x][0];
}
void ST()
{for(int i=2;i<=n;i++){st[i][0]=val[lca(i-1,i)];
//		cout<<"*&&&"<<lca(i,i+1)<<" "<<val[lca(i,i+1)]<<endl;}for(int j=1;j<=20;j++){for(int i=1;i+(1<<j)-1<=n;i++){st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);}}
}
int query(int l,int r)
{int k=log2(r-l+1);return max(st[l][k],st[r-(1<<k)+1][k]);
}
void kruskal()
{for(int i=1;i<=2*n;i++)fa[i]=i;now=n;for(int i=1;i<=m;i++){int fu=find(G[i].u),fv=find(G[i].v);if(fu!=fv){++now;val[now]=G[i].w;fa[fv]=now;fa[fu]=now;edge[now].pb({fu});edge[now].pb({fv});}}dfs(now,0);
//	for(int i=now;i;i--)
//		if(!vis[i])dfs(i,0);
//	n*=2;ST();
}int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);	
//	freopen("lagrange2.in","r",stdin);cin>>n>>m>>q;int u,v;G.pb({0,0});for(int i=1;i<=m;i++){cin>>u>>v;G.pb({u,v,i});}kruskal();int l,r;while(q--){cin>>l>>r;if(l==r)cout<<0<<endl;else{cout<<query(l+1,r)<<endl;}}return 0;
}

T4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772154.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java位运算

位运算符:针对二进制的值补码形式进行计算的 & | ^(相同为0,不同为1) ~ << >> >>>public class WeiOptDemo1 { public static void main(String[] args) { byte a1 = 3; byte b1 = 4;System.out.println(a1 & b1);System.out.println(a1 | b1)…

【Azure APIM】调用APIM的备份接口时候遇见InvalidParameters错误

问题描述 根据官方文档,可以调用REST API来对APIM执行备份操作。要备份 API 管理服务,请发出以下 HTTP 请求: POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{s…

kruskal重构树

比较好理解,相当于重建了一个二叉树,所有的父亲节点都为原来图中的边,儿子节点为点。 重构树就可以利用lca求两点间的最大(或者最小)边权以及一些树上操作。较为简单的应用,需要用线段树来维护信息。点击查看代码 #include<bits/stdc++.h> using namespace std;con…

hive03_高级操作

Hive 分区表https://blog.csdn.net/weixin_41122339/article/details/81584110 表在存储时,可以将数据根据分区键的列值存储在表目录的子目录中。这样将数据切分到不同目录存储后,可以加快对分区键字段的查询和过滤速度,通过在查询条件中指定过滤条件,可以只对指定目录的数…

hive02_SQL操作

Hive DDL 操作 操作前需要保证 hive 成功启动: # 启动 HiveServer2 hive --service hiveserver2 & # 启动 MetaStore hive --service metastore &# 进入 hive 命令行界面 beeline -u jdbc:hive2://node03:10000 -n root数据库操作 操作类似于 MySQL 数据库操作。 表基…

【WSL2】在Windows通过自定义域名访问wsl2中的服务

前言目前在windows与windows的wsl系统之间,宿主机无法通过相对较固定的方式来进行网络访问,通常需要使用wsl的ip来访问,而ip可能不是很直观并且可能会有变更,当前教程解决了这个问题,通过hosts映射的方式实现windows宿主机访问wsl服务。 脚本的原理:在linux启动时,执行一…

查看谷歌seo内容插件

SEO META in 1 CLICK 谷歌插件可以查看网站seo内容,包括title description等信息。下载地址:https://www.chajianxw.com/developer/14081.html 下载完解压之后打开谷歌扩展程序拖入即可。 使用方式:打开需要查看的网站对应页面,加载完点击插件图标即可。

Kruskal 重构树

算法介绍 Kruskal 重构树用于快速判断节点的连通性. 考虑到,假如两个节点是联通的,则他们之间总会有一条边被选入最小生成树内,因此他们在最小生成树内也是联通的. 也就是说,我们可以通过求最小生成树来减少我们判断联通需要的边数. Kruskal 重构树的思想是这样的:假如有一…

2024牛客多校A Bit Common A Bit More Common

牛客2024年多校第一场AB题题解,新手向A Bit Common 时间限制:3s(C++/C) / 6s 内存限制:1048576K(C++/C) / 2097152K 题目描述 Given two integers \(n\) and \(m\), among all the sequences containing \(n\) non-negative integers less than \(2^m\), you need to count…

2024中国工业互联网安全大赛智能家电行业赛道选拔赛

流量分析的附件链接: https://pan.baidu.com/s/1UlWzfmsmRsZTR56FzXLuEg?pwd=6666 提取码: 6666 恶意攻击流量 描述:应用系统被植入了恶意后门,并从流量中识别其中的flag,提交格式:fag{XXXXXXXX} 追踪这个流量解码过滤或者工具一把梭flag{39084EEF2D28E941F53E4A1AA1FA6766…

java 06

输入:引入scanner import java.util.Scanner Scanner scanner=new Scanner(System.in) String name=mySanneer.nextInt()//输入内容 在命令框输入Java input 进制:十进制转二进制:不断除以2最后将余数倒着拍;转8转16相似; 位运算: 1>>2:1向右位移两位;1<<…