首先每個點x+lowbit(x)唯一,所以所有的點形成了一棵樹
問題變成了鏈修改單點求
考慮當k為奇數時,所有的操作不會改變x的最低非0位
即所有的點形成了以(2x
+1)k
d,(2x+1
d>=0
)(2x+1)k^d,(2x+1=0)
(2x+1)
kd,(
2x+1
d>=0
)開頭的一堆鏈,如果能對每個數找到它所在的開頭就做完了
當k為偶數時,考慮將k寫成k=2
p∗ak=2^p*a
k=2p∗a
,a是奇數,那麼可以發現所有的s=2
q∗bs=2^q*b
s=2q∗b
,b是奇數且q>=b的s也形成了一堆以(2x
+1)∗
2pkd
,((2
x+1)
2pd>=0
)(2x+1)*2^pk^d,((2x+1)2^p=0)
(2x+1)
∗2pk
d,((
2x+1)2p
d>=0
)開頭的鏈
對於剩下的點,我們考慮暴力跳到第乙個合法的s
注意到對於乙個x,如果最低位不變那麼只需要跳p次就跳到了,否則就說明有進製產生,而進製最多為logk
n\log_kn
logkn
次,所以總次數為p
∗logk
n=log2k
∗logk
n=log2n
p*\log_kn=\log_2k*\log_kn=\log_2n
p∗logkn
=log2
k∗logkn
=log2
n現在問題就變成了對於乙個數找到其對應的開頭,考慮最低位不會改變,所以會一直/2直到不能再除,然後就會產生退位
總的退位次數我們是可以計算出來的,對於數x,其最低位為t,那麼退位次數為⌊xk
t⌋\lfloor \rfloor
⌊ktx⌋
,直接倍增求出來就行了
複雜度大概是o(q
logkn
log2n
)o(q\log_kn\log_2n)
o(qlogk
nlog2
n),由於當k=2時有點跑不過所以特判了。。。。
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using
namespace std;
intread()
void
write
(int x)
char ch[20]
;int tot=0;
for(
;x;x/=10
) ch[
++tot]
=x%10
+'0';fd
(i,tot,1)
putchar
(ch[i]);
puts(""
);}const
int n=
2e5+
5,m=n<<5;
int tr[m]
,ls[m]
,rs[m]
,tot,rt[m]
;void
modify
(int
&v,int l,
int r,
int x,
int y)
intquery
(int v,
int l,
int r,
int x,
int y)
int n,q,k,l,p,w,cnt,pw[35]
,ct[n]
,g[n][35
];int inv[n]
;map<
int,
int> id,val;
intlow
(int x)
intlowbit
(int x)
intlowbit
(int x)
intfind
(int x)
s=g[s][0
];return id[s*pw[t-1]
];}void
modify
(int x,
int v)
intquery
(int x)
intmain()
return0;
}for
(l=k;
!(l&1)
;l>>=
1) p++
;for
(int x=n;x;x/
=k) w++
; pw[0]
=1;fo
(i,1
,w-1
) pw[i]
=pw[i-1]
*k;fo
(i,1
,w)fo
(j,0
,k/2-1
)fo(i,1
,k)for
(int x=i;
!(x&1)
;x>>=
1) ct[i]++;
fo(i,
1,k)
if(ct[i]
>=p) inv[i*
2%k]
=i;fo
(j,1,30
)fo(i,1
,k) g[i]
[j]=g[inv[g[i]
[j-1]]
][j-1]
;for
(;q;q--)if
(opt==2)
}return0;
}
GDOI2019模擬2019 3 4 總結
今天來的相對早一些,感覺時間上還行。看題t1一開始沒有什麼思路 t2感覺可能是貪心然後用資料結構維護之類的 t3計算幾何 思考t1 認真觀察了資料範圍以後感覺可以dp,但是複雜度是kn 3的,有66分,似乎還可以字首和優化 寫著寫著就發現相當的難寫,暴力都調到了10點多,加上字首和優化恐怕更困難,於...
GDOI2019模擬2019 3 22 總結
今天被一道資料結構題搞了3h 前兩題就沒什麼時間想了,有點難受 t1一道構造博弈題,想了一會沒什麼思路 t2又是奇怪的樹的計數,沒怎麼仔細想,先跳過。t3,哇,這不是樹套樹板題嗎?猶豫了一會,感覺用線段樹套個splay比較靠譜 於是就寫啊寫,寫啊寫 寫完就調啊調,調啊調 光寫就寫到10 00 調到不...
GDOI2019模擬2019 3 23 總結
今天的比賽感覺還是沒有發揮出水平,被困死在了一道題 t1一開始蹦出一些思路,都沒有什麼好辦法做,先寫了個50分去看下一題 t2隨手推了一會式子,這不是常係數齊次線性遞推麼 完全忽略掉能不能過 然後又是寫啊寫,調啊調 一直搞到12 30 一測極限,怎麼跑個1分鐘都跑不出來 心態崩了 趕快去看t3,感覺...