FJUT2019暑假第二次周賽 A題

2022-03-11 18:17:43 字數 3637 閱讀 8916

伺服器維護

timelimit:1500ms memorylimit:128mb

64-bit integer io format:%lld

problem description

dsc最大的夢想就是有一款屬於自己的遊戲(不可能的),可以把自己的奇思妙想在虛擬的世界中創造出來,假設dsc成功了,創造出了一款網遊(小作坊的那種),現在為了節省成本,dsc決定自己維護伺服器健康,但總會有沒時間的時候。

假設從s分鐘開始,e分鐘結束[s,e]這段時間dsc是沒有時間的,這時候dsc需要找人來維護伺服器,當然是有償的。在[s,e]這段時間中有n個人有空餘時間(不一定是全部[s,e])第i個人在ai,bi這段時間有空,共需要ci的管理費。

現在請幫dsc算一算,在他沒空的時間內[s,e],每天都至少有乙個人在管理伺服器所需要的最少花費是多少,如果沒有任何方案使[s,e]時間內每天都至少有乙個人在管理伺服器則輸出-1;

input

第一行為三個整數n,s,e分別表示有n個人有空,在[s,e]時間內dsc沒空

接下來有n行,每行3個整數ai,bi,ci分別表示第i個人在[ai,bi]時間內有空,僱傭共需要ci管理費

1<=n<=1e5

0<=s<=e<=1e5

s<=ai<=bi<=e

1<=ci<=1e5

output

dsc在沒空的時間找人管理伺服器所需的最少花費,沒有方案則輸出-1

其實這個題目就是乙個dp加上線段樹維護即可ac, 根據題意容易得知,需要區間全覆蓋,那麼我們可以考慮先按l從小到大排序維護從[s, r]所花費的最小價值,可得狀態為dp[i]代表從[s, i]區間覆蓋的最小價值。

可得狀態轉移方程為

dp[i] = min(dp[i], quert_min(l - 1, i - 1)) + w)

即可ac

#include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e5 + 15;

const ll inf = __long_long_max__;

int n, s, e;

struct segtreetree[maxn << 2];

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

int mid = (l + r) >> 1;

build(root << 1, l, mid);

build(root << 1 | 1, mid + 1, r);

tree[root].mins = min(tree[root << 1].mins, tree[root << 1 | 1].mins);

return ;

}void update(int root, int num, ll val)

int mid = (tree[root].l + tree[root].r) >> 1;

if(num <= mid)

else

tree[root].mins = min(tree[root << 1].mins, tree[root << 1 | 1].mins);

return ;

}ll query(int root, int l, int r)

int mid = (tree[root].l + tree[root].r) >> 1;

if(r <= mid)

else if(l > mid)

else

}}seg;

struct person

else

}}arr[maxn];

ll dp[maxn];

int main()

for(int i = s; i <= e; i ++)

for(int i = 0; i < s; i ++)

seg.build(1, 1, e);

sort(arr, arr + n);

for(int i = 0; i < n; i ++)

}if(dp[e] == inf)

else

return 0;

}

對於整個資料進行建圖,將區間能互相覆蓋的點連線起來,然後跑最短路徑
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) (x&(-x))

#define rep(i,a,n) for (int i=a;i<=n;i++)

#define per(i,a,n) for (int i=a;i>=n;i--)

#define mem(ar,num) memset(ar,num,sizeof(ar))

#define debug(x) cout << #x << ": " << x << endl

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int prime = 999983;

const int inf = 0x7fffffff;

const ll inff =0x7fffffffffffffff;

const double pi = acos(-1.0);

const double inf = 1e18;

const double eps = 1e-6;

const ll mod = 1e9 + 7;

const int maxn = 1e6 + 7;

const int maxm = 4e6 + 7;

int n, m, first[maxn], sign;

struct edgeedge[maxn * 2];

void init()

sign = 0;

}void addedge(int u,int v,int w)

struct node

node(int tt, ll cc):to(tt),cost(cc){}

friend bool operator < (const node &a, const node &b)

};ll dist[maxn];

int vis[maxn];

ll dijkstra(int s, int t)

priority_queueque;

que.push(node(s,0));

while(!que.empty())}}

}return dist[t] == inff ? -1 : dist[t];

}int main()

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

printf("%lld\n",dijkstra(s, t+1));

return 0;

}

第二次周賽題解

e題,不懂的看新生訓練題解 includeint main return 0 d題,乙個預處理就ok includeint a 1000005 int main int t scanf d t while t return 0 c題,打表找下規律,會發現是以1 1 2 0 2 2 1 0為迴圈 in...

第二次周賽B

有乙隻經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請程式設計計算蜜蜂從蜂房a爬到蜂房b的可能路線數。其中,蜂房的結構如下所示。input 輸入資料的第一行是乙個整數n,表示測試例項的個數,然後是n 行資料,每行包含兩個整數a和b 0sample input 21 2 3 6sample ou...

第二次周賽Problem C

在2 n的乙個長方形方格中,用乙個1 2的骨牌鋪滿方格,輸入n 輸出鋪放方案的總數.例如n 3時,為2 3方格,骨牌的鋪放方案有三種,如下圖 輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是2 n 0題解 列出1 1,2 2,3 3,4 5,5 8可以看出a n a n 1...