傳送門
對於找第一第二近,用set+lower_bound,預處理出nxt_a nxt_b 表示a,b下一步走到**
然後倍增 , st_a[i][j] 表示從i往後2^j步a走了多少 b同理
nxt[i][j] 表示往後走2^j步的位置
類似lca那樣預處理就好了
//一直re但對拍一小時後的偽ac**
#include#define n 500005
#define inf 0x3fffffff
#define ll long long
using namespace std;
ll n,x0,m;
ll a[n],h[n];
sets;
ll nxt_a[n] , nxt_b[n] , h_a[n] , h_b[n];
ll nxt[n][20] , st_a[n][20] , st_b[n][20];
ll read()
while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();
return cnt*f;
}void getab(ll x,ll pos,ll &ans1,ll &ans2)
} if(nxt_a[pos] && st_a[pos][0] <= x) ans1 += st_a[pos][0];
}int main()
for(ll i=1;if1*u2 || (f2*u1 == f1*u2 && a[i]>h)) u1=f1 , u2=f2 , h=a[i] , ans=i;
} printf("%lld\n",ans);
m=read();
while(m--)return 0;
}
noip2012 開車旅行 set 倍增
因為要快速查詢向後跳應該是哪乙個點,所以用set,迭代器左右晃一下查詢最接近的兩個元素 p選手是不是只能用平衡樹 然後用倍增記錄i節點跳2 j步後,a和b分別走的距離。具體的細節和統計答案也需要注意。include include include include include include de...
NOIP2012 開車旅行 SET 倍增
啊,看到題 字好多。然後就直接開始碼暴力模擬了,覺得可以預處理一下每個點可以到達的最近點和次近點,這樣大概就有50分了 然而實際有70分。我忽略了只能往後走這一點帶來的便利,於是每一次都要找一次最近點 次近點 果然弱啊 暴力的過程寫的蠻。第一次只騙到15分 後來發現了bug調到35.就開始在精度這裡...
NOIP2012 T3開車旅行 set 倍增
70分做法 先預處理出所有點的最近和次近 o n 2 一遍就ok 然後暴力求出每個解 o nm by siriusren include include include define inf 0x3fffffff using namespace std int n,x,rech 0x3fffffff...