ACM 实验室2020.10.03天梯赛练习*1

7-9 排座位

并查集,做的时候忘记考虑全联通了。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
int n,r,q,x,y,z;;

int a[107][107],f[107];

int find(int x){
    if(x==f[x]) return x;
    return f[x]=find(f[x]);
}

void he(int x,int y){
    int t1=find(x);
    int t2=find(y);
    if(t1!=t2)  f[t1]=t2;
}

int main(){
    cin>>n>>r>>q;
    
    for(int  i=1;i<=n;i++)
        f[i]=i;
    for(int i =1;i<=r;i++){
        cin>>x>>y>>z;
        a[x][y]=z;
        a[y][x]=z;
        if(z==1){
            he(x,y);
        }
    }
    while(q--){
        cin>>x>>y;
        if(a[x][y]==1) puts("No problem");
        else if(a[x][y]==-1){
            if(find(x)==find(y)) puts("OK but...");
            else
                puts("No way");
        }
        else{
            if(find(x)==find(y))
                puts("No problem");
            else puts("OK");
        }
    
    }

    
    return 0;
}

7-11 重排链表

注意奇偶和排列的方式。

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=1e5+10;

struct Node{
    int ad,data,next;
}N[MAXN];

int main(){
    int a,n;
    vector <Node> L;
    cin>>a>>n;
    for(int i =1;i<=n;i++){
        int in,x,y;
        cin>>x>>in>>y;
        N[x].ad=x;N[x].data=in;N[x].next=y;
    }
    while(a!=-1){
        L.push_back(N[a]); 
        a=N[a].next;
    }
    int m=L.size();
    for(int i =0;i<m/2;i++){
        printf("%05d %d %05d\n",L[m-i-1].ad,L[m-i-1].data,L[i].ad);
        if(i==m/2-1&&m%2==0)
            printf("%05d %d -1\n",L[i].ad,L[i].data);
        else
            printf("%05d %d %05d\n",L[i].ad,L[i].data,L[m-i-2].ad);

        
    }
    if(m%2)
        printf("%05d %d -1\n",L[m/2].ad,L[m/2].data);
    
    return 0;
}

7-12 分而治之 (25分)

第一次没看懂,看了别人的解析才看懂。。。原来不是很难,主要就是攻下判断是不是都是独立

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
int n,m,x,y,aa[MAXN],a[MAXN];
void check(){
    for(int i =1;i<=n;i++){
        if(a[i]>0){
            cout<<"NO"<<endl;
            return ;
        }
    }
    cout<<"YES"<<endl;
}

int main(){
    cin>>n>>m;
    
    vector<vector<int> > v(n+1);
    while(m--){
        cin>>x>>y;
        aa[x]++;aa[y]++;
        v[x].push_back(y);
        v[y].push_back(x);    
    }
    int t;
    cin>>t;
    while(t--){
        int l,xx;
        cin>>l;
        for(int i =1;i<=n;i++)
            a[i]=aa[i];
        while(l--){
            cin>>xx;
            a[xx]=0;
            for(int i =0;i<v[xx].size();i++)
                a[v[xx][i]]--;
        }
        check();
        
    }
    return 0;
}

 

posted @ 2020-10-04 23:02  Leviathan_Sei  阅读(92)  评论(0)    收藏  举报