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個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入...