洛谷P3674 小清新人渣的本願

2022-04-30 11:18:12 字數 1545 閱讀 4745

題意:多次詢問,區間內是否存在兩個數,使得它們的和為x,差為x,積為x。

n,m,v <= 100000

解:毒瘤bitset......

假如我們有詢問區間的乙個桶,那麼我們就可以做到o(n)列舉查詢了。

然後我們用bitset優化一下......外面套上莫隊來維護桶。

具體來說,差為x可以寫成 a - b = x

然後我們把bitset左移/右移x位,與原來的and一下,看是否有元素為1即可。

和為x可以寫成 a + b = x   n - a - b = n - x   (n - a) - b = n - x

這啟示我們維護乙個n - x的反桶,然後把反桶右移n - x位與原桶and。

關於積,直接n0.5暴力即可。

1 #include 2 #include 3 #include 4 #include 5

6const

int n = 100010;7

8int

fr[n], a[n], bin[n];

9 std::bitsetbs, bs2, tp;

1011

struct

ask

17return r

19}ask[n];

2021 inline bool cmp(const ask &a, const ask &b)

2425 inline void add(int

x) 30 bin[a[x]]++;

31return;32

}3334 inline void del(int

x) 40

return;41

}4243int

main()

51for(int i = 1; i <= m; i++)

55 std::sort(ask + 1, ask + m + 1

);56

57int l = 1, r = 1

;58 bin[a[1]]++;

59 bs.set(a[1

]);60 bs2.set(n - a[1

]);61

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

65while(r

68while(l

71while(r >ask[i].r)

74//

------------

75if(ask[i].f == 1

) 79

else

if(ask[i].f == 2

) 83

else

89if(bs[j] && bs[ask[i].x /j]) 93}

94}95}

9697 std::sort(ask + 1, ask + m + 1

, cmp);

98for(int i = 1; i <= m; i++)

102else

105}

106return0;

107 }

ac**

洛谷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 個數,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 注意,兩個數字置可以相同 題解 ...

洛谷 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...