開車旅行 巧妙的倍增 set

2021-08-30 06:39:53 字數 895 閱讀 8402

傳送門

對於找第一第二近,用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...