蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)

题目:1238. 日志统计

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第1张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第2张图片
题解:双指针。

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
int n,d,k;
PII a[N];
//queue q[N];
int ct[N];
bool sta[N];
int main() {
	cin>>n>>d>>k;
	
	for(int i=0;i<n;i++){
		scanf("%d%d",&a[i].first,&a[i].second);
	}
	sort(a,a+n);
	for(int i=0,j=0;j<n;j++){
		ct[a[j].second]++;
		while(a[j].first>=d+a[i].first){
			ct[a[i].second]--;
			i++;
		}
		if(ct[a[j].second]>=k) sta[a[j].second]=1;
	}
	for(int i=1;i<=100000;i++){
		if(sta[i]) printf("%d\n",i);
	}
	return 0;
}

题目:1101. 献给阿尔吉侬的花束

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第3张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第4张图片

题解:bfs

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
int T,r,c;
char a[210][210];
typedef struct Node{
	int x,y;
	int bc;
}node;
int fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
int main() {
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&r,&c);
		getchar();
		node st;
		bool sta[210][210];
		memset(sta,0,sizeof sta);
		for(int i=1;i<=r;i++){
			for(int j=1;j<=c;j++){
				scanf("%c",&a[i][j]);
				if(a[i][j]=='S'){
					st.x=i,st.y=j;
					st.bc=0;
					sta[i][j]=1;
				}
			}
			getchar();
		}
		//for(int i=1;i<=r;i++){
		//	for(int j=1;j<=c;j++){
		//		printf("%c",a[i][j]);
		//	}
		//	cout<
		//  
		queue<node> q;
		q.push(st);
		bool flag=0;
		while(q.size()){
			node t=q.front();
			q.pop();
			if(a[t.x][t.y]=='E'){
				flag=1;
				printf("%d\n",t.bc);
				break;
			}
			for(int i=0;i<4;i++){
				int x=t.x+fx[i];
				int y=t.y+fy[i];
				if(x<1||x>r||y<1||y>c) continue;
				if(a[x][y]!='#'&&!sta[x][y]){
					sta[x][y]=1;
					node tmp;
					tmp.x=x,tmp.y=y,tmp.bc=t.bc+1;
					q.push(tmp);
					
				}
			}
		}
		if(!flag){
			puts("oop!");
		}
	}
	return 0;
}

