【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\n",ans); return 0; }
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20