• 【BZOJ 1293】[SCOI2009]生日礼物


    【链接】 我是链接,点我呀:)
    【题意】

    在这里输入题意

    【题解】

    显然的滑动窗口题。 (尺取法

    如果l..i这一段已经有k种珍珠了。
    那么就尝试把l++;
    (即把l这个影响尝试去掉一下

    如果不足k种珍珠了,那么就把l++撤销。
    否则l++照常
    (离散化一下数据

    【代码】

    #include <bits/stdc++.h>
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define all(x) x.begin(),x.end()
    #define pb push_back
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    using namespace std;
    
    const double pi = acos(-1);
    const int dx[4] = {0,0,1,-1};
    const int dy[4] = {1,-1,0,0};
    
    const int N = 1e6;
    const int K = 60;
    
    int n,k,cnt[K+10];
    vector<int> v[K+10],V,num[N+10];
    
    int main(){
    	#ifdef LOCAL_DEFINE
    	    freopen("rush_in.txt", "r", stdin);
    	#endif
        scanf("%d%d",&n,&k);
        rep1(i,1,k){
            int num;
            scanf("%d",&num);
            rep1(j,1,num){
                int x;
                scanf("%d",&x);
                v[i].pb(x);
                V.push_back(x);
            }
        }
    
        sort(all(V));
        n = unique(all(V))-V.begin();
    
        rep1(i,1,k){
            rep1(j,0,(int)v[i].size()-1){
                int x = v[i][j];
                x = lower_bound(all(V),x)-V.begin();
                num[x].pb(i);
            }
        }
    
        int l = 0,_count = 0,ans = -1;
        rep1(i,0,n-1){
            rep1(j,0,(int)num[i].size()-1){
                int x = num[i][j];
                cnt[x]++;
                if (cnt[x]==1) _count++;
            }
            while (_count==k){
                //尝试把l++
                rep1(j,0,(int)num[l].size()-1){
                    int x = num[l][j];
                    cnt[x]--;
                    if (cnt[x]==0) _count--;
                }
                if (_count<k){
                    rep1(j,0,(int)num[l].size()-1){
                        int x = num[l][j];
                        cnt[x]++;
                        if (cnt[x]==1) _count++;
                    }
                    break;
                }
                l++;
            }
            if (_count==k){
                if (ans==-1){
                    ans = V[i]-V[l];
                }else{
                    ans = min(ans,V[i]-V[l]);
                }
            }
        }
        printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    一个完整的AjaxPro例子(转)
    sql2000存储过程
    System.Configuration命名空间下找不到ConfigurationManager类
    编译器错误信息: CS0016
    (转)AjaxPro使用说明
    数据库中去逗号的函数
    asp.net 验证码
    sql2005存储过程
    简单控件分页
    身份证号码验证
  • 原文地址:https://www.cnblogs.com/AWCXV/p/8619567.html
Copyright © 2020-2023  润新知