目錄作業
年會小遊戲
公司搬遷
題目描述
小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...