锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆愰瑙c戯細棣栧厛鎶婄幆搴忓垪鍒囨柇錛屽彉鎴愪袱鍊嶉暱搴︺傞澶勭悊鎵鏈夊墠 i 欏瑰拰銆?br /> 鏋氫婦璧風偣j錛屼嬌鐢ㄥ崟璋冮槦鍒楁眰鍖洪棿鏈灝忓鹼紝濡傛灉鏈灝忓煎ぇ浜巗um[j]鍒欑瓟妗堝姞涓銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define mp make_pair
15 #define fi first
16 #define se second
17 #define lc(x) (x << 1)
18 #define rc(x) (x << 1 | 1)
19 #define lowbit(x) (x & (-x))
20 #define ll long long
21 #define maxn 1000050
22 int n;
23 int val[maxn];
24 int sum[maxn<<1];
25 int que[maxn<<1], head, tail;
26
27 int main() {
28 while(~scanf("%d", &n)) {
29 if(!n) break;
30 sum[0] = 0;
31 for(int i = 1; i <= n; i++) {
32 scanf("%d", &val[i]);
33 sum[i] = sum[i-1] + val[i];
34 }
35 for(int i = n + 1; i <= 2 * n; i++) {
36 sum[i] = sum[i-1] + val[i-n];
37 }
38 int ans = 0;
39 head = tail = 0;
40 que[tail++] = 0;
41 for(int i = 1; i <= 2 * n; i++) {
42 if(i > n) {
43 while(head < tail && que[head] < i - n - 1) head++;
44 if(sum[que[head]] >= sum[i-n-1]) ans++;
45 }
46 while(head < tail && sum[que[tail-1]] > sum[i]) tail--;
47 que[tail++] = i;
48 }
49 cout << ans << endl;
50 }
51
52 return 0;
53 }
54
銆愰瑙c戯細寰堝鏄撴兂鍒癘(n*k)鐨勫仛娉曪紝浣嗘槸璧よ8瑁哥殑TLE銆?br /> 鍏堟眰鍑烘墍鏈夊墠n欏瑰拰銆?br /> 鏋氫婦姣忎竴涓綅緗?i 浣滀負緇撴潫鐐癸紝鐜板湪鎴戜滑瑕佹壘鍒版渶灝忕殑sum[j], i - k <= j < i .
鏈寸礌鍋氭硶鏄洿鎺ユ灇涓綩(k)錛屾敼榪涗竴鐐圭殑鍋氭硶鏄敤綰挎鏍戞煡璇㈠尯闂存渶澶у糘(logk).
浣嗘槸鍙互璇佹槑鏈夊崟璋冩э紝鏁呭彲浠ョ敤鍗曡皟闃熷垪浼樺寲錛屾煡璇㈢洿鎺ヤ紭鍖栧埌O(1)銆?br /> 鎵浠ユ渶緇堝鏉傚害鏄疧(n)銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define mp make_pair
15 #define fi first
16 #define se second
17 #define lc(x) (x << 1)
18 #define rc(x) (x << 1 | 1)
19 #define lowbit(x) (x & (-x))
20 #define ll long long
21 #define maxn 100050
22 const int inf = 1 << 30;
23 int que[maxn<<1], head, tail;
24 int sum[maxn<<1];
25 int val[maxn];
26 int n, k;
27 int ans, s, t;
28 int main() {
29 int T;
30 scanf("%d", &T);
31 while(T--) {
32 scanf("%d%d", &n, &k);
33 sum[0] = 0;
34 for(int i = 1; i <= n; i++) {
35 scanf("%d", &val[i]);
36 sum[i] = val[i] + sum[i-1];
37 }
38 for(int i = n + 1; i <= 2 * n; i++) {
39 sum[i] = sum[i-1] + val[i-n];
40 }
41 ans = -inf;
42 head = tail = 0;
43 que[tail++] = 0;
44 for(int i = 1; i <= 2 * n; i++) {
45 while(head < tail && que[head] < i - k) head++;
46 if(ans < sum[i] - sum[que[head]]) {
47 ans = sum[i] - sum[que[head]];
48 s = que[head] + 1, t = i;
49 }
50 while(head < tail && sum[que[tail-1]] > sum[i]) tail--;
51 que[tail++] = i;
52 }
53 if(s > n) s -= n;
54 if(t > n) t -= n;
55 cout << ans << " " << s << " " << t << endl;
56 }
57 return 0;
58 }
59
A x y 璇㈤棶 x y鐨勫叧緋匯?br /> 鍏崇郴鏈変笁縐嶏細1.Not sure yet. 2.In different gangs. 3.In the same gangs.
緇欏嚭m涓搷浣滐紝鍥炵瓟鎵鏈夎闂?br />
銆愰瑙c戯細騫舵煡闆嗛鐩紝鍙槸鎯充笉鍑烘潵錛岀粰闃熷弸鐐規槑浜嗐?br /> 瀵逛簬姣忎釜浜猴紝鎷嗙偣x x’銆?br /> 瀵逛簬D x y榪欎釜鎿嶄綔,鎶妜鍜寉’鎵鍦ㄧ殑鍒嗛噺鍚堝茍錛寈’鍜寉鎵鍦ㄧ殑鍒嗛噺鍚堝茍銆?br /> 瀵逛簬A x y榪欎釜璇㈤棶,
濡傛灉find(x) == find(y)錛屽垯浠栦滑灞炰簬鍚屼竴涓府媧撅紱
鍚﹀垯錛屽鏋渇ind(x) == find(y')錛屼粬浠睘浜庝笉鍚屽府媧撅紱
鍚﹀垯錛屼粬浠殑鍏崇郴涓嶇‘瀹氥?br />
鏈濂藉湪綰鎬笂鐢諱笅鍥撅紝榪欐牱姣旇緝瀹規槗鐞嗚В銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define maxn 200050
19 int n, m;
20 int fa[maxn];
21
22 void init() {
23 for(int i = 0; i < maxn; i++) fa[i] = i;
24 }
25
26 int find(int x) {
27 if(x != fa[x]) return fa[x] = find(fa[x]);
28 return fa[x];
29 }
30
31 bool un(int a, int b) {
32 a = find(a), b = find(b);
33 if(a == b) return false;
34 fa[a] = b;
35 return true;
36 }
37
38 int main() {
39 int T, a, b;
40 char op[5];
41 scanf("%d", &T);
42 while(T--) {
43 init();
44 scanf("%d%d", &n, &m);
45 for(int i = 0; i < m; i++) {
46 scanf("%s%d%d", op, &a, &b);
47 if(op[0] == 'A') {
48 if(find(a) == find(b)) printf("In the same gang.\n");
49 else if(find(a) == find(b+n)) printf("In different gangs.\n");
50 else printf("Not sure yet.\n");
51 } else {
52 un(a, b + n), un(a + n, b);
53 }
54 }
55 }
56 return 0;
57 }
58
銆愰瑙c戯細妯℃澘棰樸?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 using namespace std;
11 #define pb push_back
12 #define lc(x) (x << 1)
13 #define rc(x) (x << 1 | 1)
14 #define lowbit(x) (x & (-x))
15 #define ll long long
16 #define maxn 10005
17 vector<int> tree[maxn], Q[maxn];
18 int in[maxn], n;
19 bool visit[maxn];
20 int fa[maxn];
21
22 void init() {
23 for(int i = 0; i <= n; i++) fa[i] = i, tree[i].clear(), Q[i].clear();
24 memset(visit, false, sizeof(visit));
25 memset(in, 0, sizeof(in));
26 }
27
28 int find(int x) {
29 if(x == fa[x]) return x;
30 else return fa[x] = find(fa[x]);
31 }
32
33 bool un(int a, int b) {
34 a = find(a), b = find(b);
35 if(a == b) return false;
36 fa[b] = a;
37 return true;
38 }
39
40 void Tarjan(int u) {
41 int size = tree[u].size();
42 for(int i = 0; i < size; i++) {
43 Tarjan(tree[u][i]);
44 un(u, tree[u][i]);
45 }
46 visit[u] = true, size = Q[u].size();
47 for(int i = 0; i < size; i++) {
48 if(visit[Q[u][i]]) {
49 printf("%d\n", find(Q[u][i]));
50 return;
51 }
52 }
53 }
54
55 int main() {
56 int T, u, v;
57 scanf("%d", &T);
58 while(T--) {
59 scanf("%d", &n);
60 init();
61 for(int i = 0; i < n - 1; i++) {
62 scanf("%d%d", &u, &v);
63 tree[u].pb(v);
64 in[v]++;
65 }
66 scanf("%d%d", &u, &v);
67 Q[u].pb(v), Q[v].pb(u);
68 int root = -1;
69 for(int i = 1; i <= n; i++) {
70 if(in[i] == 0) {
71 root = i;
72 break;
73 }
74 }
75 Tarjan(root);
76 }
77 return 0;
78 }
79
銆愰瑙c戯細綰挎鏍戯紝緇存姢綰挎鏍戠殑鍖洪棿涓篬1, min(h,n)]錛屽洜涓烘渶鍧忔儏鍐典篃灝變竴琛岃創涓涓紝鎵浠ュ悗闈㈢殑鏄浣欑殑銆?br /> 鍥犱負鏌ヨ鍜屾洿鏂版槸鍚屾椂鐨勶紝鎵浠ユ垜鍐欏湪涓璧蜂簡銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 using namespace std;
11 #define pb push_back
12 #define lc(x) (x << 1)
13 #define rc(x) (x << 1 | 1)
14 #define lowbit(x) (x & (-x))
15 #define ll long long
16 #define MAX 200050
17 int sum[MAX<<2];
18 int h, w, n;
19
20 void pushup(int p) {
21 sum[p] = max(sum[lc(p)], sum[rc(p)]);
22 }
23
24 void build(int l, int r, int p) {
25 sum[p] = w;
26 if(l == r) return;
27 int mid = (l + r) >> 1;
28 build(l, mid, lc(p));
29 build(mid + 1, r, rc(p));
30 }
31
32 int query(int L, int l, int r, int p) {
33 if(l == r) {
34 sum[p] -= L; // 鎵懼埌鏈浼樹綅緗茍鏇存柊
35 return l;
36 }
37 int mid = (l + r) >> 1, ans = -1;
38 if(L <= sum[lc(p)]) ans = query(L, l, mid, lc(p));
39 else ans = query(L, mid + 1, r, rc(p));
40 pushup(p);
41 return ans;
42 }
43
44 int main() {
45 int L;
46 while(~scanf("%d%d%d", &h, &w, &n)) {
47 if(h > n) h = n;
48 build(1, h, 1);
49 for(int i = 0; i < n; i++) {
50 scanf("%d", &L);
51 if(sum[1] < L) printf("-1\n");
52 else printf("%d\n", query(L, 1, h, 1));
53 }
54 }
55 return 0;
56 }
57
銆愰瑙c戯細鍙互鍒╃敤鏍戠姸鏁扮粍鎴栬呯嚎孌墊爲鍦∣(nlogn)鏃墮棿閲屾眰鍑哄垵濮嬪簭鍒楃殑閫嗗簭瀵癸紝鐒跺悗姣忔鐢∣(1)鐨勬椂闂存帹鍑烘瘡縐誨姩涓涓暟鍒板簭鍒楀悗闈箣鍚庣殑閫嗗簭瀵廣?br /> 鎬誨鏉傚害O(nlogn + n)銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 using namespace std;
10 #define pb push_back
11 #define lc(x) (x << 1)
12 #define rc(x) (x << 1 | 1)
13 #define lowbit(x) (x & (-x))
14 #define ll long long
15 #define maxn 5005
16 const int inf = 1 << 30;
17 int sum[maxn], n, val[maxn];
18
19 void update(int x) {
20 for(int i = x; i < maxn; i += lowbit(i))
21 sum[i]++;
22 }
23
24 int SUM(int x) {
25 int res = 0;
26 for(int i = x; i; i -= lowbit(i))
27 res += sum[i];
28 return res;
29 }
30
31 int main() {
32 while(~scanf("%d", &n)) {
33 memset(sum, 0, sizeof(sum));
34 int ans = inf, tmp = 0;
35 for(int i = 0; i < n; i++) {
36 scanf("%d", &val[i]);
37 tmp += SUM(n) - SUM(val[i]);
38 update(val[i]+1);
39 }
40 for(int i = 0; i < n - 1; i++) {
41 tmp += n - 2 * val[i] - 1;
42 ans = min(ans, tmp);
43 }
44 cout << ans << endl;
45 }
46 return 0;
47 }
48
銆愰瑙c戯細榪樻槸綰挎鏍戠殑鍏ラ棬棰樼洰錛屽嚟鑷繁鐨勭悊瑙h8鎵撲簡涓嬈$嚎孌墊爲錛屽寤惰繜鏍囪鐞嗚В寰楁洿閫忓垏浜嗐?br /> 娉ㄦ剰瑕佺敤long long.
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 using namespace std;
8 #define pb push_back
9 #define lc(x) (x << 1)
10 #define rc(x) (x << 1 | 1)
11 #define lowbit(x) (x & (-x))
12 #define MAX 100050
13 #define ll long long
14 ll lazy[MAX<<2], sum[MAX<<2];
15 int n, q;
16
17 void pushup(int p) {
18 sum[p] = sum[lc(p)] + sum[rc(p)];
19 }
20
21 void pushdown(int p, int len) {
22 if(lazy[p]) {
23 lazy[lc(p)] += lazy[p];
24 lazy[rc(p)] += lazy[p];
25 sum[lc(p)] += (len - (len >> 1)) * lazy[p];
26 sum[rc(p)] += (len >> 1) * lazy[p];
27 lazy[p] = 0;
28 }
29 }
30
31 void build(int l, int r, int p) {
32 lazy[p] = 0;
33 if(l == r) {
34 scanf("%lld", &sum[p]);
35 return;
36 }
37 int mid = (l + r) >> 1;
38 build(l, mid, lc(p));
39 build(mid + 1, r, rc(p));
40 pushup(p);
41 }
42
43 void update(int L, int R, ll c, int l, int r, int p) {
44 if(L <= l && r <= R) {
45 lazy[p] += c;
46 sum[p] += c * (r - l + 1);
47 return;
48 }
49 pushdown(p, r - l + 1);
50 int mid = (l + r) >> 1;
51 if(L <= mid) update(L, R, c, l, mid, lc(p));
52 if(R > mid) update(L, R, c, mid + 1, r, rc(p));
53 pushup(p);
54 }
55
56 ll query(int L, int R, int l, int r, int p) {
57 ll res = 0;
58 if(L <= l && r <= R) {
59 return sum[p];
60 }
61 pushdown(p, r - l + 1);
62 int mid = (l + r) >> 1;
63 if(L <= mid) res += query(L, R, l, mid, lc(p));
64 if(R > mid) res += query(L, R, mid + 1, r, rc(p));
65 pushup(p);
66 return res;
67 }
68
69 int main() {
70 char str[5];
71 int a, b;
72 ll c;
73 while(~scanf("%d%d", &n, &q)) {
74 build(1, n, 1);
75 while(q--) {
76 scanf("%s%d%d", str, &a, &b);
77 if(str[0] == 'Q') printf("%lld\n", query(a, b, 1, n, 1));
78 else {
79 scanf("%lld", &c);
80 update(a, b, c, 1, n, 1);
81 }
82 }
83 }
84 return 0;
85 }
銆愰瑙c戯細綰挎鏍戯紝鍖洪棿鏇挎崲錛屽尯闂存煡璇€?br /> 鍒濆綰挎鏍戯紝鐞嗚В寤惰繜鏍囪鏄叧閿?br /> 鏈姣旇緝鐗規畩錛屾煡璇㈠彧鏈変竴嬈★紝鑰屼笖鏄煡璇㈡暣涓尯闂達紝杈撳嚭stick[1]鍗沖彲銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 using namespace std;
8 #define pb push_back
9 #define lc(x) (x << 1)
10 #define rc(x) (x << 1 | 1)
11 #define MAX 100005
12 int stick[MAX<<2], n, m;
13 int lazy[MAX<<2];
14
15 void pushup(int p) {
16 stick[p] = stick[lc(p)] + stick[rc(p)];
17 }
18
19 void pushdown(int p, int len) {
20 if(lazy[p]) {
21 lazy[lc(p)] = lazy[rc(p)] = lazy[p];
22 stick[lc(p)] = (len - (len >> 1)) * lazy[p];
23 stick[rc(p)] = (len >> 1) * lazy[p];
24 lazy[p] = 0;
25 }
26 }
27
28 void build(int l, int r, int p) {
29 lazy[p] = 0;
30 if(l == r) {
31 stick[p] = 1;
32 return;
33 }
34 int mid = (l + r) >> 1;
35 build(l, mid, lc(p));
36 build(mid + 1, r, rc(p));
37 pushup(p);
38 }
39
40 void update(int L, int R, int c, int l, int r, int p) {
41 if(L <= l && r <= R) {
42 lazy[p] = c;
43 stick[p] = c * (r - l + 1);
44 return;
45 }
46 pushdown(p, r - l + 1);
47 int mid = (l + r) >> 1;
48 if(L <= mid) update(L, R, c, l, mid, lc(p));
49 if(R > mid) update(L, R, c, mid + 1, r, rc(p));
50 pushup(p);
51 }
52
53 int main() {
54 int T, Case = 1;
55 int x, y, z;
56 scanf("%d", &T);
57 while(T--) {
58 scanf("%d%d", &n, &m);
59 build(1, n, 1);
60 while(m--) {
61 scanf("%d%d%d", &x, &y, &z);
62 update(x, y, z, 1, n, 1);
63 }
64 printf("Case %d: The total value of the hook is %d.\n", Case++, stick[1]);
65 }
66 return 0;
67 }
68
銆愰瑙c戯細鏁版嵁緇撴瀯棰樼洰錛岀嚎孌墊爲縐掍簡錛屼笉鐭ラ亾鏍戠姸鏁扮粍琛屼笉琛屻?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 using namespace std;
8 #define pb push_back
9 #define MAX 200050
10 #define lc(x) (x << 1)
11 #define rc(x) (x << 1 | 1)
12 const int inf = 1 << 30;
13 int grade[MAX<<2], n, m;
14
15 void pushup(int p) {
16 grade[p] = max(grade[lc(p)], grade[rc(p)]);
17 }
18
19 void build(int l, int r, int p) {
20 if(l == r) {
21 scanf("%d", &grade[p]);
22 return;
23 }
24 int mid = (l + r) >> 1;
25 build(l, mid, lc(p));
26 build(mid + 1, r, rc(p));
27 pushup(p);
28 }
29
30 int query(int L, int R, int l, int r, int p) {
31 int res = -inf;
32 if(L == l && R == r) return grade[p];
33 int mid = (l + r) >> 1;
34 if(L > mid) res = max(res, query(L, R, mid + 1, r, rc(p)));
35 else if(R <= mid) res = max(res, query(L, R, l, mid, lc(p)));
36 else res = max(res, max(query(L, mid, l, mid, lc(p)), query(mid + 1, R, mid + 1, r, rc(p))));
37 return res;
38 }
39
40 void update(int x, int val, int l, int r, int p) {
41 if(l == r) {
42 grade[p] = val;
43 return;
44 }
45 int mid = (l + r) >> 1;
46 if(x <= mid) update(x, val, l, mid, lc(p));
47 else update(x, val, mid + 1, r, rc(p));
48 pushup(p);
49 }
50
51 int main() {
52 int a, b;
53 char str[10];
54 while(~scanf("%d%d", &n, &m)) {
55 build(1, n, 1);
56 while(m--) {
57 scanf("%s%d%d", str, &a, &b);
58 if(str[0] == 'Q') printf("%d\n", query(a, b, 1, n, 1));
59 else update(a, b, 1, n, 1);
60 }
61 }
62 return 0;
63 }
銆愰瑙c戯細寰堢畝鍗曠殑涓閬撴暟鎹粨鏋勯鐩?br /> 榪欑棰樼洰濡傛灉鑳界敤鏍戠姸鏁扮粍鏈濂藉氨鐢紝鍥犱負鏍戠姸鏁扮粍澶鏄撳啓浜嗐?br /> 鏈榪戝湪瀛︾嚎孌墊爲錛屾墍浠ヤ袱縐嶇増鏈殑閮藉啓浜嗕竴嬈°?br />
銆愪唬鐮併戯細
銆愭爲鐘舵暟緇勩戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 using namespace std;
8 #define pb push_back
9 #define maxn 50005
10 #define lowbit(x) (x & (-x))
11 int val[maxn], n;
12
13 void add(int x, int e) {
14 for(int i = x; i < maxn; i += lowbit(i)) {
15 val[i] += e;
16 }
17 }
18
19 int sum(int x) {
20 int res = 0;
21 for(int i = x; i; i -= lowbit(i)) {
22 res += val[i];
23 }
24 return res;
25 }
26
27 int main() {
28 int T, Case = 1, e, a, b;
29 char str[10];
30 scanf("%d", &T);
31 while(T--) {
32 scanf("%d", &n);
33 memset(val, 0, sizeof(val));
34 for(int i = 1; i <= n; i++) {
35 scanf("%d", &e);
36 add(i, e);
37 }
38 printf("Case %d:\n", Case++);
39 while(1) {
40 scanf("%s", str);
41 if(str[0] == 'E') break;
42 else {
43 scanf("%d%d", &a, &b);
44 if(str[0] == 'Q') printf("%d\n", sum(b) - sum(a - 1));
45 else if(str[0] == 'A') add(a, b);
46 else add(a, -b);
47 }
48 }
49 }
50 return 0;
51 }
銆愮嚎孌墊爲銆戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 using namespace std;
8 #define pb push_back
9 #define lc(x) (x << 1)
10 #define rc(x) (x << 1 | 1)
11 #define MAX 50005
12 int seg[MAX<<2];
13 int n;
14 void pushup(int p) {
15 seg[p] = seg[lc(p)] + seg[rc(p)];
16 }
17
18 void build(int l, int r, int p) {
19 if(l == r) {
20 scanf("%d", &seg[p]);
21 return;
22 }
23 int mid = (l + r) >> 1;
24 build(l, mid, lc(p));
25 build(mid + 1, r, rc(p));
26 pushup(p);
27 }
28
29 int query(int L, int R, int l, int r, int p) {
30 if(L == l && R == r) return seg[p];
31 int mid = (l + r) >> 1;
32 if(L > mid) return query(L, R, mid + 1, r, rc(p));
33 else if(R <= mid) return query(L, R, l, mid, lc(p));
34 else return query(L, mid, l, mid, lc(p)) + query(mid + 1, R, mid + 1, r, rc(p));
35 }
36
37 void update(int x, int val, int l, int r, int p) {
38 if(l == r) {
39 seg[p] += val;
40 return;
41 }
42 int mid = (l + r) >> 1;
43 if(x <= mid) update(x, val, l, mid, lc(p));
44 else update(x, val, mid + 1, r, rc(p));
45 pushup(p);
46 }
47
48 int main() {
49 int T, Case = 1, a, b;
50 char str[10];
51 scanf("%d", &T);
52 while(T--) {
53 scanf("%d", &n);
54 build(1, n, 1);
55 printf("Case %d:\n", Case++);
56 while(1) {
57 scanf("%s", str);
58 if(str[0] == 'E') break;
59 else {
60 scanf("%d%d", &a, &b);
61 if(str[0] == 'Q') printf("%d\n", query(a, b, 1, n, 1));
62 else if(str[0] == 'A') update(a, b, 1, n, 1);
63 else update(a, -b, 1, n, 1);
64 }
65 }
66 }
67 return 0;
68 }
銆愰瑙c戯細鍗曡皟闃熷垪鍏ラ棬棰樸?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 using namespace std;
5 #define maxn 1000500
6 int n, k, val;
7 int maxx[maxn], minn[maxn];
8 int head1, tail1, head2, tail2, tot;
9 struct Drab {
10 int val, idx;
11 Drab(){}
12 Drab(int _val, int _idx) {
13 val = _val, idx = _idx;
14 }
15 }que1[maxn], que2[maxn];
16
17 void init() {
18 tot = 0;
19 head1 = tail1 = head1 = tail1 = 0;
20 }
21
22 void push1(int val, int idx) {
23 while(head1 < tail1 && que1[tail1 - 1].val > val) tail1--;
24 que1[tail1++] = Drab(val, idx);
25 }
26
27 void push2(int val, int idx) {
28 while(head2 < tail2 && que2[tail2 - 1].val < val) tail2--;
29 que2[tail2++] = Drab(val, idx);
30 }
31
32 int main() {
33 while(~scanf("%d%d", &n, &k)) {
34 init();
35 for(int i = 0; i < n; i++) {
36 scanf("%d", &val);
37 push1(val, i), push2(val, i);
38 if(i >= k - 1) {
39 if(que1[head1].idx <= i - k) head1++;
40 minn[tot] = que1[head1].val;
41 if(que2[head2].idx <= i - k) head2++;
42 maxx[tot] = que2[head2].val;
43 tot++;
44 }
45 }
46 for(int i = 0; i < tot; i++) printf("%d ", minn[i]);
47 printf("\n");
48 for(int i = 0; i < tot; i++) printf("%d ", maxx[i]);
49 printf("\n");
50 }
51 return 0;
52 }
銆愰瑙c戯細棰樻剰寰堝ソ鐞嗚В錛岃繖閲屽彲浠ョ洿鎺ョ敤stl 鐨?priority queue錛屼唬鐮佽秴綰х煭銆傜淮鎶や竴涓紭鍏堥槦鍒楋紝浣塊槦鍒椾腑鍏冪礌涓暟鎬諱笉瓚呰繃k錛屾煡璇㈡椂鐩存帴杈撳嚭鍫嗛《鍏冪礌鍗沖彲銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "queue"
5 #include "functional"
6 #include "string"
7 using namespace std;
8 int n, k;
9 void solve() {
10 int val;
11 string s;
12 priority_queue<int, vector<int>, greater<int> > que;
13 for(int i = 0; i < n; i++) {
14 cin >> s;
15 if(s[0] == 'I') {
16 scanf("%d", &val);
17 que.push(val);
18 if(que.size() > k) que.pop();
19 } else cout << que.top() << endl;
20 }
21 }
22
23 int main() {
24 while(~scanf("%d%d", &n, &k)) solve();
25 return 0;
26 }