伺服器維護
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...