数字游戏
数字游戏
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 165 Accepted Submission(s) : 49
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
小艾和小牛在上数学课的时候觉得非常的无聊,于是他们想出了一个新的游戏,小牛写下N位的数字,小艾的任务就是在去除了K位后得到一个最大的数。
Input
输入有多组数据。第一行输入一个N和一个K( 1 <= K < N <= 500 000 ).
接下来就是N位数字,确保输入数据中没有前导0。
接下来就是N位数字,确保输入数据中没有前导0。
Output
输出去除了K位后的最大数字。
Sample Input
4 2 1924 7 3 1231234 10 4 4177252841
Sample Output
94 3234 775841
思路:
很巧妙的一题。
N K
现在(1, k + 1)区间求一个最大值
最大值下标为pos
接着在(pos+1,k+2)区间求一个最大值。。
。。
最后输出这些最大值就可以。
威武的线段树
View Code
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXN 100010 struct node { int left, right; int maxn, pos; }T[MAXN<<4]; int N, k; char str[1001000]; void build(int l, int r, int root) { int mid = (l + r) / 2; T[root].left = l; T[root].right = r; if( l == r ) { T[root].pos = l; T[root].maxn = str[l] - '0'; return; } build(l,mid,root*2); build(mid+1,r,root*2+1); if( T[root*2].maxn > T[root*2+1].maxn ) { T[root].maxn = T[root*2].maxn; T[root].pos = T[root * 2].pos; } else if( T[root*2].maxn < T[root*2+1].maxn ) { T[root].maxn = T[root*2+1].maxn; T[root].pos = T[root * 2+1].pos; } else { T[root].maxn = T[root*2+1].maxn; T[root].pos = min(T[root*2].pos,T[root*2+1].pos); } //T[root].maxn = max(T[root*2].maxn, T[root*2+1].maxn); } void query(int l, int r, int root, int &ans, int &pos) { int mid = (T[root].left + T[root].right) / 2; if( l == T[root].left && r == T[root].right ) { if( T[root].maxn > ans ) { ans = T[root].maxn; //if( T[root].pos < pos ) pos = T[root].pos; } return; } if(l > mid ) query(l, r, root * 2 + 1, ans, pos); else if( r <= mid ) query(l, r, root * 2 , ans,pos); else { query(l,mid, root * 2, ans,pos); query(mid+1,r,root * 2 + 1,ans,pos); } } int main( ) { while( scanf("%d%d",&N,&k) != EOF) { scanf("%s",str+1); int len = strlen(str+1); build(1,len,1); int ans, p, q = 1, pos; for( int i = 1; i <= N - k; i++) { ans = -100; p = k + i; query(q,p,1,ans, pos); // printf("q = %d p = %d ans = %d pos = %d\n",q,p,ans,pos); q = pos + 1; printf("%d",ans); } puts(""); } return 0; }
posted on 2012-07-24 14:39 more think, more gains 阅读(192) 评论(0) 编辑 收藏 举报