題意:多次詢問,區間內是否存在兩個數,使得它們的和為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 5ac**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 }
洛谷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...