题目:1113. 红与黑

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第5张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第6张图片
题解:bfs

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
char a[25][25];
bool sta[25][25];
int w,h;
int fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
typedef struct Node{
	int x,y;
}node;
int main(){
	while(1){
		scanf("%d%d",&w,&h);
		if(w==0&&h==0) break;
		node st;
		memset(sta,0,sizeof sta);
		int ans=1;
		for(int i=1;i<=h;i++){
			for(int j=1;j<=w;j++){
				cin>>a[i][j];
				if(a[i][j]=='@'){
					st.x=i;
					st.y=j;
					sta[i][j]=1;
				}
			}
			getchar();
		}
		queue<node> q;
		q.push(st);
		while(q.size()){
			node t=q.front();
			q.pop();
			for(int i=0;i<4;i++){
				int x=t.x+fx[i];
				int y=t.y+fy[i];
				if(x<1||x>h||y<1||y>w) continue;
				if(a[x][y]=='.'&&!sta[x][y]){
					sta[x][y]=1;
					ans++;
					node tmp;
					tmp.x=x,tmp.y=y;
					q.push(tmp);
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

题目:1224. 交换瓶子

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第7张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第8张图片
题解:置换群+环+图论

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
int n;
int a[10100];
bool sta[10100];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(!sta[i]){
			cnt++;
			for(int j=i;!sta[j];j=a[j]){
				sta[j]=1;
			}
		}
	}
	cout<<n-cnt;
	return 0;
}

题目:1240. 完全二叉树的权值

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第9张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第10张图片
题解:二叉树+双指针

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
LL INF=-1e10-10;
int n;
int a[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int k=1;
	LL sum=INF;
	int idx=1;
	int t=0;
	while(k<=n){
		LL tmp=0;
		t++;
		while(k<(1<<t)&&k<=n){
			tmp+=a[k];
			k++;
		}
		if(sum<tmp){
			sum=tmp;
			idx=t;
		}
	}
	cout<<idx;
	return 0;
}

题目:1096. 地牢大师

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第11张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第12张图片
题解:bfs

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
int fx[6]={0,0,0,0,1,-1};
int fy[6]={0,0,1,-1,0,0};
int fz[6]={1,-1,0,0,0,0};
char a[110][110][110];
typedef struct Node{
	int x,y,z;
	int bc;
}node;
int main(){
	int l,r,c;
	while(cin>>l>>r>>c){
		if(l==0&&r==0&&c==0){
			break;
		}
		node st;
		bool sta[110][110][110];
		memset(sta,0,sizeof sta);
		for(int i=1;i<=l;i++){
			for(int j=1;j<=r;j++){
				for(int k=1;k<=c;k++){
					cin>>a[i][j][k];
					if(a[i][j][k]=='S'){
						st.x=j,st.y=k,st.z=i;
						st.bc=0;
						sta[i][j][k]=1;
					}
				}
			}
		}
		queue<node> q;
		q.push(st);
		bool flag=0;
		while(q.size()){
			node t=q.front();
			q.pop();
			if(a[t.z][t.x][t.y]=='E'){
				flag=1;
				printf("Escaped in %d minute(s).\n",t.bc);
				break;
			}
			for(int i=0;i<6;i++){
				int x=t.x+fx[i],y=t.y+fy[i],z=t.z+fz[i];
				if(x<1||x>r||z<1||z>l||y<1||y>c) continue;
				if(a[z][x][y]!='#'&&!sta[z][x][y]){
					sta[z][x][y]=1;
					node tmp;
					tmp.x=x,tmp.y=y,tmp.z=z,tmp.bc=t.bc+1;
					q.push(tmp);
				}
			}
		}
		if(!flag){
			puts("Trapped!");
		}
	}
	return 0;
}

题目:1233. 全球变暖

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第13张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第14张图片
题解:dfs

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
char a[1010][1010];
int n;
int fx[4]={0,0,-1,1},fy[4]={1,-1,0,0};
bool sta[1010][1010];
bool flag=0;
void dfs(int x,int y){
	sta[x][y]=1;
	int sum=0;
	for(int i=0;i<4;i++){
		int xx=x+fx[i];
		int yy=y+fy[i];
		if(xx<1||xx>n||yy<1||yy>n) continue;
		if(a[xx][yy]=='#'){
			sum++;
			if(!sta[xx][yy])
				dfs(xx,yy);
		}
	}
	if(sum==4) flag=1;
}
int main(){
	
	cin>>n;
	getchar();
	for(int i=1;i<=n;i++){
		scanf("%s",a[i]+1);
	}
	//for(int i=1;i<=n;i++){
	//	printf("%s\n",a[i]+1);
	//}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]=='#'&&!sta[i][j]){
				flag=0;
				dfs(i,j);
				if(!flag) ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}

题目:1207. 大臣的旅费

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第15张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第16张图片
题解:树的直径+树形dp

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
int n;
vector<PII> g[N];
int maxd=0,maxu=0;
void dfs(int u,int fa,int bc){
	for(int i=0;i<g[u].size();i++){
		if(g[u][i].first== fa) continue;
		if(maxd<bc+g[u][i].second){
			maxd=bc+g[u][i].second;
			maxu=g[u][i].first;
		}
		dfs(g[u][i].first,u,bc+g[u][i].second);
	}
}
int main(){
	int x,y,z;
	scanf("%d",&n);
	for(int i=0;i<n-1;i++){
		scanf("%d%d%d",&x,&y,&z);
		g[x].push_back({y,z});
		g[y].push_back({x,z});
	}
	dfs(1,-1,0);
	dfs(maxu,-1,0);
	printf("%lld",1ll*maxd*10+(1ll*1+maxd)*maxd/2);
	return 0;
}

题目:826. 单链表

蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第17张图片
蓝桥杯省赛专题训练之双指针、BFS与图论(相关真题和模板题)_第18张图片
题解:链式前向星

#include 
using namespace std;
typedef long long LL;
typedef pair<int ,int > PII;
const int N=1e5+10;
int head=-1,e[N],ne[N];
int idx=1;
void add(int k,int x){
	if(k==0){
		e[idx]=x;
		ne[idx]=head;
		head=idx++;
	}else{
		e[idx]=x;
		ne[idx]=ne[k];
		ne[k]=idx++;
	}
}
void del(int k){
	if(k==0) head=ne[head];
	else if(ne[k]!=-1){
		ne[k]=ne[ne[k]];
	}
		
}
int main(){
	int m;
	cin>>m;
	char op;
	int x,k;
	while(m--){
		cin>>op;
		if(op=='H'){
			scanf("%d",&x);
			add(0,x);
		}else if(op=='D'){
			scanf("%d",&k);
			del(k);
		}else{
			scanf("%d%d",&k,&x);
			add(k,x);
		}
		
	}
	for(int i=head;~i;i=ne[i]){
		printf("%d ",e[i]);
	}
	return 0;
}

你可能感兴趣的:(AcWing,蓝桥杯,c++,算法,蓝桥杯)