vijos1901 學姐的錢包

2021-07-07 03:48:07 字數 2501 閱讀 3267

學姐每次出門逛街都要帶恰好m元錢, 不過她今天卻忘記帶錢包了.

可憐的doc只好自己湊錢給學姐, 但是他口袋裡只有一元錢.

好在doc的n位朋友們都特別有錢, 他們答應與doc作一些交換.

其中第i位朋友說:

如果doc有不少於ri元錢,

doc可以把手上所有的錢都給這位朋友,

並從這位朋友手中換回vi元錢,

但是這次交換會浪費ti的時間.

doc希望可以在最短的時間內換到m元錢(其實是可以大於m的, 因為doc可以存私房錢呢), 否則學姐會生氣的!

輸入資料第一行給定t, 表示總的詢問次數.

對於每一次詢問, 第一行給出兩個整數n和m.

之後n行, 每一行給出三個整數vi, ri和ti. (保證ri<=vi).

對於每一次詢問, 首先輸出詢問的編號, 參見樣例輸出.

之後輸出最小需要的時間, 如果不可能完成目標, 則輸出-1.

3

5 95 1 1

10 4 10

8 1 10

11 6 1

7 3 8

4 52 1 1

3 2 1

4 3 1

8 4 1

3 10

5 1 3

8 2 5

10 9 2

case #1: 10

case #2: 4

case #3: -1

對於40%的資料

n <= 1500.

對於100%的資料

t <= 5

1 <= n <= 100000.

1 <= m <= 1000000000.

1 <= ri <= vi <= 1000000000.

1 <= ti <= 1000000000.

因為大於等於r[i]的錢可以換v[i],類似從乙個區間轉化到乙個點,所以這道題我們可以選擇逆推,這樣就可以將每次修改的操作轉化為用點的相關值來修改區間的相關值。(這裡解釋並不是很清楚…大家自己意會吧…)

用f[i]表示從大於等於m的點到i的最短時間。

首先按照v[i]從大到小排序。(這是為了保證每次更新的正確性)

再依次用f[v[i]]+t[i]更新[r[i],inf]的所有f值。顯然f具有單調不增性,所以只需要更新[r[i],v[i]-1]的所有f值即可。

那麼問題就轉化為區間修改和單點查詢,用線段樹解決。

因為資料範圍很大,所以要用到離散化。

注:這道題用到的逆推和排序思路很不錯。

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define pa pair#define maxn 500010

#define inf 1000000000000000ll

using namespace std;

int tt,n,m,a[maxn],b[maxn],c[maxn];

ll ti[maxn];

struct tree_type

t[maxn*4];

int read()

while (ch>='0'&&ch<='9')

return ret*flag;

}bool cmp1(int x,int y)

void build(int k,int l,int r)

void update(int k,ll z)

void pushdown(int k)

void pushup(int k)

void change(int k,int x,int y,ll z)

pushdown(k);

if (y<=mid) change(k<<1,x,y,z);

else if (x>mid) change(k<<1|1,x,y,z);

else change(k<<1,x,mid,z),change(k<<1|1,mid+1,y,z);

pushup(k);

}ll query(int k,int x)

int main()

f(i,1,n) c[i]=i;

sort(c+1,c+n+1,cmp2);

build(1,1,tot);

change(1,b[2*n+1],tot,0);

f(i,1,n)

ll ans=query(1,b[2*n+2]);

printf("case #%d: ",ii);

if (ans==inf) printf("-1\n");

else printf("%lld\n",ans);

} return 0;

}

Vijos 1901 學姐的錢包(線段樹優化dp)

題目鏈結 分析 學長講的線段樹例題 我們可以將錢數看做是乙個數軸 將一次交換看成數軸上的乙個線段 r i v i r i v i 那麼題目就可以視為帶權值的線段覆蓋問題 如果不帶權值,就是貪心的經典問題 而此問題我們需要用dp解決 設計狀態 f i f i 表示換成錢數 i i 的最小花費 我們把所...

1901 賞賜 OR 災難

time limit 1 sec memory limit 128 mb submitted 418 solved 110 大g南征北戰終於打下了大片土地成立了g國,大g在開國大典上傳召幫助自己南征北戰的三大開國元勳小a,小b,小c進殿,並要賞賜三人大量寶物以顯示天恩浩蕩。大g在征服其他國家的時候搶...

vue 使用技巧總結 19 01

上面的函式中使用箭頭,會導致 this 捕獲不到 vue 例項。各位道友切記切記.目前通常使用的方式是 然後在查資料的時候翻到了乙個統一管理的方式 asynccomponent.js 檔案 export const component01 import views export const comp...