icpc 徐州 A cat規律

2021-10-11 08:54:33 字數 1983 閱讀 5742

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,...