zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 65 (Rated for Div. 2)(ACD)B是交互题,不怎么会

    A. Telephone Number

    A telephone number is a sequence of exactly 11 digits, where the first digit is 8. For example, the sequence 80011223388 is a telephone number, but the sequences 70011223388 and 80000011223388 are not.

    You are given a string ss of length nn, consisting of digits.

    In one operation you can delete any character from string ss. For example, it is possible to obtain strings 112, 111 or 121 from string 1121.

    You need to determine whether there is such a sequence of operations (possibly empty), after which the string ss becomes a telephone number.

    Input

    The first line contains one integer tt (1t1001≤t≤100) — the number of test cases.

    The first line of each test case contains one integer nn (1n1001≤n≤100) — the length of string ss.

    The second line of each test case contains the string ss (|s|=n|s|=n) consisting of digits.

    Output

    For each test print one line.

    If there is a sequence of operations, after which ss becomes a telephone number, print YES.

    Otherwise, print NO.

    Example
    input
    Copy
    2
    13
    7818005553535
    11
    31415926535
    
    output
    Copy
    YES
    NO
    
    Note

    In the first test case you need to delete the first and the third digits. Then the string 7818005553535 becomes 88005553535.

    这个分一下是否满足11位,如果大于11位,只需要判断除去后10位前面是否有8即可

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    #include<algorithm>
    #include<vector>
    
    const int maxn=1e5+5;
    typedef long long ll;
    using namespace std;
    
    int main()
    {
        int T;
        cin>>T;
        string str;
        int n;
        while(T--)
        {
            cin>>n;
        cin>>str;
        int len=str.length();
        if(len>11)
        {
            int flag=0;
            for(int t=len-11;t>=0;t--)
            {
                if(str[t]=='8')
                {
                flag=1;
                break;    
                }
            }
            if(flag)
            {
                cout<<"YES"<<endl;
            }
            else
            {
                cout<<"NO"<<endl;
            }
        }    
        else if(len==11)
        {
            if(str[0]=='8')
            {
                cout<<"YES"<<endl;
            }
            else
            {
                cout<<"NO"<<endl;
            }
        }
        else
        {
            cout<<"NO"<<endl;
        }
        }
        return 0;
    }

    C. News Distribution

    In some social network, there are nn users communicating with each other in mm groups of friends. Let's analyze the process of distributing some news between users.

    Initially, some user xx receives the news from some source. Then he or she sends the news to his or her friends (two users are friends if there is at least one group such that both of them belong to this group). Friends continue sending the news to their friends, and so on. The process ends when there is no pair of friends such that one of them knows the news, and another one doesn't know.

    For each user xx you have to determine what is the number of users that will know the news if initially only user xx starts distributing it.

    Input

    The first line contains two integers nn and mm (1n,m51051≤n,m≤5⋅105) — the number of users and the number of groups of friends, respectively.

    Then mm lines follow, each describing a group of friends. The ii-th line begins with integer kiki (0kin0≤ki≤n) — the number of users in the ii-th group. Then kiki distinct integers follow, denoting the users belonging to the ii-th group.

    It is guaranteed that i=1mki5105∑i=1mki≤5⋅105.

    Output

    Print nn integers. The ii-th integer should be equal to the number of users that will know the news if user ii starts distributing it.

    Example
    input
    Copy
    7 5
    3 2 5 4
    0
    2 1 2
    1 1
    2 6 7
    
    output
    Copy
    4 4 1 4 4 2 2 
    裸的并查集
    代码:
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<vector>
    #include<map>
    #include<cmath>
    
    const int maxn=5e5+5;
    typedef long long ll;
    using namespace std;
    int pre[maxn];
    int find(int x)
    {
        if(x==pre[x])
        {
            return x;
        }
        else
        {
            return pre[x]=find(pre[x]);
        }
    }
    void Merge(int x,int y)
    {
        int xx=find(x);
        int yy=find(y);
        if(xx!=yy)
        {
            pre[xx]=yy;
        }
        
    }
    int a[maxn];
    int main()
    {
        int n,m;
        cin>>n>>m;
        int x;
        for(int t=1;t<=n;t++)
        {
            pre[t]=t;
        }
        int s1,s2;
        for(int t=0;t<m;t++)
        {
            scanf("%d",&x);
            if(x!=0)
            scanf("%d",&s1);
            for(int j=1;j<x;j++)
            {
                scanf("%d",&s2);
                Merge(s1,s2);
                s1=s2;
            }
        }
    
        int ans=0;
        memset(a,0,sizeof(a));
        for(int t=1;t<=n;t++)
        {
        
            a[find(t)]++;
        }
        for(int t=1;t<=n;t++)
        {
            printf("%d ",a[find(t)]);
        }
    
        
        return 0;
    }
    
    
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    A string is called bracket sequence if it does not contain any characters other than "(" and ")". A bracket sequence is called regular(shortly, RBS) if it is possible to obtain correct arithmetic expression by inserting characters "+" and "1" into this sequence. For example, "", "(())" and "()()" are RBS and ")(" and "(()" are not.

    We can see that each opening bracket in RBS is paired with some closing bracket, and, using this fact, we can define nesting depth of the RBS as maximum number of bracket pairs, such that the 22-nd pair lies inside the 11-st one, the 33-rd one — inside the 22-nd one and so on. For example, nesting depth of "" is 00, "()()()" is 11 and "()((())())" is 33.

    Now, you are given RBS ss of even length nn. You should color each bracket of ss into one of two colors: red or blue. Bracket sequence rr, consisting only of red brackets, should be RBS, and bracket sequence, consisting only of blue brackets bb, should be RBS. Any of them can be empty. You are not allowed to reorder characters in ss, rr or bb. No brackets can be left uncolored.

    Among all possible variants you should choose one that minimizes maximum of rr's and bb's nesting depth. If there are multiple solutions you can print any of them.

    Input

    The first line contains an even integer nn (2n21052≤n≤2⋅105) — the length of RBS ss.

    The second line contains regular bracket sequence ss (|s|=n|s|=n, si{si∈{"(", ")"}}).

    Output

    Print single string tt of length nn consisting of "0"-s and "1"-s. If titi is equal to 0 then character sisi belongs to RBS rr, otherwise sisi belongs to bb.

    Examples
    input
    Copy
    2
    ()
    
    output
    Copy
    11
    
    input
    Copy
    4
    (())
    
    output
    Copy
    0101
    
    input
    Copy
    10
    ((()())())
    
    output
    Copy
    0110001111
    Note

    In the first example one of optimal solutions is s=s= "()()". rr is empty and b=b= "()()". The answer is max(0,1)=1max(0,1)=1.

    In the second example it's optimal to make s=s= "(())(())". r=b=r=b= "()()" and the answer is 11.

    In the third example we can make s=s= "((()())())((()())())". r=r= "()()()()" and b=b= "(()())(()())" and the answer is 22.

    思维,我们维护一下使得两个的深度尽可能的小,也就是当其中一个大的时候,就往另一个补,以此类推

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<vector>
    #include<map>
    #include<cmath>
    const int maxn=2e5+5;
    typedef long long ll;
    using namespace std;
    char str[maxn];
    int main()
    {
       int n;
       cin>>n;
       scanf("%s",str);
       int s1=0,s2=0;
       int a[maxn];
       for(int t=0;t<n;t++)
       {
           if(str[t]=='(')
           {
               if(s1<s2)
               {
                   s1++;
                   a[t]=0;
            }
            else
            {
                s2++;
                a[t]=1;
            }
        }
        else
        {
            if(s1<s2)
            {
                s2--;
                a[t]=1;
            }
            else
            {
                s1--;
                a[t]=0;
            }
        }
       }
       for(int t=0;t<n;t++)
       {
           printf("%d",a[t]);
       }
       return 0;
    }
  • 相关阅读:
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
    POJ
    hdu-4745 Two Rabbits
    蓝桥杯历年试题 小朋友排队
    蓝桥杯历年试题 矩阵翻硬币
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10878739.html
Copyright © 2011-2022 走看看