因為要快速查詢向後跳應該是哪乙個點,所以用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 旅行過程中...