題目大意:
從1到正無窮的排列。
t次詢問,每次給乙個l,r,s ,每次在 [l,r] 選擇乙個最長的區間,使它的異或小於等於s.
t:5e5
l,r 都是1e18
s:1e18
資料範圍這麼大一定是規律題
打表發現異或後為0的區間是長度為4而且迴圈的,這樣子的長度為4的區間的開始位置應該模4等於2或者0,這樣子我們就可以在[l , r]區間內找到離l第二近的模4==0的位置in 和 離r第二近的模4等於3的位置out,為什麼是第二大呢,因為為了防止出現一些特殊情況,如果in>out就說明這個區間巨小,直接n^2跑一遍就好了。
如果in#include
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define io std::ios::sync_with_stdio(false);cin.tie(0)
#define endl '\n'
#define pii pair
#define sc(x) scanf("%d",&x)
using
namespace std;
const
int maxn =
1e5+10;
const
double eps =
1e-18
;const ull base =
13331
;const ll mod =
998244353
;int ck =0;
vector p;
intmain()
if(i%4==
0&&ck ==0)
} ck =0;
ll out =-1
;for
(ll i = r;i>=l;i--)if
(i%4==3
&&ck ==0)
} ll tmp =0;
if(in < out&& in!=-1
&& out!=-1
)if(in>out||in ==-1
||out ==-1
)for
(ll j = i+
1;j<=r;j++)}
}if(cnt ==
0)cnt =-1
; cout for(ll i = l;i)for (ll i = out+ 1;i<=r;i++ )for (int i = 0;isize() ;i++ )for (int j = i+ 1;jsize() ;j++)} }if(cnt ==0) cout<}} 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.bigopl... 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,... a cat 題解 先打出異或字首和的表,不難發現當在偶數字置pos時,pos,pos 3 這些數的異或和為0,這意味著中間的序列可以每四個四個的連一起,因為他們異或和的值為0,因此我們就可列舉開頭和結尾的位置,並維護最大長度。實現 include define ll long long using ...icpc 徐州 A cat規律
2019ICPC徐州網路賽
2019ICPC徐州站重現賽 ACFM題解