拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Blue---滑动窗口

Blue---滑动窗口 UVA11572 唯一的雪花 Unique Snowflakes - 洛谷#includeiostream using namespace std; #includeunordered_map int T, n; const int N 1e6 10; int a[N]; int main() { cin T n; while(T--) { for(int i 0;i n;i) cin a[i]; int l 0, r 0; //每组数据我们都新创建一个mp //就不用担心mp里有脏数据得问题 //包括每组数据进来都会for循环重新读入a数组a数组也不用清空脏数据 unordered_mapint, int mp; int ret 0;//区间长度不可能0因此这里初始化成0就可以了 while(r n) { mp[a[r]]; while(mp[a[r]] 1) { --mp[a[l]]; l; } ret max(ret, r - l 1); r; } cout ret endl; } return 0; }P1638 逛画展 - 洛谷#includeiostream using namespace std; const int N 1e6 10; int n, m; int a[N]; //哈希表题目数据范围比较小就直接用静态的哈希表就可以了 const int M 2e3 10; int ha[M]; int kind; int main() { cin n m; for(int i 1;i n;i) cin a[i]; int l 1, r 1; //区间最长为n下边循环里的len有可能计算出是n并且如果此时是第一次更新结果的话 //如果ret初始化成n的话就会导致lenret不会更新结果l和r还是为1 //或者下次ret直接初始化成无穷大吧省的麻烦 int ret n 1; int lmin 1, rmin 1;//记录最终结果的左右区间 while(r n) { if(ha[a[r]] 0) kind; while(kind m) { //到这一定是kindm //因此需要更新结果 int len r - l 1; //等于就不用更新了因为上一次的ret的l肯定比这一次的小 //正是我们需要的 if(len ret) { lmin l; rmin r; ret len; } //出窗口 if(ha[a[l]]-- 1) kind--; l; } r; } cout lmin rmin; return 0; }字符串跟上题的思路一样。#includeiostream using namespace std; #includestring int ha[26]; int kind; string s; int main() { cin s; int n s.size(); int l 0, r 0, ret n 1; while(r n) { if(ha[s[r] - a] 0) kind; while(kind 26) { ret min(ret, r - l 1); if(ha[s[l] - a]-- 1) --kind; l; } r; } cout ret; return 0; }丢手绢#includeiostream using namespace std; typedef long long LL; int n; LL sum; const int N 1e5 10; int f[N]; int main() { cin n; //博客里写错了f[i]应该表示第i号到第i1号之间的距离 //博客里写的是第i号和第i-1号之间的距离 for(int i 1;i n;i) { cin f[i]; sum f[i]; } int l 1, r 1; LL len 0, ret 0; //不用担心第n号和第1号之间的距离没法表示 //已经在f[n]里存着了 while(r n) { len f[r]; while(len * 2 sum) { //逆时针最远距离 ret max(ret, sum - len); len - f[l]; l; } //循环条件不成立出来的len就是顺时针最远距离 //顺时针最远距离 ret max(ret, len); r; } cout ret; return 0; }
返回列表