a-cat vj鏈結
題意:t次測試(t≤
5×10
5)(t\le5\times10^5)
(t≤5×1
05),每次給定l、r
l、rl、
r區間以及數字s
ss,要求在這個區間中找到最長子段[x,
y][x,y]
[x,y
],使得x⨁(
x+1)
⨁...
⨁(y−
1)⨁y
≤sx\bigoplus (x+1)\bigoplus...\bigoplus(y-1)\bigoplus y\le s
x⨁(x+1
)⨁..
.⨁(y
−1)⨁
y≤s成立。
資料範圍:1≤l
≤r≤1
018,1
≤s≤2
×1018
1\le l\le r\le10^,1\le s \le 2\times10^
1≤l≤r≤
1018
,1≤s
≤2×1
018
思路:找規律,打表出來的圖是這樣的。每次固定開頭,固定結尾挺難看出來的。注意每次0出現的位置。
這是偶數4開頭的數字:
這是偶數2開頭的數字:
但是奇數開頭沒有這個規律。
這是奇數3開頭的數字:
可以發現乙個規律偶數開頭的,區間長度是4的倍數出現一次0
那麼問題就可以轉換成貪心先把所有偶數開頭的,區間長度為4的小區間合併,他們的答案是最小的0。
這樣操作之後區間內可能剩下的有兩類數字:
開頭的乙個奇數
尾部的餘數
剩下的數字對於答案的拓展作用只在於:0⨁?
0\bigoplus?
0⨁?之後的答案≤
s\le s
≤s,那麼最後答案可以加上?
??的長度。
對他們進行字首和,每次進行列舉前後端點,判斷是否是合法的解,維護最大值。
由於這個區間的長度範圍≤
4\le4
≤4,所以最後的時間複雜度是o(t
∗16)o(t*16)
o(t∗16
)。注意點:
因為資料範圍是1018
10^10
18級別的,cin會t,用scanf
判斷時候異或操作^要加括號!!!!!!!
ac**:
ll xo
(ll x)
return ans;
}ll dp[
110]
, a[
110]
;int
main()
}*///偶數開頭的,區間長度是4的倍數出現一次0
cin >> t;
while
(t--)}
ll tt = ans;
for(
int i =
0; i <= nw; i++)}
if(ans)
printf
("%lld\n"
, ans)
;else
printf
("-1\n");
/*if (ans)cout << ans << endl;
else cout << -1 << endl;*/
}return0;
}
2019 ICPC徐州 A Cat題解
題目大意 從1到正無窮的排列。t次詢問,每次給乙個l,r,s 每次在 l,r 選擇乙個最長的區間,使它的異或小於等於s.t 5e5 l,r 都是1e18 s 1e18 資料範圍這麼大一定是規律題 打表發現異或後為0的區間是長度為4而且迴圈的,這樣子的長度為4的區間的開始位置應該模4等於2或者0,這樣...
ACM區域賽 徐州2019 A Cat
考慮這樣乙個性質,偶奇偶奇異或值為0.所以五個連續的數一定可以找出這樣的結構.所以邊界一定不會出現五個不用的數,那麼左邊右邊都列舉四個即可.include.h using namespace std define ll long long define maxn 100005 define rep ...
2019ICPC徐州網路賽
theme n個數編號為1 n,兩種操作 1 x 將編號為x的數置為不可得,2 x 詢問x位置及其後第乙個可得數的編號。1 n,x 1e9,1 q 1e6 solution 首先想到用線段樹維護。初始時線段樹每個l r位置的值為l,1 x操作對應將x位置值置為inf,2 x 操作相當於查詢區間 x,...