題面在這裡
有乙個人在長為
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
log2n
)。
注意細節。//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 走 肯定會有重複的啊 那怎麼省略掉這些呢 很簡單 如果我這個圓盤往下掉 第一層的寬度小於第二層的寬度 那麼很明顯 第二層的寬度是沒有用處的 那麼有用的是什麼呢 ...