zoukankan      html  css  js  c++  java
  • Maximize Mex CodeForces

    There are n students and m clubs in a college. The clubs are numbered from 1 to m. Each student has a potential pi and is a member of the club with index ci. Initially, each student is a member of exactly one club. A technical fest starts in the college, and it will run for the next d

    days. There is a coding competition every day in the technical fest.

    Every day, in the morning, exactly one student of the college leaves their club. Once a student leaves their club, they will never join any club again. Every day, in the afternoon, the director of the college will select one student from each club (in case some club has no members, nobody is selected from that club) to form a team for this day's coding competition. The strength of a team is the mex of potentials of the students in the team. The director wants to know the maximum possible strength of the team for each of the coming d

    days. Thus, every day the director chooses such team, that the team strength is maximized.

    The mex of the multiset S

    is the smallest non-negative integer that is not present in S. For example, the mex of the {0,1,1,2,4,5,9} is 3, the mex of {1,2,3} is 0 and the mex of (empty set) is 0

    .

    Input

    The first line contains two integers n

    and m (1mn5000

    ), the number of students and the number of clubs in college.

    The second line contains n

    integers p1,p2,,pn (0pi<5000), where pi is the potential of the i

    -th student.

    The third line contains n

    integers c1,c2,,cn (1cim), which means that i-th student is initially a member of the club with index ci

    .

    The fourth line contains an integer d

    (1dn

    ), number of days for which the director wants to know the maximum possible strength of the team.

    Each of the next d

    lines contains an integer ki (1kin), which means that ki-th student lefts their club on the i-th day. It is guaranteed, that the ki

    -th student has not left their club earlier.

    Output

    For each of the d

    days, print the maximum possible strength of the team on that day.

    Examples

    Input
    5 3
    0 1 2 2 0
    1 2 2 3 2
    5
    3
    2
    4
    5
    1
    
    Output
    3
    1
    1
    1
    0
    
    Input
    5 3
    0 1 2 2 1
    1 3 2 3 2
    5
    4
    2
    3
    5
    1
    
    Output
    3
    2
    2
    1
    0
    
    Input
    5 5
    0 1 2 4 5
    1 2 3 4 5
    4
    2
    3
    5
    4
    
    Output
    1
    1
    1
    1
    

    Note

    Consider the first example:

    On the first day, student 3

    leaves their club. Now, the remaining students are 1, 2, 4 and 5. We can select students 1, 2 and 4 to get maximum possible strength, which is 3. Note, that we can't select students 1, 2 and 5, as students 2 and 5 belong to the same club. Also, we can't select students 1, 3 and 4, since student 3

    has left their club.

    On the second day, student 2

    leaves their club. Now, the remaining students are 1, 4 and 5. We can select students 1, 4 and 5 to get maximum possible strength, which is 1

    .

    On the third day, the remaining students are 1

    and 5. We can select students 1 and 5 to get maximum possible strength, which is 1

    .

    On the fourth day, the remaining student is 1

    . We can select student 1 to get maximum possible strength, which is 1

    .

    On the fifth day, no club has students and so the maximum possible strength is

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<stdio.h>
    #include<map>
    #include<string.h>
    using namespace std;
    
    const int maxn=5e3+10;
    int match[maxn],vis[maxn],to[maxn],nex[maxn],f[maxn],ans[maxn],c[maxn],p[maxn],k[maxn];
    int cnt;
    
    map<int,int> mp;
    
    void add(int a,int b)
    {
        cnt++;
        to[cnt]=b;
        nex[cnt]=f[a];
        f[a]=cnt;
    }
    bool dfs(int x)
    {
        if(vis[x])return false;
        vis[x]=1;
        for(int i=f[x]; i; i=nex[i])
        {
            int v=to[i];
                if(match[v]==-1||dfs(match[v]))
                {
                    match[v]=x;
                    return true;
                }
        }
        return false;
    }
    
    
    
    int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<maxn;i++) match[i]=-1;
        for(int i=1;i<=n;i++) scanf("%d",&p[i]);
        for(int i=1;i<=n;i++) scanf("%d",&c[i]);
        int td;
        scanf("%d",&td);
    //    cout<<td<<"()"<<endl;
        for(int i=1;i<=td;i++){
            scanf("%d",&k[i]);
            mp[k[i]]=1;
        }
        for(int i=1;i<=n;i++){
            if(mp[i]==0) add(p[i],c[i]);
        }
        for(int i=td;i>=1;i--){
            ans[i]=ans[i+1];
            while(1){
                memset(vis,0,sizeof(vis));            
                if(dfs(ans[i])) ans[i]++;
                else break;
            }
            add(p[k[i]],c[k[i]]);
        }
    //    cout<<"*"<<endl;
        for(int i=1;i<=td;i++){
            printf("%d
    ",ans[i]);
        } 
    }

    0

  • 相关阅读:
    Eclipse,到了说再见的时候了——Android Studio最全解析
    iOS 获取当前时间以及计算年龄(时间差)
    USACO inflate
    Hauntbox:用于控制你的自己主动化、电子创意家居的开源硬件盒子
    使用开源的PullToRefreshScrollView scrollTo和scrollby遇到的问题
    iOS &quot;The sandbox is not in sync with the Podfile.lock&quot;解决方式
    [衣裳饰品]谈谈西装、手工西装和西装定制_时尚资讯_天涯论坛
    高级服装制版师、高级男女西服全套裁艺培训、带学徒
    中式男装制作
    关于意大利马兰戈尼时装与设计学院_马兰戈尼学院
  • 原文地址:https://www.cnblogs.com/ellery/p/11688985.html
Copyright © 2011-2022 走看看