zoukankan      html  css  js  c++  java
  • bzoj 1293: [SCOI2009]生日礼物

    思路:尺取一下

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 #define fi first
     4 #define se second
     5 #define mk make_pair
     6 #define pii pair<int,int>
     7 #define piii pair<int, pair<int,int>>
     8 
     9 using namespace std;
    10 
    11 const int N = 1e6 + 7;
    12 const int M = 1e4 + 7;
    13 const int inf = 0x3f3f3f3f;
    14 const LL INF = 0x3f3f3f3f3f3f3f3f;
    15 const int mod = 1e9 + 7;
    16 
    17 int n, k, hs[N], tot, cnt[66];
    18 vector<int> vec[66];
    19 vector<int> w[N];
    20 LL a[N];
    21 
    22 int check() {
    23     int l = 0, r = 0, ans = inf;
    24     LL ret = 0;
    25     while(r < tot) {
    26         while(ret + 1 != 1ll << k && r < tot) {
    27             for(int j = 0; j < w[r].size(); j++) {
    28                 int u = w[r][j];
    29                 if(!cnt[u]) {
    30                     ret |= 1ll << u;
    31                 }
    32                 cnt[u]++;
    33             }
    34             r++;
    35         }
    36         if(ret + 1 == 1ll << k) ans = min(ans, hs[r - 1] - hs[l]);
    37         else break;
    38 
    39         for(int j = 0; j < w[l].size(); j++) {
    40             int u = w[l][j];
    41             if(cnt[u] == 1) {
    42                 ret ^= 1ll << u;
    43             }
    44             cnt[u]--;
    45         }
    46         l++;
    47     }
    48     return ans;
    49 }
    50 
    51 int main() {
    52     scanf("%d%d", &n, &k);
    53     for(int i = 0; i < k; i++) {
    54         int num; scanf("%d", &num);
    55         while(num--) {
    56             int x; scanf("%d", &x);
    57             hs[tot++] = x;
    58             vec[i].push_back(x);
    59         }
    60     }
    61 
    62     sort(hs, hs + tot);
    63     tot = unique(hs, hs + tot) - hs;
    64     for(int i = 0; i < k; i++) {
    65         for(int j = 0; j < vec[i].size(); j++) {
    66             int pos = lower_bound(hs, hs + tot, vec[i][j]) - hs;
    67             w[pos].push_back(i);
    68         }
    69     }
    70     int ans = check();
    71     printf("%d
    ", ans);
    72     return 0;
    73 }
    74 
    75 /*
    76 */
  • 相关阅读:
    Dolls
    无题II hdu 2236(二分枚举区间)
    Cyclic Nacklace
    剪花布条
    Oulipo
    最短路
    Bzoj3211花神游历各国
    Zjoi2010排列计数Perm
    Zjoi2011看电影(movie)
    关于一次同余方程的一类解法(exgcd,CRT,exCRT)
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9063777.html
Copyright © 2011-2022 走看看