BZOJ-3110-K大数查询-ZJOI2013-暴力
生活随笔
收集整理的這篇文章主要介紹了
BZOJ-3110-K大数查询-ZJOI2013-暴力
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
描述
有N個(gè)位置,M個(gè)操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個(gè)位置到第b個(gè)位置,每個(gè)位置加入一個(gè)數(shù)c
如果是2 a b c形式,表示詢問從第a個(gè)位置到第b個(gè)位置,第C大的數(shù)是多少。
分析
- 暴力的做法, 正解是?樹套樹或者zkw線段樹 我現(xiàn)在只想說是整體二分...
- 讀入所有的命令, 把所有的插入命令收集起來處理, 按照插入的數(shù)值的大小從大到小 (相等時(shí)按先后順序) 排序.
- 按照先后順序遍歷命令. 如果是插入命令, 標(biāo)記該插入已經(jīng)生效; 否則如果是查詢命令, 從前到后遍歷插入命令, 如果當(dāng)前的插入命令已經(jīng)生效, 則更改查詢的排名, 具體怎么更改就是減去重合區(qū)間長(zhǎng)度
- 如果更改后排名小于等于0, 第C大就是當(dāng)前的插入操作所插入的值.
- 既然暴力可以, 就不用寫二維線段樹了. 比賽時(shí)善于利用STL來暴力是個(gè)很好的辦法.
- 但是暴力也有技巧
代碼
#include #include #include using namespace std; const int maxn = 50000 + 10;struct opt {int i, k, a, b, c;bool operator < (const opt& rhs) const {if(c == rhs.c) return i < rhs.i;return c > rhs.c;} }A[maxn];vectorT; int ID[maxn]; bool ins[maxn];int main() {int n, m;scanf("%d %d", &n, &m);for(int i = 1; i <= m; i++) {int k, a, b, c;scanf("%d %d %d %d", &k, &a, &b, &c);A[i] = (opt){i, k, a, b, c};if(k == 1) T.push_back(A[i]);}sort(T.begin(), T.end());for(int i = 0; i < T.size(); i++) ID[T[i].i] = i;for(int i = 1; i <= m; i++)if(A[i].k == 1) ins[ID[i]] = 1;else {int j, c = 0;for(j = 0; j < T.size(); j++) if(ins[j]) {int len = min(A[i].b, T[j].b) - max(A[i].a, T[j].a) + 1;if(len <= 0) continue;if((c += len) >= A[i].c) break;}printf("%d\n", T[j].c);}return 0; } [1, 2] insert 1 [1, 2] insert 2 [1, 1] query 2nd [1, 1] query 1st [1, 1] query 3rdArray ins 1. [1, 2] insert 2 2. [1, 2] insert 1in order: [1, 2] insert 1 ==> 2 : new id ==> used[2] = 1 [1, 2] insert 2 ==> 1 : new id ==> used[1] = 1 [1, 1] query 2nd ==>k = 0for all i in insif(used[ins[i]]) k += bin = length of intervalif k >= c ==> ans
總結(jié)
以上是生活随笔為你收集整理的BZOJ-3110-K大数查询-ZJOI2013-暴力的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ-2190-仪仗队-SDOI20
- 下一篇: BZOJ-2440-完全平方数-中山市选