這一題我還是不會做qaq
一開始想了一想,好像可以上莫隊
嗯,怎麼維護修改呢
我們可以對數值進行分塊啊,那麼每次就只需要n√
的時間就可以維護好了
(⊙v⊙)嗯,看起來是乙個十分優越的做法
時間複雜度就是莫隊*n√
,也就是n√
∗nn√
,大概是n2
這就跟暴力沒什麼區別嘛,就名字好聽了一點
於是繼續想。。
什麼都沒想出來。。
於是。。。
看了兩眼,又會了
大概就是維護 前i個塊數字為j出現了多少次以及第i個塊到第j個塊的答案
如果你是零碎的地方,你就暴力算
零碎的答案是n√
的 至於為什麼是對的。。我覺得這個很好理解就懶得寫了
感覺看**應該很快能看懂
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const ll n=100005;
ll n,q;
struct qq
s[n];
ll b[n];//離散後的這個值在原值裡面是多少
ll a[n];//離散後的序列
bool cmp (qq a,qq b)
}cnt=belong[n];
r[cnt]=n;
return ;
}ll cnt1;
void init ()
sort(s+1,s+1+n,cmp);
cnt1=1;a[s[1].id]=1;b[1]=s[1].x;
for (ll u=2;u<=n;u++)
}ll lalal[350][n];//前i個塊數字為j出現了多少次
ll ans[350][350];//第i個塊到第j個塊的答案
ll ooo[n];//某個數字出現了多少次
ll mymax (ll x,ll y)
void ready ()
}}void solve ()
else
for (ll u=l[belong[r]];u<=r;u++)
printf("%lld\n",ans);}}
}int main()
不知道為什麼,居然跑了80s,這已經不是暴力了好不好qaq bzoj4241 歷史研究
這題也是坑了好久 之前whx帶我刷joi的時候本來應該要做的。可是太懶沒有寫。區間詢問加權眾數。分塊,預處理出塊和塊之間的答案,記錄到第i個塊數字x出現了多少次。然後查詢的時候和普通眾數基本一樣,就是乘了個權值而已。要離散化。時間複雜度o nlogn mn 昨晚寫的常數太爛了。用了struct,陣列...
BZOJ4241 歷史研究
一眼覺得是莫隊,發現刪除不是很好搞,於是上回滾莫隊直接搞過 回滾莫隊用於處理難以刪除但是易於新增 其實易於刪除難以新增也可以,但是沒見過這樣題 的莫隊,排序照常,如果左右端點在同一塊直接暴力,這部分最多n sqrt n,否則把左端點在一塊的一起處理,清空莫隊,然後直接令莫隊左端點在塊尾,這部分n s...
bzoj4241 歷史研究
題目鏈結 看到題目就聯想到了 bzoj2809 apio2012 dispatching。想了想權值分塊 莫隊,發現不好維護塊內最值,又看了看80s的時間,於是怒水一發線段樹 莫隊,結果先wa後tle,不斷tle,無論怎麼改常數都不行,難道nlogn sqrt n 就是過不了嗎!不爽,蒯個題解,再見...