ATcoder就是天下第一大毒瘤.....老是會在輸出上卡死你...ide
以前由於換行而沒過,這回TM是沒換行沒過...毒瘤致死。spa
題意:屢次求區間內一個數的出現次數與本身值的乘積的最大值。code
解:莫隊。blog
發現刪除操做很很差搞,乾脆不刪除了。string
那麼對於每一個塊,全部左端點在該塊內的詢問,右端點是單增的。這個顯然沒有刪除。it
左端點咱們每次都暴力加就好了。總時間複雜度仍是n1.5。io
具體來講,咱們先暴力處理兩端點都在這個塊內的詢問,對於接下來的詢問,先把右端點搞好,而後記錄答案。event
暴力加左端點。記錄答案,以後還原。ast
參考代碼實現。class
1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 #include <cstring> 5 6 typedef long long LL; 7 const int N = 100010; 8 9 int fr[N], a[N], bin[N], X[N], bin2[N]; 10 LL ans; 11 12 struct ASK { 13 int l, r, t; 14 LL ans; 15 inline bool operator <(const ASK &w) const { 16 if(fr[l] != fr[w.l]) { 17 return l < w.l; 18 } 19 return r < w.r; 20 } 21 }ask[N]; 22 23 inline bool cmp(const ASK &A, const ASK &B) { 24 return A.t < B.t; 25 } 26 27 inline void add(int x) { 28 bin[a[x]]++; 29 ans = std::max(ans, 1ll * bin[a[x]] * X[a[x]]); 30 return; 31 } 32 33 inline void del(int x) { 34 bin[a[x]]--; 35 return; 36 } 37 38 int main() { 39 int n, q; 40 scanf("%d%d", &n, &q); 41 int T = sqrt(n); 42 for(int i = 1; i <= n; i++) { 43 scanf("%d", &a[i]); 44 fr[i] = (i - 1) / T + 1; 45 X[i] = a[i]; 46 } 47 for(int i = 1; i <= q; i++) { 48 scanf("%d%d", &ask[i].l, &ask[i].r); 49 ask[i].t = i; 50 } 51 std::sort(ask + 1, ask + q + 1); 52 std::sort(X + 1, X + n + 1); 53 int temp = std::unique(X + 1, X + n + 1) - X - 1; 54 for(int i = 1; i <= n; i++) { 55 a[i] = std::lower_bound(X + 1, X + temp + 1, a[i]) - X; 56 } 57 58 for(int i = 1; i <= q; ) { 59 if(fr[ask[i].l] != fr[ask[i - 1].l]) { // new 60 memset(bin, 0, sizeof(bin)); 61 ans = 0; 62 int p = fr[ask[i].l]; 63 for(; p == fr[ask[i].r]; i++) { 64 for(int j = ask[i].l; j <= ask[i].r; j++) { 65 add(j); 66 } 67 ask[i].ans = ans; 68 for(int j = ask[i].l; j <= ask[i].r; j++) { 69 del(j); 70 } 71 ans = 0; 72 } 73 int l = p * T; 74 int r = l + 1; 75 add(r); 76 LL lastans; 77 for(; fr[ask[i].l] == p; i++) { 78 while(r < ask[i].r) { 79 add(++r); 80 } 81 lastans = ans; 82 for(int j = ask[i].l; j <= l; j++) { 83 add(j); 84 } 85 ask[i].ans = ans; 86 ans = lastans; 87 for(int j = ask[i].l; j <= l; j++) { 88 del(j); 89 } 90 } 91 } 92 } 93 94 std::sort(ask + 1, ask + q + 1, cmp); 95 for(int i = 1; i <= q; i++) { 96 printf("%lld\n", ask[i].ans); 97 } 98 99 return 0; 100 }