給定乙個長度為 \(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+x\)
維護乙個bitset存區間內有的值,等價於s&(s<\(1\)
對於加法, \(a_i+a_j=x\) 化簡為 \(a_i-(n-a_j)=x-n\)
和減法一樣,維護乙個bitset存 \(n-x\) 是否出現即可, \(n\) 取最大值
對於乘法,暴力列舉因子即可
#includeusing namespace std;
bitset<100010>bi,bii;
int n,m,k,a[100010],to[100010],cnt[100010],ans[100010];
struct node
bool operator<(const node&a)const
else if(q[i].opt==3)
}for(int i=1;i<=m;i++)
if(ans[i])puts("hana");
else puts("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 個數,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 注意,兩個數字置可以相同 題解 ...