[coj0989]wzj的資料結構(負十一)
試題描述
給出以下定義:
1.若子串行[l,r]的極差(最大值-最小值)<=m,則子串行[l,r]為乙個均勻序列。
2.均勻序列[l,r]的權值為sum(l,r)即序列的元素和。
現在給你乙個長度為n的整數序列a,請你求出權值前k大的均勻序列,輸出k行為它們的權值。
輸入
第一行為兩個整數n,m,k。
第二行為n個整數ai。
輸出
輸出k行,第i行為第i大的均勻序列的權值。
輸入示例
93105135
8669
10
輸出示例
292521
2019
1915
1413
12
資料規模及約定
1<=n,k<=100000
0<=|ai|,m<=10^9
保證原序列至少有k個均勻序列
題解
如果確定了乙個區間的左端點 x,那麼顯然對於均勻序列 [x, y],y 一定在區間 [l, r] 內。於是我們記狀態 (x, l, r, v) 表示左端點為 x,右端點在 [l, r] 內,且最大的均勻序列權值為 v,那麼我們可以預處理出對於所有的 i,(i, i, r, v) 這個狀態,把它扔進堆裡,然後每從堆頂取乙個元素 (x, l, r, v),我們可以用 rmq 找到最優的右端點 p(即 s[p] - s[x-1] = v,s 為字首和),使得 p 在 [l, r] 中,那麼就輸出這個 v,然後把 (x, l, p - 1, v') 和 (x, p + 1, r, v'') 放入堆中(其中 v' 和 v'' 都可以由求區間內最大字首和得到),進行 k 次即可。
#include #include #include #include #include #include #include #include #include #include #include using namespace std;const int buffersize = 1 << 16;
char buffer[buffersize], *head, *tail;
inline char getchar()
return *head++;
}int read()
while(isdigit(c))
return x * f;
}#define maxn 100010
#define maxlog 21
#define ll long long
int n, m, k;
ll s[maxn], a[maxn];
ll mx2[maxlog][maxn];
int mx[maxlog][maxn], mn[maxlog][maxn], log[maxn], mxp[maxlog][maxn];
void rmq_init()
int qmn(int l, int r)
struct node
} ;priority_queue q;
int r[maxn];
int main() );
} for(int i = 1; i <= n; i++) if(!r[i]) r[i] = r[i-1];
for(nl = 1; nl <= n; nl++) );
// printf("%d %d %lld\n", nl, r[nl], tmp);
} while(k--) );
if(p < u.r) q.push((node)); }
return 0;
}
COJ1013 WZJ的資料結構(十三)
這道題有這樣乙個解法 首先把邊依次加到圖中,若當前這條邊與圖中的邊形成了環,那麼把這個環中最早加進來的邊彈出去 並將每條邊把哪條邊彈了出去記錄下來 ntr i j,特別地,要是沒有彈出邊,ntr i 0 這個顯然是可以用lct來弄的對吧。然後對於每個詢問,我們的答案就是對l r中ntr小於l的邊求和...
COJ0985 WZJ的資料結構(負十五)
coj0985 wzj的資料結構 負十五 試題描述 chx有乙個問題想問問大家。給你乙個長度為n的數列a,請你找到兩個位置l,r,使得a l a l 1 a r 中沒有重複的數,輸出r l 1的最大值。以上是附中聯賽加試的一道題。wzj覺得這道題太水了,改了改題目 wzj有乙個問題想問問大家。給你乙...
COJ 1003 WZJ的資料結構(三)ST表
wzj的資料結構 三 難度級別 b 執行時間限制 3000ms 執行空間限制 51200kb 長度限制 2000000b 試題描述 請你設計乙個資料結構,完成以下功能 給定乙個大小為n的整數組a,m次詢問。每次詢問給你i,j兩個引數,求ai至aj中最大的數。輸入第一行為兩個正整數n,m。第二行為n個...