SNOI2017 乙個簡單的詢問

2022-05-20 04:01:25 字數 973 閱讀 3506

給定乙個長度為\(n(n\le50000)\)的序列\(a(1\le a_i\le n)\),定義\(\operatorname(l,r,x)\)為區間\(a_\)中\(x\)的出現次數。\(m(m\le50000)\)次詢問,每次給出\(l_1,r_1,l_2,r_2\),求\(\sum_^\operatorname(l_1,r_1,x)\cdot\operatorname(l_2,r_2,x)\)。

\[\operatorname(l_1,r_1,l_2,r_2)=\operatorname(1,r_1,1,r_2)-\operatorname(1,l_1-1,1,r_2)-\operatorname(1,r_1,1,l_2-1)+\operatorname(1,l_1-1,1,l_2-1)

\]因此將每組詢問拆成\(4\)個,然後直接套用莫隊演算法即可。

時間複雜度\(\mathcal o(n\sqrt n)\)。

#include#include#include#includeinline int getint() 

typedef long long int64;

const int n=5e4+1,m=5e4;

int n,a[n],block,cnt[2][n];

int64 tmp,ans[m];

struct query ;

if(l1>1) q[tot++]=(query);

if(l1>1&&l2>1) q[tot++]=(query);

} std::sort(&q[0],&q[tot]);

for(register int i=0,p0=0,p1=0;iq[i].p0) del(0,a[p0--]);

while(p1>q[i].p1) del(1,a[p1--]);

ans[q[i].id]+=tmp*q[i].type;

} for(register int i=0;ireturn 0;

}

SNOI2017 遺失的答案

loj 首先可以考慮把 n rightarrow n g,l rightarrow l g 這是很顯然的.然後考慮所有可能出現的質因數就是 l 的質因數,所以可以對 l 進行質因數分解.接著考慮設 f 表示最小集為 s1 最大集為 s2 的狀態的方案數,這個很顯然可以 dp 這個時候我們需要強制乙個...

BZOJ5016 Snoi2017 乙個簡單的詢問

題面 bzoj 這題的ider挺有意思的。看看資料範圍,多半是莫隊,但直接統計答案又不行 有4個引數啊 來拆式子,設 q i,j sum cnt 0.i x times cnt 0.j x 這個是可以用莫隊做的,那怎麼用它把題中的式子表示出來呢?有 ans l1,r1,l2,r2 sum cnt l...

乙個簡單的詢問 HYSBZ 5016

給你乙個長度為n的序列ai,1 i n和q組詢問,每組詢問讀入l1,r1,l2,r2,需輸出 get l,r,x 表示計算區間 l,r 中,數字x出現了多少次。input 第一行,乙個數字n,表示序列長度。第二行,n個數字,表示a1 an 第三行,乙個數字q,表示詢問個數。第4 q 3行,每行四個數...