20201029CSP提高組訓練(走親戚)

2022-08-16 21:03:12 字數 2963 閱讀 8044

目錄作業

年會小遊戲

公司搬遷

題目描述

小x家大年初三要去拜訪同村的所有親戚,恰好他家的所有親戚都住在一條東西走向的公路邊,而車的油量有限,車 子油量能行駛的距離為l,他對n個親戚隨機進行編號(1,2...n),假設馬路的中點為0,某個親戚的座標xi就為該親 戚到馬路中點的距離(設中點以東的座標為正數),而小x決定按照乙個規則去拜訪親戚們:

(1)先向東走,去東邊能抵達的最遠親戚家。

(2)如果油量足夠,再向西走,去西邊能抵達的最遠親戚家。

如此往復,直到油量不足以到下一家親戚時,留在當前這家過夜。

現在給定n個親戚的位置座標,m個出門狀態(以第ai個親戚家作為出發點,車內油量為li),請你判斷下小x會在哪 個親戚家過夜。

輸入格式

單組測試資料。

第一行包含兩個整數n 和 m (1 ≤ n, m ≤ 2*10^5),表示親戚的數目以及出門狀態的數目。

接下來一行包含n個整數 x1, x2, ..., xn ( -10^9 ≤ xi ≤ 10^9),表示每個親戚的位置座標。保證輸入的親戚的位置坐 標兩兩不相同。

接下來m行給出查詢。每行給出ai (1 ≤ ai ≤ n) 和 li(1 ≤ li ≤ 10^9),表示出門時,小x在第ai個親戚家,車上油量 是li。

輸出格式

輸出m行,第i行輸出第i個出門狀態時的小x最終在哪個親戚家過夜。

輸入輸出樣例

輸入 #1

3 20 3 -2

2 31 8

輸出 #113

輸入 #2

5 2-3 2 5 6 -7

2 20

1 16

輸出 #253

輸入 #3

8 2-1 -2 -3 3 -6 -7 -9 8

1 15

2 9輸出 #341

說明/提示

資料範圍

對於15%的資料, -100 ≤ xi ≤ 100 對於30%的資料,1 ≤ n,m ≤ 10 對於100%的資料,1 ≤ n, m ≤ 2*10^5 ,-10^9 ≤ xi ≤ 10^9, 1 ≤ li ≤ 10^9

樣例解釋

樣例一: 一共有n=3個親戚編號為1,2,3,位置分別是,有m=2種可能的出發狀態, 經過排序可知實際位置分布為,分別代表了編號3,1,2的位置

第一種情況(從編號為2的親戚家出發,車上油量為3),此時東邊已經沒有親戚可以拜訪,所以從西邊找到最遠能 拜訪的1,到達編號1親戚家時油量剛好耗盡,則小x會留在1號家過夜

第二種情況(從1號親戚家出發,車上油量為8),先往東去最遠的2號的親戚家,油量消耗3後抵達,油量剩餘5。 然後往西去編號為3的親戚家,油量消耗5後抵達,油量剩餘0,此時油量不足以繼續去拜訪東邊的下一家,則小x會 留在3家過夜

input:

4 4-1000000000 0 1 1000000000

2 999999999

2 999999999

2 999999999

2 999999998

output:33

32認為是這次比賽最水的一道題,直接用二分模擬即可

但是也會出現像以上補充樣例的情況,這是沒有優化的程式就會被卡飛,因此我們考慮批量處理:

當經過一輪(先向東後向西)模擬後,若位置沒變,我們記向東能走的最遠的點為r,模擬前的位置為pre,gas為當前汽油量,直接讓gas對r和pre的距離取模即可,但要注意(gas/dist(r,pre))的奇偶性,決定取模後是在r位置還是pre位置

#include #include #include #define rr register

#define nn 200010

using namespace std;

int read()

while(c >= '0' && c <= '9')re = (re << 1) + (re << 3) + c - '0' , c = getchar();

return re * sig;

}struct nodea[nn];

bool cmp(node a , node b)

void output(int x)

int n , m;

int pos[nn];

int dict[nn];

int main()

sort(a + 1 , a + n + 1 , cmp);

for(rr int i = 1 ; i <= n ; i++)

dict[a[i].id] = i;

rr int dist = a[n].pos - a[1].pos;

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

p = dict[p];

if(a[n].pos - a[p].pos <= gas)

gas -= a[n].pos - a[p].pos , p = n;

if((gas / dist) & 1) p = 1;

gas %= dist;

// cout << p << '\t' << gas << endl;

rr int l , r , mid;

rr int tmp;

rr int pre , delta , _r;

dogas -= a[l].pos - a[p].pos;

_r = p = l;

r = l , l = 1;

while(l < r)

gas -= a[p].pos - a[l].pos;

p = l;

delta = a[_r].pos - a[pre].pos;

if(delta != 0 && p == pre)

} while(tmp != gas);

output(a[l].id);

putchar('\n');

// cout << gas << "!!!\n";

} return 0;

}

提高組訓練總結

很好。明天就是旅遊了。今天寫個總結來概括一下這周訓練的收穫吧。訓練從11.13開始至11.17共5天。這5天每天都有一套模擬題。日期模擬題 分數總結收穫 11.13 sc theme park 210構圖 精確,簡潔,方便 11.14 dream team 290bfs 繼承,判斷,遞進 11.15...

XJOI提高組訓練 1 T5方程的解數

題目描述 已知乙個n元高次方程 k1 xp11 k2x p22 knxp nn 0 k 1x 1p1 k2x2 p2 k nxnp n 0其中 x1 x2,xn x 1,x2,x n是未知數,k1 k2,kn k 1,k2,k n是係數,p1 p2,pn p1,p2,pn 是指數。且方程中的所有數均...

CSP 第一屆提高組考後總結

心靈雞湯.在學習了三年之後,我們信競迎來了初中最後一次大考,也是第一次 csp cspcs p 考試。考試當天,我自我認為考得還是不錯,但是結果卻差強人意。先說說分數吧,雖說很難看,但是也不得不說 預估 310pt s 310pts 310pts 實際 200pt s 250pts 200pts 2...