POI2015 LOG(樹狀陣列)

2022-04-30 00:00:12 字數 1438 閱讀 3157

今天考試考了這題,所以來貢獻\([poi2015]log\)的第一篇題解。**略醜,調了快三個小時才調出來\(ac\)**。

對於這種小清新資料結構題,所以我覺得樹狀陣列才是這道題的正確開啟方式。

首先離散化,這樣才不會爆記憶體。開兩個樹狀陣列,第乙個樹狀陣列記錄離散化後\(1\)到\(i\)中數字出現的個數,第二個樹狀陣列離散化前\(1\)到\(i\)數字出現值的和。把所有詢問都讀入進來,對於每次操作:

操作\(1\):單點修改,若之前的數是正數,第乙個樹狀陣列\(-1\),第二個樹狀陣列\(-\)原來的數,若之後的數是正數,第乙個樹狀陣列\(+1\),第二個樹狀陣列\(+\)之後的數

操作\(2\):區間詢問,先將大於\(s\)的個數求出來,再比較\(c-\)大於\(s\)的個數乘上\(c\)與剩餘數之和,若前者大,輸出\(nie\),否則輸出\(tak\)

再開乙個陣列記錄當前序列的值,就完事了

\(code\ below:\)

#include #define ll long long

#define res register

using namespace std;

const ll maxn=1000000+10;

ll n,m,a[maxn],b[maxn],mp[maxn],tot,num;

//a[i]是目前的序列情況,b[i]是第幾次修改後離散化1-num,mp記錄離散化後的陣列1-1e9

//tot是幾次修改,num是離散化後的修改,c1[i]是1-i的個數,c2[i]是1-i的值的和

ll c1[maxn],c2[maxn];

struct nodeq[maxn];

//id是第幾次修改

inline ll read()

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

return (f==1)?x:-x;

}ll lowbit(ll x)

void add_num(ll x,ll y)

ll query_sum(ll x)

int main()

else q[i].id=-1;

if(i!=m) ch=getchar();

} sort(mp+1,mp+tot+1);

num=unique(mp+1,mp+tot+1)-mp-1;

for(ll i=1;i<=tot;i++)

b[i]=lower_bound(mp+1,mp+num+1,b[i])-mp;

for(ll i=1;i<=m;i++)

if(q[i].id!=-1) q[i].x=b[q[i].id];

for(ll i=1;i<=m;i++)

a[q[i].k]=mp[q[i].x];

if(mp[q[i].x]>0)

} else

} return 0;

}

POI2015 Kinoman(思維,線段樹)

這是一道不錯的題,不過我並沒有思考充分就實在忍不住看了題解,有點遺憾 記pre i 表示原序列i位置的數上一次出現的位置 每加入乙個數,我們發現pre i 1 i作為左端點的答案就增加了w,1 pre i 減少了w 我們可以列舉右端點,每加入乙個數進行區間加 減操作,不過我們發現,雖然從理論上來講的...

省選專練POI2015Kinoman

小目標 高考假以內,做完poi2015 和poi2014的一半 怎麼搞?實際套路也挺簡單的。你看 l,r。這是n n的演算法 一般來說1e6 怎麼搞是on 但是onlogn 卻必須得跑過 原因是一般來說解決是列舉乙個l 或者是中位數。但是必須得log 那麼毒瘤卡常數 你用乙個後向星記錄乙個 pre即...

POI 2001 Goldmine 線段樹 掃瞄線

題目鏈結 求平面n個點 n 15000 用乙個 長寬為 s w的矩陣去套,能套到的最多的點數,在邊上的點也算 其實跟之前矩形巢狀求面積類似 poj的atlantic 用類似掃瞄線的做法,把點當做邊 y 到 y值 w 插入線段樹,這樣就維護了y方向,x方向就用類似佇列維護,在距離大於s的時候,就彈出前...