天梯赛练习题集

news2024/12/24 2:36:18

L2-005 集合相似度

find函数,Nt用集合关系求

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,k;
set<int>s[N];
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int cnt;
        cin>>cnt;
        for(int j=1;j<=cnt;j++)
        {
            int x;
            cin>>x;
            s[i].insert(x);
        }
    }
    cin>>k;
    while(k--)
    {
        int a,b;
        cin>>a>>b;
        int Nc=0,Nt=0;
        for(auto i:s[a])
            if(s[b].find(i)!=s[b].end())
                Nc++;
        Nt=s[a].size()+s[b].size()-Nc;
        printf("%.2f%\n",100.0*Nc/Nt);
        
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    // ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

 L2-008 最长对称子串

思路:f[i]表示以第i个字符结尾的最长对称子串的长度。

注意初始化:若s[i]==s[i-1] ,f[i]=f[i-1]+1;否则f[i]=1

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
string s;
int f[N];
void solve()
{
    getline(cin,s);
    s='?'+s;
    int n=s.length();
    for(int i=1;i<n;i++) 
    {
        if(s[i]==s[i-1]) f[i]=f[i-1]+1;
        else f[i]=1;
    }
    for(int i=1;i<n;i++)
    {
        if(i-f[i-1]-1>=1&&s[i-f[i-1]-1]==s[i]) f[i]=max(f[i],f[i-1]+2);
        else f[i]=max(f[i],1);
    }
    int ans=1;
    for(int i=1;i<n;i++)
        ans=max(ans,f[i]);
    cout<<ans<<'\n';
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-010 排座位

题意:

 思路:二维数组g表示两者之间的朋友和敌对关系。将存在朋友的关系的合并在一块,做一个并查集。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=110;
const int inf=0x3f3f3f3f;

using namespace std;
int n,m,k;
int fa[2*N],g[N][N];
int find(int x)
{
    return fa[x]==x? x:fa[x]=find(fa[x]);
}
void merge(int a,int b)
{
    fa[find(a)]=find(b);
}
void solve()
{
    cin>>n>>m>>k;
    for(int i=0;i<N;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(c==1)
        {
            g[a][b]=g[b][a]=1;
            merge(a,b);
        }
        else
        {
            g[a][b]=g[b][a]=-1;
        }
    }
    while(k--)
    {
        int a,b;
        cin>>a>>b;
        if(g[a][b]==1) puts("No problem");
        else if(g[a][b]==0) puts("OK");
        else 
        {
            if(find(a)==find(b)) puts("OK but...");
            else puts("No way");
        }
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-011 玩转二叉树

题意:

 思路:根据中序遍历和前序遍历还原二叉树,反转后输出答案。

中序遍历:LDR,可以划分出左右子树

前序遍历:DLR,可以找到子树的根。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
struct node{
    int l,r;
}tr[N];
int n;
int z[N],q[N];
bool st[N];
map<int,int>pos;
void dfs(int u)
{
    st[u]=1;
    int p=0;
    for(int i=1;i<=n;i++)
        if(z[i]==u)
        {
            p=i;
            break;
        }
    priority_queue<PII,vector<PII>,greater<PII>>L,R;
    for(int i=p-1;i>=1;i--)
        if(!st[z[i]]) L.push({pos[z[i]],z[i]});
        else break;
    for(int i=p+1;i<=n;i++)
        if(!st[z[i]]) R.push({pos[z[i]],z[i]});
        else break;

    if(L.size()) 
    {
        int t=L.top().second;
        tr[u].l=t;
        dfs(t);
    }
    else tr[u].l=-1;
    if(R.size()) 
    {
        int t=R.top().second;
        tr[u].r=t;
        dfs(t);
    }
    else tr[u].r=-1;
}
vector<int>ans;
void get(int u)
{
    queue<int>q;
    q.push(u);
    while(q.size())
    {
        int t=q.front();q.pop();
        ans.push_back(t);
        if(tr[t].r!=-1) q.push(tr[t].r);
        if(tr[t].l!=-1) q.push(tr[t].l);
    }
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>z[i];
    for(int i=1;i<=n;i++) 
    {
        cin>>q[i];
        pos[q[i]]=i;
    }
    int root=q[1];
    dfs(root);
    get(root);
    for(int i=0;i<ans.size();i++)
        cout<<ans[i]<<" \n"[i==n-1];
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-012 关于堆的判断

题意:

 思路:模拟堆,注意up的写法。注意xy可能为负

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,m;
int h[N],sz;
void up(int u)
{
    while(u/2&&h[u/2]>h[u])
    {
        swap(h[u/2],h[u]);
        u/=2;
    }
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        sz++;
        h[sz]=x;
        up(sz);
    }
    // for(int i=1;i<=n;i++)
    //     cout<<i<<' '<<h[i]<<'\n';
    getchar();
    while(m--)
    {
        string s;
        getline(cin,s);
        char c;
        int cnt=0;
        for(int i=0;i<s.length();i++)
        {
            if(cnt==3) 
            {
                c=s[i];
                break;
            }
            if(s[i]==' ') cnt++;
        }
        int x=0;bool f=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]==' ') break;
            else
            {
                if(s[i]>='0'&&s[i]<='9') x=x*10+int(s[i]-'0');
                else f=1;
            }
        }
        if(f) x*=-1;
        if(c=='r')
        {
            if(h[1]==x) puts("T");
            else puts("F");
        }
        else if(c=='a')
        {
            cnt=0;
            int y=0;
            f=0;
            for(int i=0;i<s.length();i++)
            {
                if(cnt==2)
                {
                    if(s[i]=='-') f=1;
                    else if(s[i]>='0'&&s[i]<='9') y=y*10+int(s[i]-'0');
                    else break;
                }
                if(s[i]==' ') cnt++;
            }
            if(f) y*=-1;
            int px=0,py=0;
            for(int i=1;i<=sz;i++)
                if(h[i]==x) 
                {
                    px=i;
                    break;
                }

            for(int i=1;i<=sz;i++)
                if(h[i]==y) 
                {
                    py=i;
                    break;
                }
            if(px/2==py/2) puts("T");
            else puts("F");
        }
        else if(c=='p')
        {
            cnt=0;
            int y=0;f=0;
            for(int i=0;i<s.length();i++)
            {
                if(cnt==5)
                {
                    if(s[i]=='-') f=1;
                    else if(s[i]>='0'&&s[i]<='9') y=y*10+int(s[i]-'0');
                    else break;
                }
                if(s[i]==' ') cnt++;
            }
            if(f) y*=-1;
            int px=0,py=0;
            for(int i=1;i<=sz;i++)
                if(h[i]==x) 
                {
                    px=i;
                    break;
                }

            for(int i=1;i<=sz;i++)
                if(h[i]==y) 
                {
                    py=i;
                    break;
                }
            if(px==py/2) puts("T");
            else puts("F");
        }
        else
        {
            cnt=0;
            int y=0;f=0;
            for(int i=0;i<s.length();i++)
            {
                if(cnt==5)
                {
                    if(s[i]=='-') f=1;
                    else if(s[i]>='0'&&s[i]<='9') y=y*10+int(s[i]-'0');
                    else break;
                }
                if(s[i]==' ') cnt++;
            }
            if(f) y*=-1;
            int px=0,py=0;
            for(int i=1;i<=sz;i++)
                if(h[i]==x) 
                {
                    px=i;
                    break;
                }

            for(int i=1;i<=sz;i++)
                if(h[i]==y) 
                {
                    py=i;
                    break;
                }
            if(px/2==py) puts("T");
            else puts("F");
        }
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-013 红色警报

题意:

思路:若一个城市失去会影响其他城市的连通性,那么失去后的连通块个数>失去前的连通块个数+1.

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=510;
const int inf=0x3f3f3f3f;

using namespace std;
int n,m,k;
bool g[N][N];
bool st[N];
void bfs(int x)
{
    queue<int>q;
    q.push(x);
    st[x]=1;

    while(q.size())
    {
        int t=q.front();
        q.pop();

        for(int i=0;i<n;i++)
        {
            if(g[t][i]&&!st[i])
            {
                q.push(i);
                st[i]=1;
            } 
        }
    }
}
int get()
{
    for(int i=0;i<n;i++) st[i]=0;
    int ret=0;
    for(int i=0;i<n;i++)
    {
        if(!st[i])
        {
            bfs(i);
            ret++;
        }
    }
    return ret;
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        g[a][b]=g[b][a]=1;
    }
    int last=get();
    cin>>k;
    int cnt=0;
    for(int i=1;i<=k;i++)
    {
        int x;
        cin>>x;
        cnt++;
        for(int j=0;j<n;j++)
            g[x][j]=g[j][x]=0;

        int cur=get();
        if(cur>last+1) printf("Red Alert: City %d is lost!\n",x);
        else printf("City %d is lost.\n",x);
        if(cnt==n) printf("Game Over.\n");
        last=cur;
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

 L2-014 列车调度

题意:

思路:因为要递减出站,同时为减少轨道条数,那么同一轨道上的火车从前到后编号一定是递减的。我们只需要关注每条轨道上最后一辆的编号即可。当要入站的编号比所有的都大,那么我们要新开一条轨道;否则我们就对大于要放入的值的轨道的值检索,找出跟其相差最少的一条轨道,把值放进去。

因为当要开新轨道时,新轨道的值一定是最大的。那么每条轨道的编号一定是递增的。我们在检索相差最少的一条轨道时就可以通过二分法来检索。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e5+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,cur;
int a[N];
int tra[N],k;
int search(int x)
{
    int l=0,r=k-1;
    while(l<r)
    {
        int mid=l+r>>1;
        if(tra[mid]<x) l=mid+1;
        else r=mid;
    }
    return l;
}
void fun(int x)
{
    if(tra[k-1]<x) tra[k++]=x;
    else tra[search(x)]=x;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    
    for(int i=1;i<=n;i++) fun(a[i]);
    cout<<k<<'\n';
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-016 愿天下有情人都是失散多年的兄妹

题意:

思路:对于每对查询的a,b,找出a,b五代内的亲人并标记,若有人被标记两次,则No。

注意要保存父母的性别。否则,父母的性别没给出的情况下,查询性别都是默认值,会出错。 

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
struct node{
    int l=-1,r=-1;
    char sex;
}tr[N];
int n;
bool check(int a,int b)
{
    map<int,int>mp;
    mp[a]++,mp[b]++;
    if(mp[a]>=2) return 0;
    queue<node>q;
    q.push(tr[a]);q.push(tr[b]);
    for(int i=1;i<=4;i++)
    {
        queue<node>cur;
        while(q.size())
        {
            node t=q.front();
            q.pop();

            if(t.l!=-1) 
            {
                cur.push(tr[t.l]),mp[t.l]++;
                if(mp[t.l]>=2) 
                {
                    return 0;
                }
            }
            if(t.r!=-1) 
            {
                cur.push(tr[t.r]),mp[t.r]++;
                if(mp[t.r]>=2) 
                {
                    return 0;
                }
            }
        }
        q=cur;
    }
    for(auto [a,b]:mp)
        if(b>=2) 
        {
            return 0;
        }
    return 1;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int num,l,r;
        char sex;
        cin>>num>>sex>>l>>r;
        if(l!=-1) tr[l].sex='M';
        if(r!=-1) tr[r].sex='F';
        tr[num]={l,r,sex};
    }
    int k;
    cin>>k;
    while(k--)
    {
        int a,b;
        cin>>a>>b;
        if(tr[a].sex==tr[b].sex) puts("Never Mind");
        else 
        {
            if(check(a,b)) puts("Yes");
            else puts("No");
        }
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-018 多项式A除以B

题意: 

 思路:模拟除法

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,m;
int b[N];
double a[N],c[N],d[N];
//a[i]=m x^i的系数为m 
void solve()
{
    cin>>n;
    int f=0;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        cin>>a[x];
        if(i==0) f=x;
    }
    cin>>m;
    for(int i=0;i<m;i++)
        cin>>b[i]>>d[i];
    for(int i=f;i>=b[0];i--)
    {
        int t=i-b[0];
        c[t]=a[i]/d[0];
        for(int j=0;j<m;j++) 
            a[t+b[j]]=a[t+b[j]]-c[t]*d[j];
    }
    int cntc=0,cntr=0;
    for(int i=f;i>=0;i--)
    {
        if(fabs(c[i])>=0.05) cntc++;
        if(fabs(a[i])>=0.05) cntr++;
    }
    cout<<cntc;
    for(int i=f;i>=0;i--)
        if(fabs(c[i])>=0.05)
            printf(" %d %.1f",i,c[i]);
    if(cntc==0) printf(" 0 0.0");
    printf("\n");
    cout<<cntr;
    for(int i=f;i>=0;i--)
        if(fabs(a[i])>=0.05)
            printf(" %d %.1f",i,a[i]);
    if(cntr==0) printf(" 0 0.0");
    printf("\n");
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-020 功夫传人

题意:

思路:bfs/dfs

注意要先存图再搜索。

注意祖师爷为得道者的情况。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
double n;
double z,r;
int h[N],e[N],ne[N],idx;
double p[N];
double st[N];
bool vis[N];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
double ans;
void bfs()
{
    queue<int>q;
    q.push(0);
    vis[0]=1;
    if(st[0]) ans+=p[0]*st[0];
    while(q.size())
    {
        int t=q.front();
        q.pop();

        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(vis[j]) continue;
            if(st[j]) 
            {
                p[j]=p[t]*r;
                p[j]=p[j]*st[j];
                ans+=p[j];
            }
            else
            {
                p[j]=p[t]*r;
            }
            q.push(j);
            vis[j]=1;
        }
    }
}
void solve()
{
    memset(h,-1,sizeof h);
    cin>>n>>z>>r;
    r = (100-r)/100;
    p[0]=z;
    for(int i=0;i<n;i++)
    {
        int k;
        cin>>k;
        if(k==0)
        {
            int x;
            cin>>x;
            st[i]=x;
        }
        else
        {
            for(int j=0;j<k;j++)
            {
                int x;
                cin>>x;
                add(i,x);
            }
        }
    }
    bfs();
    cout<<int(ans)<<'\n';
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

 L2-021 点赞狂魔

题意:

 思路:结构体排序。当人数不足3时,可以多加几个“-”

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n;
struct node{
    string name;
    int cnt;
    int sum;
}a[N];
bool cmp(node a,node b)
{
    if(a.cnt==b.cnt) return a.sum<b.sum;
    else return a.cnt>b.cnt;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].name>>a[i].sum;
        set<int>s;
        for(int j=0;j<a[i].sum;j++)
        {
            int x;
            cin>>x;
            s.insert(x);
        }
        a[i].cnt=s.size();
        // gao(a[i].cnt);
    }
    a[n+1]={"-"};a[n+2]={"-"};a[n+3]={"-"};
    n+=3;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=3;i++)
        cout<<a[i].name<<" \n"[i==3];
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-022 重排链表

题意:

 思路:创建双向链表,双指针分别位于头尾交替输出

注意:输入的结点可能是不在链表里的“废结点”,需要统计有效节点的个数cnt

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n;
struct node{
    int data,nex;
    int pre;
}l[N];
void solve()
{
    int h,t;
    cin>>h>>n;
    for(int i=1;i<=n;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        l[a]={b,c};
        if(c==-1) t=a;
    }
    int H=h;
    int cnt=0;//有效节点个数
    while(H!=-1)
    {
        cnt++;
        int tem=l[H].nex;
        l[tem].pre=H;
        H=tem;
    }
    for(int i=1;i<=cnt;i++)
    {
        if(i&1)
        {
            if(i!=cnt) printf("%05d %d %05d\n",t,l[t].data,h);
            else printf("%05d %d -1\n",t,l[t].data);
            t=l[t].pre;
        }
        else
        {
            if(i!=cnt) printf("%05d %d %05d\n",h,l[h].data,t);
            else printf("%05d %d -1\n",h,l[h].data);
            h=l[h].nex;
        }
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-023 图着色问题

题意:

 思路:set判断颜色个数是否等于k,再暴力检查是否有相邻点颜色相同。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=610;
const int inf=0x3f3f3f3f;

using namespace std;
int v,e,k;
int g[N][N];
int col[N];
int n;
bool check()
{
    for(int i=1;i<=v;i++)
        for(int j=1;j<=v;j++)
            if(g[i][j]&&col[i]==col[j])
                return 0;
    return 1;
}
void solve()
{
    cin>>v>>e>>k;
    for(int i=1;i<=e;i++)
    {
        int a,b;
        cin>>a>>b;
        g[a][b]=1;g[b][a]=1;
    }
    cin>>n;
    while(n--)
    {
        set<int>s;
        for(int i=1;i<=v;i++)
        {
            cin>>col[i];
            s.insert(col[i]);
        }
        if(s.size()==k)
        {
            if(check()) puts("Yes");
            else puts("No");
        }
        else puts("No");
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-024 部落

题意:

思路:用并查集判断两人是否在同一个部落。用set判断这个社区的总人数、以及互不相交的部落的个数 

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e4+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n;
int fa[N];
int find(int x)
{
    return fa[x]==x? x:fa[x]=find(fa[x]);
}
void merge(int a,int b)
{
    fa[find(a)]=find(b);
}
void solve()
{
    cin>>n;
    for(int i=0;i<N;i++) fa[i]=i;
    set<int>s;
    for(int i=1;i<=n;i++)
    {
        int k;
        cin>>k;
        int a;
        if(k!=0) {cin>>a;s.insert(a);}
        for(int j=2;j<=k;j++)
        {
            int x;
            cin>>x;
            s.insert(x);
            merge(x,a);
        }
    }
    cout<<s.size()<<' ';
    set<int>cnt;
    for(auto i:s)
    {
        cnt.insert(find(i));
    }
    cout<<cnt.size()<<'\n';
    int q;
    cin>>q;
    while(q--)
    {
        int a,b;
        cin>>a>>b;
        if(find(a)==find(b)) puts("Y");
        else puts("N");
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-025 分而治之

题意:

思路:方案是否可行,即是否城市之间还有通路。可以把m条边存起来,标记攻下的城市,再遍历m条边,看是否还有通路。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,m;
struct node{
    int x,y;
}e[N];
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        e[i]={a,b};
    }
    int k;
    cin>>k;
    while(k--)
    {
        map<int,bool>mp;
        int cnt;
        cin>>cnt;
        for(int i=1;i<=cnt;i++)
        {
            int x;
            cin>>x;
            mp[x]=1;
        }
        bool f=0;
        for(int i=1;i<=m;i++)
        {
            if(mp[e[i].x]==0&&mp[e[i].y]==0)
            {
                f=1;
                puts("NO");
                break;
            }
        }
        if(!f) puts("YES");
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

 L2-026 小字辈

思路:建树,辈分最小的即为树中深度最大的。用dfs求点的深度

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e5+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n;
int h[N],e[N],ne[N],idx;
int dep[N],maxd;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int d)
{
    dep[u]=d;
    maxd=max(maxd,d);
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        dfs(j,d+1);
    }
}
void solve()
{
    memset(h,-1,sizeof h);
    cin>>n;
    int root=-1;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(x==-1) root=i;
        else add(x,i);
    }
    dfs(root,1);
    cout<<maxd<<'\n';
    vector<int>ans;
    for(int i=1;i<=n;i++)
        if(dep[i]==maxd)
            ans.push_back(i);
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++)
        cout<<ans[i]<<" \n"[i==ans.size()-1];
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

 L2-027 名人堂与代金券

题意:

思路:结构体排序,注意排名的计算和成绩并列时的输出

 

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,g,k;
struct node{
    string name;
    int s;
}a[N];
bool cmp(node a,node b)
{
    if(a.s==b.s) return a.name<b.name;
    return a.s>b.s;
}
void solve()
{
    cin>>n>>g>>k;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].name>>a[i].s;
        if(a[i].s>=60&&a[i].s<g) sum+=20;
        else if(a[i].s>=g) sum+=50;
    }
    cout<<sum<<'\n';
    sort(a+1,a+n+1,cmp);
    int cnt=0,last=-1;
    int i;
    for(i=1;i<=k;i++)
    {
        if(a[i].s==last)
            cout<<cnt<<' '<<a[i].name<<' '<<a[i].s<<'\n';
        else
        {
            cout<<i<<' '<<a[i].name<<' '<<a[i].s<<'\n';
            cnt=i;
        }
        // cnt=i;
        last=a[i].s;
    }
    while(a[i].s==last)
    {
        cout<<cnt<<' '<<a[i].name<<' '<<a[i].s<<'\n';
        i++;
    }
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-028 秀恩爱分得快

题意:

思路:r数组存照片中的人,只计算与a和b有关的亲密度,st数组存性别。注意-0的输入和输出,输入用字符串。 

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1010;
const int inf=0x3f3f3f3f;

using namespace std;
int n,m;
int st[N];
vector<int>r[N];
double pa[N],pb[N];
int change(string x)
{
    bool f=0;
    if(x[0]=='-') f=1;
    int ret=0;
    for(int i=0;i<x.length();i++)
    {
        if(x[i]>='0'&&x[i]<='9')
            ret=ret*10+int(x[i]-'0');
    }
    if(f) st[ret]=-1;
    return ret;
}
void solve()
{
    cin>>n>>m;
    for(int i=0;i<n;i++) st[i]=1;
    for(int i=0;i<m;i++)
    {
        int k;
        cin>>k;
        for(int j=0;j<k;j++)
		{
			string s;
			cin>>s;
			int x=change(s);
			r[i].push_back(x);
		}
    }
    string A,B;
    cin>>A>>B;
    int a,b;
    a=change(A);b=change(B);
	bool exist_a,exist_b;
	double maxa=0,maxb=0;//a,b与异性的最大亲密度
	for(int i=0;i<m;i++)
	{
		exist_a=(find(r[i].begin(),r[i].end(),a)!=r[i].end());
		exist_b=(find(r[i].begin(),r[i].end(),b)!=r[i].end());
		if(exist_a||exist_b)
		{
			int k=r[i].size();
			for(int j=0;j<k;j++)
			{
				if(exist_a&&st[r[i][j]]!=st[a])
				{
					pa[r[i][j]]+=1.0/(1.0*k);
					maxa=max(maxa,pa[r[i][j]]);
				}
				if(exist_b&&st[r[i][j]]!=st[b])
				{
					pb[r[i][j]]+=1.0/(1.0*k);
					maxb=max(maxb,pb[r[i][j]]);
				}
			}
		}
	}
	if(maxa==pa[b]&&maxb==pb[a])
	{
		printf("%s%d %s%d\n",st[a]==1? "":"-",a,st[b]==1? "":"-",b);
	}
	else
	{
		for(int i=0;i<n;i++)
			if(pa[i]==maxa)
				printf("%s%d %s%d\n",st[a]==1? "":"-",a,st[i]==1? "":"-",i);
		for(int i=0;i<n;i++)
			if(pb[i]==maxb)
				printf("%s%d %s%d\n",st[b]==1? "":"-",b,st[i]==1? "":"-",i);
	}
}
signed main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    //ios;
    int _t=1;
    //cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

L2-029 特立独行的幸福

题意:

思路:我们可以把数指向他迭代的下一个数来建树。然后判断区间内每个数的祖宗节点是不是1,有没有依附来判断。在这里插入图片描述 

 

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e4+10;
const int inf=0x3f3f3f3f;

using namespace std;
int a,b;
bool st[N];
int primes[N],cnt;
void get(int n)
{
	for(int i=2;i<=n;i++)
	{
		if(!st[i]) primes[cnt++]=i;
		for(int j=0;primes[j]<=n/i;j++)
		{
			st[i*primes[j]]=1;
			if(i%primes[j]==0) break;
		}
	}
}
int fa[N];
int change(int x)//平方和
{
	int ret=0;
	while(x)
	{
		int t=x%10;
		x/=10;
		ret+=t*t;
	}
	return ret;
}
int num;
int find(int x)//找祖宗节点
{
	num=0;
	while(fa[x]!=x)
	{
		num++;
		x=fa[x];
		if(num>N) return -1;
	}
	return x;
}
bool check(int x)//[a,b]有没有数依附于x
{
	for(int i=a;i<=b;i++)
		if(fa[i]==x) return 0;
	return 1;
}
void solve()
{
	cin>>a>>b;
	get(b);
	for(int i=1;i<N;i++) fa[i]=i;
	for(int i=1;i<N;i++)
		fa[i]=change(i);//每个数指向其平方和
	int ans=0;
	for(int i=a;i<=b;i++)
	{
		if(find(i)==1&&check(i))
		{
			if(!st[i]) num*=2;
			cout<<i<<' '<<num<<'\n';
			ans++;
		}
	}
	if(ans==0) puts("SAD");
}
signed main()
{
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	//ios;
	int _t=1;
	//cin>>_t;
	while(_t--) solve();
	system("pause");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习(9)之 easyOCR使用详解

easyOCR使用详解 本文在 OCR-easyocr初识 基础上进行修改EasyOCR 是一个python版的文字识别工具。目前支持80中语言的识别。其对应的 github 地址&#xff1a;EasyOCR可以在网站版测试 demo 测试效果&#xff1a;https://www.jaided.ai/easyocr/其在字符识别上的效果如下&…

学系统集成项目管理工程师(中项)系列07_信息(文档)管理

1. 信息系统相关信息&#xff08;文档&#xff09; 1.1. 是指某种数据媒体和其中所记录的数据 1.2. 永久性 1.3. 由人或机器阅读 1.4. 仅用于描述人工可读的东西 2. 分类 2.1. 开发文档 2.1.1. 可行性研究报告和项目任务书 2.1.2. 需求规格说明 2.1.3. 功能规格说明 …

MapReduce高级-读写数据库

MapReduce 读取数据库 为什么要读写数据库 本质上讲数据库是存储数据的介质&#xff0c;MapReduce是处理数据的计算引擎。通常企业会使用关系型数据库&#xff08;RDBMS&#xff09;来存储业务的相关数据&#xff0c;随着业务数据的规模越来越大&#xff0c;不可避免的存在性…

C++ -3- 类和对象 (中) | 拷贝构造函数 赋值运算符重载(二)

文章目录 4.拷贝构造函数什么是拷贝构造函数&#xff1f;应用——示例&#xff1a;日期计算器什么情况下需要自己实现拷贝构造函数&#xff1f; 5.赋值运算符重载运算符重载&#xff08;重要&#xff09;赋值运算符重载 拷贝构造函数和赋值重载函数 4.拷贝构造函数 什么是拷贝…

【进阶C语言】静态版通讯录的实现(详细讲解+全部源码)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;正在学习C/C、Java、Python等。 &#x1f4d7;本文收录于C语言进阶系列&#xff0c;本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等&#xff0…

Javaee Spring JdbcTemplate基本使用查询数据库表的内容 基于xml配置方式

目录 哈哈哈哈&#xff0c;说好是要写一篇关于jdbcTemplate的基本使用&#xff0c;貌似说跑题了&#xff0c;但是主体还是用jdbctemplate实现的&#xff0c;有耐心看完的话相信能有点点收获的哦&#xff01; 项目结构&#xff1a; 用到的数据库: 小结&#xff1a; 遇到了个小…

【Python_Opencv图像处理框架】图像基本操作

写在前面 很幸运能选择Python语言进行学习&#xff0c;这是有关Opencv的图像处理的第一篇文章&#xff0c;讲解了有关图像处理的一些基础操作&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正❤️ 写在中间 1…

Docker容器---介绍、安装

Docker基本管理 一、Docker概述1、IT架构2、什么是docker3、Docker特点4、Docker与KVM区别 二、Docker核心概念1、镜像 容器 仓库2、虚拟架构有哪些 三、Docker使用场景1、Docker在内核中支持的2种重要技术2、应用场景 四、Docker安装1、YUM安装docker2、设置阿里云镜像源3、查…

Java多线程初阶(一)(图片+源码+超详细)

线程的概念参照以往的这篇文章&#x1f43b; 目录 1.创建线程 1.1 继承Thread类 1.2 实现Runnable接口 eg&#xff1a;常用的简写方式 2.Thread类中的常用API 3. start方法和run方法 4. 继承Thread类启动新线程的逻辑 5. 实现Runnable接口启动新线程的逻辑 6. 线程相关…

Linux基础—日志分析

Linux基础—日志分析 一、日志的功能1.日志消息的级别2.设备字段说明 二、日志文件的分类1.内核及系统日志2.用户日志3.程序日志 三、日志文件1.日志文件查看2.主要日志文件介绍3.日志管理策略 一、日志的功能 用于记录系统、程序运行中发生的各种事件 通过阅读日志&#xff0c…

图像描述算法排位赛:SceneXplain与MiniGPT-4谁将夺得桂冠?

如果你对 AI 前沿感兴趣&#xff0c;本场「图像描述算法排位赛」绝对是你不能错过的&#xff01;在这场较量中&#xff0c;SceneXplain 和 MiniGPT-4 将会比试&#xff0c;谁将摘得这场比赛的桂冠&#xff1f; &#x1f4ce; 直接上手体验&#xff1a;scenex.jina.ai 背景介绍 …

手机存储数据恢复软件哪个好用?试了10款,我只认准这一款!

案例&#xff1a;手机存储数据恢复软件哪个好用&#xff1f; 【有没有好介绍的苹果数据恢复软件&#xff1f;可以恢复好几年数据的那种软件&#xff1f;求推荐&#xff01;】 手机中的数据是用户平时使用手机时不可避免的内容&#xff0c;这些数据包括照片、视频、音乐、文件等…

Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机同步采集(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机的同步采集&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的高速同步采集的技术背景Baumer工业相机通过BGAPI SDK在回调函数里同步保存图像工业相机在回调函数BufferEvent保存工业相机使用软触发进行同…

【观察】华为:新一代楼宇网络,使能绿建智慧化

“碳达峰”、“碳中和”目标是我国生态文明建设和高质量可持续发展的重要战略安排&#xff0c;将推动全社会加速向绿色低碳转型。作为全球既有建筑和每年新建建筑量最大的国家&#xff0c;大力发展绿色建筑对中国全方位迈向低碳社会、实现高质量发展具有重要意义。 《“十四五”…

使用FirmAE 对zyxel路由器固件仿真实践 | 信息安全

一、FirmAE简介 FirmAE 是一个执行仿真和漏洞分析的全自动框架。FirmAE 使用五种仲裁技术显著提高仿真成功率&#xff08;从Firmadyne的 16.28% 提高到 79.36%&#xff09;。 FirmAE的整体架构为如上图所示。与Firmadyne类似&#xff0c;FirmAE在预先构建的自定义Linux内核和库…

Codeforces Round 816 (Div. 2)(C. Monoblock)

传送门 题意&#xff1a; 定义一个数组&#xff0c;定义它 相等连续段的个数 如1,2,2,1&#xff0c;相等连续段有[1],[2,2],[1]&#xff0c;共3个 如2,2,2,1&#xff0c;相等连续段有[2,2,2],[1]&#xff0c;共2个 给定一个数组a&#xff0c;定义g(l,r)为&#xff0c;子数组中…

fisco bcos 2.0+ 版本浏览器搭建

Fisco Bcos当前已经发布了3版本&#xff0c;在3版本中&#xff0c;Fisco摒弃了原有的区块链浏览器&#xff0c;而是提供了具有更为丰富功能的图形化区块链管理工具WeBase&#xff0c;后续也会提供对于WeBase的搭建部署教程。 文章目录 一、准备条件二、下载浏览器安装脚本1. 下…

ChatGPT4 的体验 一站式 AI工具箱 -—Poe(使用教程)

最近由于人工智能聊天机器人的爆火(ChatGPT)&#xff0c;因此各种各样的AI助手流行与网络&#xff0c;各种各样的都有&#xff0c;不论是什么样的其实都是为了我们更方便的解决问题&#xff0c;今天介绍一款AI工具箱——Poe将多种AI集成与一个界面&#xff0c;大家可以一次感受…

Mac系统brew报错“The GitHub credentials in the macOS keychain may be invalid”解决

报错信息如下&#xff1a; $ brew search nginx Warning: Error searching on GitHub: GitHub API Error: Requires authentication The GitHub credentials in the macOS keychain may be invalid. Clear them with: printf "protocolhttps\nhostgithub.com\n" | …

Python双向链表的操作

目录 一、双向链表 双向链表示例图 二、双向链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&#xff0…