題目大意:給你$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...