洛谷P3674 小清新人渣的本願

2022-05-24 01:24:11 字數 1166 閱讀 2142

題目大意:給你$n$個數,$m$個詢問($n,m\leqslant 10^5$),有三種

$1\;l\;r\;x$詢問區間$[l,r]$內有沒有兩個數相減等於$x$

$2\;l\;r\;x$詢問區間$[l,r]$內有沒有兩個數相加等於$x$

$3\;l\;r\;x$詢問區間$[l,r]$內有沒有兩個數相乘等於$x$

注意,兩個數字置可以相同

題解:莫隊。

1. 即詢問區間有沒有乙個數$s_i$,存在$s_i+x$

即詢問區間有沒有乙個數$s_i$,存在$x-s_i$。$-s_i$不好考慮?存乙個$n-s_i$不就好了?($n$為乙個很大的數)

即詢問區間有沒有乙個數$s_i|x$,存在$\dfrac$

這複雜度是$o(m(\sqrt+c))$($c=\max\,\max\\}$,題目中給的是$c\leqslant 10^5$)

過不了?

注意到操作一,好像像乙個偏移,可以用$bitset$。

那麼操作二呢?

$-s_i$不好考慮?存乙個$n-s_i$不就好了?($n$為乙個很大的數),也可以偏移耶。

操作三?

這個沒有什麼很好的方法,暴力列舉它的約數$s_i$,看是否存在$\dfrac$,反正時間複雜度為$o(\sqrt)$

所以總複雜度為$o(m(\sqrt+\dfrac))$

卡點:

c++ code:

#include #include #include #include #define bsz 317

#define maxn 100010

const int n = (1 << 17) - 1;

std::bitseta, b, ans;

int n, m;

int s[maxn], cnt[maxn];

struct node

} q[maxn];

void work(int op, int x, int tg)

}int main()

for (int i = 1; i <= m; i++) puts(ans[i] ? "hana" : "bi");

return 0;

}

洛谷P3674 小清新人渣的本願

題意 多次詢問,區間內是否存在兩個數,使得它們的和為x,差為x,積為x。n,m,v 100000 解 毒瘤bitset.假如我們有詢問區間的乙個桶,那麼我們就可以做到o n 列舉查詢了。然後我們用bitset優化一下.外面套上莫隊來維護桶。具體來說,差為x可以寫成 a b x 然後我們把bitset...

洛谷P3674 小清新人渣的本願

給定序列a,長度為n,有m次操作,opt表示該次操作型別,l,r表示操作的區間,x表示這次操作的x 選出的這兩個數可以是同乙個位置的數。定義c為每次的x和ai中的最大值,ai 0,每次的x 2。n,m,c 100000 前置技能 思路 對於此類離線的序列問題,想到莫隊演算法,時間複雜度為 o n s...

洛谷 P3674 小清新人渣的本願

給定乙個長度為 n 的陣列 a 有三種詢問 1.詢問是否存在 a i a j x i,j in l,r 2.詢問是否存在 a i a j x i,j in l,r 3.詢問是否存在 a i a j x i,j in l,r 我們使用莫隊來解這道題 對於減法,a i a j x 化簡為 a i a j...