51nod1834 蛇爬樹(二分查詢 細節)

2021-08-18 05:38:12 字數 2609 閱讀 1215

題面在這裡

有乙個人在長為

n n

的數軸上從

0' role="presentation">0

0開始,每次向右走一步, x→

x+1 x→x

+1

。同時給出

k k

對關鍵點 ai

,bi' role="presentation">ai,

biai

,bi,如果走到 ai

a

i就要跳到 bi

b i。

現在給出他每天走的步數,假如某天他往回走了他的速度會 ×2

×

2。有

q q

個詢問,每次給出初始速度問最少多少天走到

n' role="presentation">nn。

n≤109

,k,q

≤2×10

5 n≤10

9,k,

q≤2×

105

//希望自己以後多思考思考。。。不要動不動就放棄

來說這題。

首先可以發現路徑是唯一的,所以可以處理出所有關鍵邊經過的順序,可以用set維護。

然後對於每個詢問就可以二分找到第一條後退邊,模擬即可。由於經過後退邊以後速度會翻倍,就能保證最多隻會操作log次。。

總時間複雜度 o(

nlog2n

) o(n

log2⁡n

)。

注意細節。//define和qpow啥的不用理會。。。

#include

#define rep(i,x,y) for (int i=(x); i<=(y); i++)

#define per(i,x,y) for (int i=(x); i>=(y); i--)

#define ll long long

#define ld long double

#define inf 1000000000

#define inf 1000000000000000000ll

#define pii pair

#define f first

#define s second

#define all(x) (x).begin(),(x).end()

#define sz(x) ((int)(x).size())

#define sqr(x) ((x)*(x))

#define cmin(x,y) (x)=(y)<(x)?(y):(x)

#define cmax(x,y) (x)=(y)>(x)?(y):(x)

#define mset(x,y) memset((x),(y),sizeof(x))

#define mcpy(x,y) memcpy((x),(y),sizeof(y))

using

namespace

std;

const ld pi=acos(-1);

const ld eps=1e-8;

header files

ll read()

void write(ll a)

// fast i/o //

#ifdef mod

ll ksm(ll x,ll p)

ll get_inv(ll x)

#else

ll ksm(ll x,ll p)

#endif

qpow

#define n 200005

int n,m,q,cnt; ll dis[n],b[n],ans;

struct node

node(int x_,int y_,int z_)

bool

operator

< (const node &t) const

int now=0;

while (1)

/*cerrnow=0;

rep (i,1,cnt)

dis[cnt+1]=dis[cnt]+abs(n-now); b[cnt+1]=inf;

//rep (i,1,cnt+1) cerrq=read();

while (q--)

if (dis[pos]-all>x)

all+=x;

pos=upper_bound(dis+1,dis+1+cnt+1,all)-dis-1;

now=pos; x<<=1; ans++;

if (all>=dis[cnt+1]) break;

}write(ans),puts("");

}return0;}

// sample data:

/*7 3

2 51 3

4 2212

63*****=

12 4

2 78 3

5 10

7 61005*/

// rest:

/**/

/*if you find any bug in my code or solution, please tell me. thanks so much.

email: [email protected]

*/

51Nod1799 二分答案

lyk最近在研究二分答案類的問題。對於乙個有n個互不相同的數且從小到大的正整數數列a 其中最大值不超過n 若要找乙個在a中出現過的數字m,乙個正確的二分程式是這樣子的 l 1 r n mid l r 2 while l r 最終a r 一定等於m。但是這個和諧的程式被熊孩子打亂了。熊孩子在一開始就將...

51nod 1686 二分 尺取法

題意 給出陣列,區間的值為其重數 這個重數是指區間內的重數,不是整個陣列的重數 求解第k大小的區間值 重數 題解 思路 二分 尺取法 由上知 重數的範圍為 1 100000 重數值大的區間一定包括重數值小的區間 因此找到有大於等於k個區間值為mid就是答案了 注意 有可能第k大的值和第k 1個 或者...

51Nod 1279 扔盤子 二分

這道題如果暴力走 o n 2 肯定超時 然後看資料5 10 4 時間1s 呃 o nlogn 一下是能過的 然後 在想我為什麼要o n 2 走 肯定會有重複的啊 那怎麼省略掉這些呢 很簡單 如果我這個圓盤往下掉 第一層的寬度小於第二層的寬度 那麼很明顯 第二層的寬度是沒有用處的 那麼有用的是什麼呢 ...