STL 報表統計

2021-06-05 21:11:35 字數 3953 閱讀 6240

description

小q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。經過仔細觀察,小q發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。在最開始的時候,有乙個長度為n的整數序列,並且有以下三種操作: insert i k 在原數列的第i個元素後面新增乙個新元素k; 如果原數列的第i個元素已經新增了若干元素,則新增在這些元素的最後(見下面的例子) min_gap 查詢相鄰兩個元素的之間差值(絕對值)的最小值 min_sort_gap 查詢所有元素中最接近的兩個元素的差值(絕對值) 例如一開始的序列為 5 3 1 執行操作insert 2 9將得到: 5 3 9 1 此時min_gap為2,min_sort_gap為2。 再執行操作insert 2 6將得到: 5 3 9 6 1 注意這個時候原序列的第2個元素後面已經新增了乙個9,此時新增的6應加在9的後面。這個時候min_gap為2,min_sort_gap為1。於是小q寫了乙個程式,使得程式可以自動完成這些操作,但是他發現對於一些大的報表他的程式執行得很慢,你能幫助他改進程式麼?

input

第一行包含兩個整數n,m,分別表示原數列的長度以及操作的次數。第二行為n個整數,為初始序列。接下來的m行每行乙個操作,即「insert i k」,「min_gap」,「min_sort_gap」中的一種(無多餘空格或者空行)。

output

對於每乙個「min_gap」和「min_sort_gap」命令,輸出一行答案即可。

sample input

3 55 3 1

insert 2 9

min_sort_gap

insert 2 6

min_gap

min_sort_gap

sample output22

1hint

對於30%的資料,n ≤ 1000 , m ≤ 5000

對於100%的資料,n , m ≤500000

對於所有的資料,序列內的整數不超過5*108。

用乙個stl multiset(g)維護當前列表中有哪些數,以便每插入乙個數找到它的前驅和後繼,從而更新min_sort_gap的答案。

再用乙個stl nultiset(s)維護所有相鄰的數的差,以便找到這個最小的差(min_gap)並且還可保證插入乙個數之後將原來已經不再相鄰的結點的差值從s中刪掉。

accode:

#include #include #include #include #include #include #include using std::multiset; using std::min;

const int maxn = 500010;

const int inf = 0x3f3f3f3f;

multiset s, g;

multiset ::iterator iter;

int s[maxn][2]; char str[20];

//用s來記錄初始列表以及在次插入的最後乙個數,

//因為這時其餘的數並不重要。

int min[maxn], n, m, ans = inf;

//用min記錄每個列表內部的最小相鄰差

//(即並不記錄它的末尾與下乙個列表的相鄰差)。

bool flag = 1;

inline int getint()

do res = (res << 3) + (res << 1) + tmp - '0';

while (isdigit(tmp = getchar()));

return sgn ? res : -res;

} //資料中有負數,所以一定要考慮符號。

int main()

if (flag)

//如果此時某一列表的min值已經為0,

//那麼就不插入直接輸出詢問結果。

//更新該列表的min值。

if (i < n)

s.insert(abs((s[i][1] = x) - *s[i + 1]));

//將新得到的該列表尾部與下一列表首部之差加入s,

//一定要保證i不為最後乙個列表才進行此操作。

}flag = flag && min[i];

break;

case 7: printf("%d\n", *s.begin()); break;

case 12: printf("%d\n", ans); break;

}return 0;

}

手打size balanced tree(超時):

#include #include #include #include #include const int maxn = 500010, inf = 0x3f3f3f3f;

class sbt

void zag(int &t)

void maintain(int &t, bool flag)

else return;

}else

else return;

}maintain(lc[t], 0); maintain(rc[t], 1);

maintain(t, 0); maintain(t, 1);

return;

}void ins(int &t, int v)

++sz[t];

if (v < key[t]) ins(lc[t], v);

else ins(rc[t], v);

maintain(t, v >= key[t]);

return;

}int del(int &t, int v)

if (v < key[t]) return del(lc[t], v);

else return del(rc[t], v);

}int pred(int &t, int v, int ans)

int succ(int &t, int v, int ans)

int min(int t)

int max(int t)

public:

sbt(): tot(0), t(0)

void ins(int v)

void del(int v)

int pred(int v)

int succ(int v)

int min()

int max()

} s, g; char str[20];

int s[maxn][2], min[maxn], n, m, ans = inf;

inline int getint()

do res = (res << 3) + (res << 1) + tmp - '0';

while (isdigit(tmp = getchar()));

return sgn ? res : -res;

}int main()

for (int i = 1; i < n; ++i)

s.ins(abs(*s[i] - *s[i + 1]));

memset(min, 0x3f, sizeof min);

bool flag = 1;

for (int i, val, tmp; m; --m)

switch (scanf("%s", str), strlen(str))

if (flag)

if (min[i] < inf) s.del(min[i]);

s.ins(min[i] = tmp);

}s[i][1] = val;

if (i < n) s.ins(abs(val - *s[i + 1]));

}break;

case 7: printf("%d\n", s.min()); break;

case 12: printf("%d\n", ans); break;

}return 0;

}

報表統計 二

設定第乙個圖表集合 11 series series new series test 12 設定圖表型別 13 series.charttype seriescharttype.column 柱狀圖 1415 series.charttype seriescharttype.line 16 設定圖表...

統計報表 sql統計語句

需要資料統計頁面,肯定需要匯出資料,於是,邊學邊寫,完成了一段sql 最早的版本是這樣的 分三條sql查出三種不同的狀態的記錄數 總記錄,未支付,已支付 select count as recordcount from t record where createtime 2019 01 01 00 ...

PTA 詞頻統計 stl

7 11 詞頻統計 25 分 請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入...