bzoj3048[Usaco2013 Jan]Cow Lineup 单调队列
2017-05-28 14:38
411 查看
这题目很好,既能锻炼思维也能锻炼实现技巧。毕竟在某种程度上来说,实现功底要比思维更加重要。
题意比较明显就不说了。
第一眼看到觉得是dp,但是连nk的dp好像都很难打,觉得可能需要特殊的优化技巧?
然后看了看好像可以二分,但是判断非常复杂,不可做。。
然后就蒙蔽了,觉得dp应该没错啊,难道我还要用线段树之类的优化?然而并不可以。。
瞄了一眼发现都是1k左右,觉得应该就是dp没错,然而题解啪啪啪打脸。。
因为我们要去除K种数,所以,去除的K种数肯定都对我们的答案有贡献,所以答案的区间必定是有k+1种数字,所以我们只要单调队列维护,然后每次O(1)计算答案即可。
然后我直接上了,发现O(1)统计好像没那么简单,,想了一会儿打了个超复杂的版本结果WA了。。
看看人家打的。。发现很优美啊,学习一波。。用标记数组顺便存储数字在当前区间的出现次数,然后计算答案的时候直接用标记数组更新,踢出元素也是用标记数组判断一下就行了。。
还有就是思维要更加发散一些,当一种看起来很正确的算法无法下手的时候通常他都是有问题的,最好换一种思路,不要吊死在一棵树上。。。
题意比较明显就不说了。
第一眼看到觉得是dp,但是连nk的dp好像都很难打,觉得可能需要特殊的优化技巧?
然后看了看好像可以二分,但是判断非常复杂,不可做。。
然后就蒙蔽了,觉得dp应该没错啊,难道我还要用线段树之类的优化?然而并不可以。。
瞄了一眼发现都是1k左右,觉得应该就是dp没错,然而题解啪啪啪打脸。。
因为我们要去除K种数,所以,去除的K种数肯定都对我们的答案有贡献,所以答案的区间必定是有k+1种数字,所以我们只要单调队列维护,然后每次O(1)计算答案即可。
然后我直接上了,发现O(1)统计好像没那么简单,,想了一会儿打了个超复杂的版本结果WA了。。
看看人家打的。。发现很优美啊,学习一波。。用标记数组顺便存储数字在当前区间的出现次数,然后计算答案的时候直接用标记数组更新,踢出元素也是用标记数组判断一下就行了。。
还有就是思维要更加发散一些,当一种看起来很正确的算法无法下手的时候通常他都是有问题的,最好换一种思路,不要吊死在一棵树上。。。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define inf 0xc3c3c3c3 using namespace std; const int N=1e5+5; const int mo=1e9+7; typedef long long ll; int n,m; int f ; int b ; int vis ; int ans=0; struct node { int id,x; int y; }a ; int q ; int cnt; bool cmp(node a,node b) { return a.x<b.x; } int main() { scanf("%d%d",&n,&m); fo(i,1,n)scanf("%d",&a[i].x),a[i].id=i; sort(a+1,a+1+n,cmp); fo(i,1,n)if (a[i].x!=a[i-1].x)a[i].y=++cnt; else a[i].y=cnt; fo(i,1,n)b[a[i].id]=a[i].y; int l=1,r=0; int kind=0,i=0; while (i<n) { while (i<n&&kind<=m) { q[++r]=b[++i]; if (!vis[b[i]])kind++; vis[b[i]]++; ans=max(ans,vis[b[i]]); } while (kind==m+1&&i<n) { if (!vis[b[i+1]])break; q[++r]=b[++i]; vis[b[i]]++; ans=max(ans,vis[b[i]]); } if (vis[q[l]]==1)kind--; vis[q[l]]--; l++; } printf("%d\n",ans); }
相关文章推荐
- BZOJ 3048: [Usaco2013 Jan]Cow Lineup 单调队列
- 【bzoj 3048】[Usaco2013 Jan]Cow Lineup(单调队列)
- [BZOJ3048][Usaco2013 Jan]Cow Lineup(单调队列)
- BZOJ_P3048 [Usaco2013 Jan]Cow Lineup(二分答案+树状数组/单调队列)
- bzoj3048: [Usaco2013 Jan]Cow Lineup(单调队列)
- [bzoj3048] [Usaco2013 Jan]Cow Lineup
- [bzoj3048][Usaco2013 Jan]Cow Lineup(离散+莫队)
- bzoj3048[Usaco2013 Jan]Cow Lineup 尺取法
- 【bzoj3048】[Usaco2013 Jan]Cow Lineup
- BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针
- 【BZOJ 3048】【USACO2013 Jan】Cow Lineup 滑块思想
- 【BZOJ】【P3028】【Usaco2013 Jan】【Cow Lineup】【题解】
- BZOJ 3885 Usaco2015 Jan Cow Rectangles 单调队列+二分
- bzoj3126[Usaco2013 Open]Photo 单调队列优化dp
- 【BZOJ3048】Cow lineup,贪心+队列维护(或二分答案)
- bzoj 3126: [Usaco2013 Open]Photo (DP+单调队列)
- [bzoj 3048] [Usaco2013 Jan]Cow Lineup
- bzoj 3048: [Usaco2013 Jan]Cow Lineup
- bzoj3048 [Usaco2013 Jan]Cow Lineup
- bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)