昨天做的题忘记发了…
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;
}