0
点赞
收藏
分享

微信扫一扫

2022/4/12 天梯赛刷题记录

天天天蓝loveyou 2022-04-14 阅读 46
c++算法

昨天做的题忘记发了…

L2-010 排座位

思路:并查集

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n';
typedef long long ll;
typedef pair<vector<int>,int> PII;
const int N=1e3+10,mod=1e9+7;
int n,k,m;
int fa[N],vis[N][N];
int find(int x){
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
void merge(int x,int y){
    int fx=find(x),fy=find(y);
    fa[fy]=fx;
}
int main(){
	IOS;
	cin>>n>>m>>k;
	for(int i=1;i<=111;i++) fa[i]=i;
    while(m--){
        int u,v,op;
        cin>>u>>v>>op;
		if(op==1) merge(u,v);
        else vis[u][v]=vis[v][u]=1;
    }
	while(k--){
		int u,v;cin>>u>>v;
		if(find(u)==find(v)&&!vis[u][v]){
			cout<<"No problem"<<endl;
		}else if(find(u)==find(v)&&vis[u][v]){
			cout<<"OK but..."<<endl;
		}else if(find(u)!=find(v)&&!vis[u][v]){
			cout<<"OK"<<endl;
		}else {
			cout<<"No way"<<endl;
		}
	}
	return 0;
}

L2-011 玩转二叉树

思路:dfs、树的遍历

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n';
typedef long long ll;
typedef pair<vector<int>,int> PII;
const int N=1e4+10,mod=1e9+7;
vector<int>pre,mid;
int n,ans[N];
void dfs(int root,int l,int r,int idx){
	if(l>r) return ;
	ans[idx]=pre[root];
	int k=l;
	while(pre[root]!=mid[k]) k++;
	dfs(root+1,l,k-1,2*(idx+1));
	dfs(root+k-l+1,k+1,r,2*idx+1);
}
int main(){
	IOS;
	cin>>n;
	fill(ans,ans+N,-1);
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		mid.push_back(x);
	}
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		pre.push_back(x);
	}
	dfs(0,0,n-1,0);
	int cnt=0;
	for(int i=0;i<N;i++){
		if(ans[i]!=-1){
			if(cnt++) cout<<" ";
			cout<<ans[i];
		}
	}
	return 0;
}

L2-013 红色警报

思路:并查集

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n';
typedef long long ll;
typedef pair<int,int> PII;
const int N=1e4+10,mod=1e9+7;
int n,m,k,fa[N],vis[N];
PII a[N];
int find(int x){
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	fa[fy]=fx;
}
int main(){
	IOS;
	cin>>n>>m;
	fill(vis,vis+1+n,0);
	for(int i=0;i<n;i++) fa[i]=i;
	for(int i=0;i<m;i++){
		cin>>a[i].first>>a[i].second;
		merge(a[i].first,a[i].second);
	}
	int cnt=0;
	for(int i=0;i<n;i++) if(fa[i]==i) cnt++;
	cin>>k;
	for(int _=1;_<=k;_++){
		int cnt1=0;
		for(int i=0;i<n;i++) fa[i]=i;
		int x;cin>>x;
		vis[x]=1;
		for(int i=0;i<m;i++){
			if(vis[a[i].first]||vis[a[i].second]) continue;
			merge(a[i].first,a[i].second);
		}
		for(int i=0;i<n;i++) if(fa[i]==i) cnt1++;
		if(cnt1==cnt||cnt1==cnt+1) {
			cout<<"City "<<x<<" is lost."<<endl;
		}else {
			cout<<"Red Alert: City "<<x<<" is lost!"<<endl;
		}
		cnt=cnt1;
	}
	if(k>=n) cout<<"Game Over."<<endl;
	return 0;
}

L2-014 列车调度

思路:问题等价于其最长上升子序列,贪心+二分(可看导弹拦截)
这里用set,set自带二分

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n';
typedef long long ll;
typedef pair<vector<int>,int> PII;
const int N=1e5+10,mod=1e9+7;
int a[N],n;
set<int>q;
int main(){
	IOS;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		if(q.upper_bound(a[i])!=q.end()) q.erase(q.upper_bound(a[i]));
		q.insert(a[i]);
	}
	cout<<q.size()<<endl;
	return 0;
}
举报

相关推荐

刷题记录:LRU

Leecode 刷题记录

Leetcode 刷题记录

刷题记录2

刷题记录0502

0 条评论