zoukankan      html  css  js  c++  java
  • cf1121d 尺取

    尺取,写起来有点麻烦

    枚举左端点,然后找到右端点,,使得区间[l,r]里各种颜色花朵的数量满足b数组中各种花朵的数量,然后再judge区间[l,r]截取出后能否可以供剩下的n-1个人做花环

    /*
    给定序列A,分成n段,每段k个,
    然后删掉A中的一些,但任要能组成n段,使得A中的一段包含序列B中的所有元素
    如果可以输出删掉的元素,否则输出-1 
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 500005
    int m,k,n,s,a[maxn],b[maxn],c[maxn];
    int tot[maxn],cnt[maxn];//tot[i]表示第i种颜色需要的数量 
    int l,r,sum,Max,all;
    int judge(int l,int r){//判断除去l,r是否可行 
        int tmp1=l-1,tmp2=m-r;
        if(tmp1/k+tmp2/k+1>=n)return 1;
        return 0;
    }
    void add(int i){
        if(cnt[a[i]]==0)return;
        tot[a[i]]++;
        if(tot[a[i]]==cnt[a[i]])sum++;
    }
    void del(int i){
        if(cnt[a[i]]==0)return;
        tot[a[i]]--;
        if(tot[a[i]]==cnt[a[i]]-1)sum--;
    }
    
    int main(){
        cin>>m>>k>>n>>s;
        for(int i=1;i<=m;i++)cin>>a[i],Max=max(Max,a[i]);
        for(int i=1;i<=s;i++)cin>>b[i],Max=max(Max,b[i]);
        for(int i=1;i<=s;i++)cnt[b[i]]++;
        
        l=1,r=k;sum=0;
        for(int i=1;i<=Max;i++)
            if(cnt[i]!=0)all++;
        for(int i=l;i<=k;i++)
            add(i);
        
        while(1){
            if(sum==all){
                if(judge(l,r)){//可行 
                    vector<int>v;
                    v.clear();
                    int tmp=r-l+1;
                    for(int i=l;i<=r;i++){
                        if(cnt[a[i]]>0 || tmp==k)
                            cnt[a[i]]--;
                        else v.push_back(i),tmp--; 
                    }        
                    printf("%d
    ",v.size());
                    for(int i=0;i<v.size();i++)
                        printf("%d ",v[i]);
                    return 0;
                }
                del(l);l++;    
            }
            
            while(sum<all || l+k-1>r){
                r++;
                if(r>m)break;
                add(r);
            }
            if(r>m)break;
        }
        puts("-1");
    } 
  • 相关阅读:
    NYOJ题目28大数阶乘
    网页小图标设置
    Sass中文乱码问题(手动编译和watch编译)
    设计模式之构建者模式(Builder):初步理解
    Struts2之类型转换器
    css设置网页文本选中样式
    由超市临时储物柜引发的一点设计随想...
    前端资源相关参考资料
    Struts2拦截器之ExceptionMappingInterceptor(异常映射拦截器)
    Struts2之OGNL
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10470567.html
Copyright © 2011-2022 走看看