poj2823 單調隊列 ------scanf/printf/G++/C++

這道題簡直可以用嗶了狗了來形容


首先是單調隊列,這道題就是一道水水的單調隊列,算是複習一下以前學的不怎麼紮實的算法

然後就到正題了,下面的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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章