noip2012 開車旅行 set 倍增

2021-07-24 11:28:59 字數 1277 閱讀 9637

因為要快速查詢向後跳應該是哪乙個點,所以用set,迭代器左右晃一下查詢最接近的兩個元素(p選手是不是只能用平衡樹~)。然後用倍增記錄i節點跳2^j步後,a和b分別走的距離。具體的細節和統計答案也需要注意。

#include

#include

#include

#include

#include

#include

#define maxn 100005

#define ll long long

using

namespace

std;

set set;

set::iterator it,pre,nxt;

mapint> id;

int fa[maxn][20];

int tt[maxn];

ll dis[maxn][20][2];

ll dp[maxn][2];

void read(ll &a)

while(c>='0'&&c<='9')

a*=f;

}ll h[maxn];

int n,cnt;

ll inf=1e10;

struct strsor[6];

bool cid(str a,str b)

for(int i=1;i0;

nxt++;

if(nxt!=set.end())

}if(it!=set.begin())

}sort(sor+1,sor+cnt+1,cid);

int j=sor[1].id;

if(cnt>0)

j=sor[2].id;

if(cnt>1)

set.erase(h[i]);

id[h[i]]=0;

}for(int j=1;j<=18;j++)

for(int i=1;iif(j==1)

else}}

}struct ans;

ans calc(int i,ll x)

}if(dis[u][0][0]+d<=x) da+=dis[u][0][0];

r.da=da;r.db=db;

return r;

}int main()

else

if(da!=0&&da*fm==fz*db&&h[pos]if(da==0&&fm==0&&h[pos]cout

for(int i=1;i<=m;i++)

return

0;}

NOIP2012 開車旅行 SET 倍增

啊,看到題 字好多。然後就直接開始碼暴力模擬了,覺得可以預處理一下每個點可以到達的最近點和次近點,這樣大概就有50分了 然而實際有70分。我忽略了只能往後走這一點帶來的便利,於是每一次都要找一次最近點 次近點 果然弱啊 暴力的過程寫的蠻。第一次只騙到15分 後來發現了bug調到35.就開始在精度這裡...

NOIp2012 開車旅行

傳送門 以後序列上的問題可以想一想倍增。s a i s b i sa i sb i sa i sb i 記錄在i ii這個位置讓a b a ba b開車到達的點。把a aa和b bb都跳一次稱為一輪。d is i j dis i j dis i j 表示從i ii跳2 j2 j 2j輪的總路程。p ...

Noip2012 開車旅行

小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為hi,城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即d i,j hi hj 旅行過程中...