選取任意不重疊的兩個區間,使異或結果為0
前言已經想到了用字首和優化就是不知道該怎麼判斷他們不是重疊
正文暴力是列舉兩個區間左右端點,但是顯而易見會tle,我們可以考慮只列舉其中乙個區間[x,y],這個區間的異或和可以很容易的在o(1)時間複雜度通過字首異或和求得。如果我們規定[x,y]是右邊的那個區間,實際上我們需要知道的是,左邊有多少個區間的異或和與[x,y]的異或和相等。
我們可以用乙個類似桶排序的桶的陣列cnt[i]來表示當前位置左邊異或和為i的區間的個數,這個當前位置其實是就是上面那個x。而顯然以x-1為右界的區間在之前就統計了,所以我們只需要再列舉乙個j,表示i為右界的時候區間的左界,然後把區間的情況都加入到cnt陣列裡。這個j的列舉和上面y的列舉是並列的,演算法時間複雜度是o(n^2)
發現列舉右端點是真的可以解決很多題目
注意1:mp的陣列範圍為1<<17是因為異或是不進製的加法(1<<17)>1e5,則按二進位制來算在第18位來算不可能是1
2:ans為long long
#include
#include
using
namespace std;
const
int maxn=
1e3+5;
int a[maxn]
,sum[maxn]
,mp[
1<<17]
,n,cnt;
long
long ans;
//注意ans要用ll
intmain()
for(
int r=
1;r<=n;r++
)for
(int k=r+
1;k<=n;k++)}
printf
("%lld\n"
,ans)
;return0;
}
數碼 牛客每日一題
題意 給定兩個整數 l 和 r 對於所有滿足 1 l x r 10 9 的 x 把 x 的所有約數全部寫下來。對於每個寫下來的數,只保留最高位的那個數碼。求1 9每個數碼出現的次數。思路 可以轉化為1到 r 的問題,列舉約數 a,找到有多少約數 b,使得 a b 在1 到 r 的範圍內。統計數量。a...
牛客每日一題 保護花
題目連線 這個很明顯是貪心,推導一下公式 假設這一群牛中有a b這兩頭,他們的值分別是ati adi,bti bdi,並且已經知道了總的di值sdi 假設先運a牛就是比先運b牛好,說明先運a牛總的損壞低 則有 sdi adi 2 ati sdi bdi 2 bti 可以發現當 adi 越高 ati越...
每日一題力扣389 異或神奇操作
給定兩個字串 s 和 t,它們只包含小寫字母。字串 t 由字串 s 隨機重排,然後在隨機位置新增乙個字母。請找出在 t 中被新增的字母。class solution def findthedifference self,s str,t str str 初始化 ans 為 0 ans 0 對字串 s ...