這道題簡直可以用嗶了狗了來形容
首先是單調隊列,這道題就是一道水水的單調隊列,算是複習一下以前學的不怎麼紮實的算法
然後就到正題了,下面的scan_d代表輸入掛,print_d代表輸出掛,scanf代表正常scanf,printf代表正常printf,數據範圍1e6
編譯器:G++
( scan_d + print_d + print_d ) * 1e6 = 800 MS
( scanf + print_d + print_d ) * 1e6 = 2100 MS
( scanf + printf + print_d ) * 1e6 = 10000 MS
( scanf + print + printf ) * 1e6 = TLE --------so sad!
編譯器:C++
( scan_d + print_d + print_d ) * 1e6 = 8000 MS
( scanf + print_d + print_d ) * 1e6 = 6500 MS
( scanf + printf + print_d ) * 1e6 = 6000 MS
( scanf + print + printf ) * 1e6 = 5800 MS
總結起來就是
1、時間排序爲:
scan_d + print_d + G++
scanf + printf + C++
scan_d + print _d + C++
scanf + printf + G++
2、
G++中scan_d和print_d比scanf和printf快;printf速度是scanf的6倍
C++中scanf和printf比scan_d和print_d快;scan_d速度是print_d的6倍
代碼:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
#include <queue>
#include <math.h>
#include <algorithm>
#include <set>
#include <map>
#include <stack>
using namespace std;
const int N = 1e6 + 25;
pair<int, int>pii, qu[N], qw[N];
int n, k;
int h1, t1, cnt;
int h2, t2;
int ma[N];
int mmax[N], mmin[N];
bool scan_d(int &num)//輸入整型
{
char in; bool IsN = false;
in = getchar();
if (in == EOF) return false;
while (in != '-' && (in<'0' || in>'9')) {
if (in == EOF)
return false;
in = getchar();
}
if (in == '-'){ IsN = true; num = 0; }
else num = in - '0';
while (in = getchar(), in >= '0'&&in <= '9'){
num *= 10, num += in - '0';
}
if (IsN) num = -num;
return true;
}
void print_d(int num)//輸出整型
{
bool flag = false;
if (num < 0) {
putchar('-');
num = -num;
}
int ans[10], top = 0;
while (num != 0) {
ans[top++] = num % 10;
num /= 10;
}
if (top == 0) putchar('0');
for (int i = top - 1; i >= 0; i--) {
char ch = ans[i] + '0';
putchar(ch);
}
}
int main(){
int i, j;
while (~scanf("%d%d", &n, &k)){
for (i = 0; i < n; i++)
scanf("%d", &ma[i]);
//scan_d(ma[i]);
if (k > n){
k = n;
}
h1 = 1;
t1 = 0;
h2 = 1;
t2 = 0;
cnt = 0;
for (i = 0; i < k; i++){
int tmp = ma[i];
while (h1 <= t1&&tmp > qu[t1].first)
t1--;
while (h2 <= t2&&tmp < qw[t2].first)
t2--;
pii.first = tmp;
pii.second = i;
qu[++t1] = pii;
qw[++t2] = pii;
}
mmax[cnt] = qu[h1].first;
mmin[cnt++] = qw[h2].first;
for (i = k; i < n; i++){
if (qu[h1].second <= i - k)h1++;
if (qw[h2].second <= i - k)h2++;
int tmp = ma[i];
while (h1 <= t1&&tmp > qu[t1].first)
t1--;
while (h2 <= t2&&tmp < qw[t2].first)
t2--;
pii.first = tmp;
pii.second = i;
qu[++t1] = pii;
qw[++t2] = pii;
mmax[cnt] = qu[h1].first;
mmin[cnt++] = qw[h2].first;
}
for (i = 0; i <= n - k; i++){
printf("%d", mmin[i]);
//print_d(mmin[i]);
if (i == n - k)putchar('\n');
else putchar(' ');
}
for (i = 0; i <= n - k; i++){
printf("%d", mmax[i]);
//print_d(mmax[i]);
if (i == n - k)putchar('\n');
else putchar(' ');
}
}
return 0;
}