GDOI2017模擬8 12 新車

2021-07-16 15:20:34 字數 1438 閱讀 9030

平面上有乙個數軸,e點為目標點。

你現在要開♂車從w前往e,每移動1格需要1l油。

你的油箱容量為s,初始時裝滿了98#汽油。

數軸上有n個加油站,每個加油站提供98#,95#,92#中的一種。

到了加油站你可以選擇加任意數量的油,你的油箱是茲瓷所有油甚至混合油的。。

你認為98#最吼,95#其次,92#跑的最慢。

於是你欽點使消耗的92#最少。

如果有多種方案,使95#最少。

m次詢問。

n,m<=2*1e5, 0《座標<1e9,且起點的座標

一道很吼的題。

首先,你可以意識到,你只需要向右走,因為向左走無意義地消耗汽油。

然後,對於當前你所到達的加油站,你需要找出他下乙個需要去到的加油站。

很顯然,我們需要到達離他最近的油品大於等於他的加油站。

如果沒有,那麼我們就跑油品盡量好且盡量遠的加油站。

並且我們可以讓需要用的油減少,因為可行區間有重疊部分。

具體實現見**(懶癌晚期)

然後,你知道了貪心規則,就可以開乙個佇列記錄當前加油站能到達的各種油品的點。

f[i][0/1]表示從i這個加油站空油箱走到e所需要的最少92#,95#。

然後就可以轉移了。

細節有(fei)點(change)多。

#include#include#include#define fo(i,a,b) for(int i=a

;i<=b;i++)

#define fd(i,a,b) for(int i=a

;i>=b;i--)

#define n 200005

using namespace std;

struct notea[n*2];

bool cmp(note x,note y)

int n,m,e,s,tot,k,x,l[4],r[4],d[4][n*2],f[n*2][2],ans[n][2];

int main()

l[1]=l[2]=l[3]=1

;r[3]=1;d[3][1]=k;

fd(i,k-1,1) else

if (!bz)

fo(j,0,1) f[i][j]=f[d[bz][l[bz]]][j];

if (a[i].ty<3) f[i][a[i].ty-1]+=s;

f[i][a[d[bz][l[bz]]].ty-1]-=s-a[d[bz][l[bz]]].x+a[i].x;

}if (a[i].ty!=4) d[a[i].ty][++r[a[i].ty]]=i;

}fo(i,1,k) fo(j,0,1) ans[a[i].id][j]=f[i][j];

fo(i,1,m) printf("%d %d\n",ans[i][0],ans[i][1]);

}

GDOI2017模擬8 12 躲藏

給出乙個n m的網格圖,圖中有一些障礙節點。現在有a個男生和b個女生,還有乙個小標。男生要和女生配對,小標可以和任何乙個人配對。每一對cp 霧 只能待在乙個點。乙個點只能有一對cp。現在給出a b 1個人的初始座標,和他們的移動速度 即移動到4相鄰格仔所需的時間 所有人同時移動,求完成配對的最小時間...

GDOI2017模擬11 5 總結

看到第一題,哇,數論題,不會啊,感覺要跪 正當我迷茫的時候,突然機房斷電了。啪的一聲大家的電腦都黑了!不知所措!沒辦法,只好等等。過了10分鐘左右,來電了,重新看了看第一題,也許是冷靜下來了,發現直接暴力分解質因數就能過!繼續看第二題,在草稿紙上推了一下,要用揹包,一開始以為會超時,但仔細想了想發現...

GDOI2017模擬12 3 告別

給出兩個1 n的排列a和b,可以進行m次操作,每次操作隨機選擇乙個三元組 i,j,k 將這個三元組所對應的數在a中進行輪換 即i j,j k,k i 求在m次操作之內將a變成b的概率,答案對998244353取模 n 14,m 1e9 乍一看根本無法下手啊。看到n辣麼小m辣麼大就知道是矩乘可是不會做...