分塊 列舉 enum 鍊錶

2021-08-17 06:36:18 字數 2136 閱讀 8500

有一列整數,共n個。每次可以對這些整數有兩種操作:

(1)第i個到第j個整數分別加上數p;

(2)詢問這些數中比t小的數的個數。

第一行有兩個數,n和m(1≤n≤100000,m≤10000),表示數的個數和運算元。

第二行n個整數,表示每個數的初始值。

以後m行,每行開始乙個數q。若q為1,則後面跟三個數:i和j(i≤j)表示兩個下標,p(-1000≤p≤1000)表示修改的數;若q為2,則為詢問操作,後面跟乙個數t。

對每個詢問操作輸出數列中比t小的數的個數。

首先說明,大佬們看到這兩種操作,很快就會想到線段樹和平衡樹,所以這道題也可以用樹套樹做。

可是本蒟蒻不會啊,無奈又找不到題解,於是在棄療一周以後再次翻出來打,居然ac了!用的是非常淳樸的分塊暴力。鍊錶非常zz,其實根本都可以不用,因為沒有插入和刪除的動作(而這道題中每個數的值與標號是無關的,而我們的判斷肯定會先分塊排好序,所以如果要分鍊錶,是無法實現的)。

這道題我們可以按標號公升序建立n−

−√n

個塊,在每個塊中把每個數公升序排序(這個操作我是用歸併寫的)。

對於修改操作,如果覆蓋了整個塊,我們直接加lazy標記,如果是一部分,遍歷整個塊,找出對應的數修改,再重新排序(是的,你沒有看錯,就是這麼暴力).

對於查詢操作,同上,若覆蓋整個塊,就把答案加上這個塊的大小,若是一部分,我們就用lower_bound找到第乙個大於等於t的數的位置,因為是公升序排,然後直接加就好了。

等本蒟蒻學會了樹套樹,就來補**!

#include

#include

#include

#include

#include

#include

#include

#define zz 300//每個塊的大小

using namespace std;

const int n=1e5+10;

const int m=2e4+10;

int n,m,cnt;

int v[n];//把每個位置上的值單獨存乙個陣列以便lower_bound查詢

struct nodea[n],qw[n];

struct pt[n];

inline int

read()

while(c>='0' && c<='9')

return

x*t;

}inline void merge(int l,int r,int mid)

else

}while(i<=mid) qw[k++]=a[i++];

while(j<=r) qw[k++]=a[j++];

for(int i=0;iqw[i];

}inline void sor(int l,int r)

}inline void pre()

else

t[cnt].siz=t[cnt].r-t[cnt].l+1;

sor(t[cnt].l,t[cnt].r);

for(int i=t[cnt].l;i<=t[cnt].r;i++)

v[i]=a[i].val;

ty-=zz;

}}inline int query(int

q) if(v[t[p].r]+t[p].tagint f=lower_bound(v+t[p].l,v+1+t[p].r,q-t[p].tag)-v;

ans+=f-t[p].l;

p=t[p].to;

}return ans;

}inline void change(int l,int r,int ad)

}sor(t[p].l,t[p].r);

for(int i=t[p].l;i<=t[p].r;i++)

v[i]=a[i].val;

p=t[p].to;

}while(t[p].l>=l && t[p].r<=r)

if(t[p].l<=r)

}sor(t[p].l,t[p].r);

for(int i=t[p].l;i<=t[p].r;i++)

v[i]=a[i].val;

}}int main()else

}return

0;}

列舉enum學習

enum enumeration name chongqi 3 以上簡單地按區域,將五個城市按照華南 4 華東 2 華北 3 的幾個城市分類了。4 列舉變數的定義 初始化和賦值 至於列舉可以當作特定的整型數來用的例子,從open modes可以體會。7 自定義運算子 列舉是使用者自定義型別,所以在使...

列舉 enum 總結

題外話 enum的訪問,直接寫欄位名就可以訪問 需注意作用域 區別於結構體 結構體變數.欄位名 如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆盒中...

列舉型別(enum)

enum 是計算機程式語言中的一種資料型別 列舉型別。應用場景 有些變數的取值被要求在乙個確定的範圍內,例如一周有 7天,一年 12個月,或者使用者自定義的今天安排要學習的百家姓有 4個等等。定義 在列舉型別的定義中列舉出所有的可能取值,該變數的取值只能是所列舉的範圍。格式 enum 列舉名 enu...