zoj 3790 离散化
2014-06-05 01:38
246 查看
离散化一下然后贪心一下就好了
AC代码如下:
AC代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <set> #include <vector> #include <map> using namespace std; const int MAXN = 110000; vector<int> s[MAXN]; set<int> myset; map<int,int> mp; int N, K, a[MAXN]; set<int>::iterator p; int calc( int g ){ int ans, now; int ft, ls; ft = ls = 0; ans = 1; now = 0; while( 1 ){ while( now <= K && ls < s[g].size() && ft < s[g].size() ){ if( ls == s[g].size() - 1 ){ break; } int temp = s[g][ls+1] - s[g][ls] - 1; now += temp; ls++; if( now <= K ){ ans = max( ans, ls - ft + 1 ); } } if( ls == s[g].size() - 1 ){ while( now > K ){ now -= s[g][ft+1] - s[g][ft] - 1; ft++; } ans = max( ans, ls - ft + 1 ); break; } while( now > K ){ now -= s[g][ft+1] - s[g][ft] - 1; ft++; } } return ans; } int main(){ while( scanf( "%d%d", &N, &K ) != EOF ){ myset.clear(); mp.clear(); for( int i = 1; i <= N; i++ ){ scanf( "%d", &a[i] ); myset.insert( a[i] ); } int top; for( p = myset.begin(), top = 1; p != myset.end(); p++, top++ ){ mp.insert( pair<int,int>( *p, top ) ); s[top].clear(); } for( int i = 1; i <= N; i++ ){ a[i] = mp.find( a[i] )->second; s[a[i]].push_back( i ); } int ans = 0; for( int i = 1; i < top; i++ ){ ans = max( ans, calc( i ) ); } printf( "%d\n", ans ); } return 0; }
相关文章推荐
- ZOJ 3790 Consecutive Blocks【离散化】【贪心】
- zoj 3790 Consecutive Blocks 离散化+二分
- ZOJ 3790 Consecutive Blocks (离散化 + 暴力)
- ZOJ_3790_Consecutive Blocks(离散化+二分/单调队列)
- ZOJ 3299 线段树 离散化
- ZOJ 3790 Consecutive Blocks [排序+扫描]
- ZOJ 3790 Consecutive Blocks
- zoj3299 Fall the Brick map 离散化
- ZOJ 3016 Cut(离散化+最小生成树)
- ZOJ 3790 Consecutive Blocks [排序+扫描]
- zoj 2301 Color the Ball(区间染色,线段树+离散化)
- zoj 3790
- ZOJ 3790 Consecutive Blocks
- zoj 2301 || hdu 1199 Color the Ball 线段树 离散化
- zoj 3299 Fall the Brick 离散化+区间更新+区间查询
- zoj 3299 线段树 离散化
- ZOJ 3790 Consecutive Blocks(尺取法)
- ZOJ 3790 Consecutive Blocks
- Zoj 3581 离散化
- zoj 3790