codeforces 730C (二分)
2016-10-25 19:46
225 查看
题目链接:点击这里
题意:给出n个点m条边的图,有w个工厂,已知每个工厂的挖掘机数和挖掘机单价。给出q个询问,每次询问要在某一个点获得j个挖掘机并且花费不超过a的最少时间。经过一条边的时间花费是1.如果不考虑时间因素,那么直接按照单价排序从前往后买挖掘机即可。考虑到时间有二分性质,直接二分时间。首先对询问的点做一遍bfs获得其他点到它的时间,然后二分时间,每次check时从前往后将时间内的挖掘机都买进来判断数量买够时的花费在不在a的范围内即可。这样复杂度就是O(q*m*lgn).
#include <bits/stdc++.h> using namespace std; #define maxn 5005 #define maxm maxn<<1 #define INF 1e9 struct node { int v, next; }edge[maxm]; int head[maxn], cnt; int n, m, w; struct Q { int num, price, id; bool operator < (const Q &a) const { return price < a.price; } }; vector <Q> gg; void add_edge (int u, int v) { edge[cnt].v = v, edge[cnt].next = head[u], head[u] = cnt++; } int s, d[maxn]; long long r, cost; bool vis[maxn]; queue <int> q; bool ok (int x) { long long tot = 0;//花费 long long sum = 0;//总数 for (int i = 0; i < w; i++) if (d[gg[i].id] <= x) { if (gg[i].num+sum <= r) { tot += 1LL*gg[i].num*gg[i].price; sum += gg[i].num; } else { tot += (r-sum)*gg[i].price; sum = r; } } return sum == r && tot <= cost; } void bfs () { for (int i = 1; i <= n; i++) d[i] = INF; d[s] = 0; memset (vis, 0, sizeof vis); vis[s] = 1; while (!q.empty ()) q.pop (); q.push (s); while (!q.empty ()) { int u = q.front (); q.pop (); for (int i = head[u]; i+1; i = edge[i].next) { int v = edge[i].v; if (vis[v]) continue; vis[v] = 1; d[v] = d[u]+1; q.push (v); } } int l = 0, r = n; long long tmp;//花费 int Min; while (r-l > 1) { int mid = (l+r)>>1; if (ok (mid)) r = mid; else l = mid; } if (ok (l)) printf ("%d\n", l); else if (ok (r)) printf ("%d\n", r); else printf ("-1\n"); } int main () { //freopen ("more.in", "r", stdin); cin >> n >> m; memset (head, -1, sizeof head); cnt = 0; for (int i = 0; i < m; i++) { int u, v; scanf ("%d%d", &u, &v); add_edge (u ,v); add_edge (v, u); } cin >> w; gg.clear (); for (int i = 0; i < w; i++) { int c, k, p; scanf ("%d%d%d", &c, &k, &p); gg.push_back ((Q) {k, p, c}); } sort (gg.begin (), gg.end ()); int q; cin >> q; while (q--) { scanf ("%d%lld%lld", &s, &r, &cost); bfs (); } return 0; }
相关文章推荐
- Codeforces 385C Bear and Prime Numbers(素数打表,二分)
- Codeforces 165C(二分)
- Codeforces-448【A数学函数ceil】【B思维】【D二分】
- Codeforces 670D2:Magic Powder - 2(二分)
- codeforces 782/problem/B [二分]
- Codeforces 474E Pillars【Dp+线段树+二分+离散化】好题~
- 【Codeforces】-702B-Powers of Two(二分)
- 【Codeforces 817C. Really Big Numbers】+ 二分
- CodeForces 614D 二分+贪心
- CodeForces 492D Vanya and Computer Game [二分]
- codeforces 731D (DP 二分 二维RMQ)
- CodeForces 782B The Meeting Place Cannot Be Changed (二分)
- Codeforces 535C Tavas and Karafs(二分)
- codeForces-743E Vladik and cards(状压+记忆化搜索+二分)
- Codeforces 743E(二分+状压dp)
- [Codeforces 147B Smile House] DP+倍增+二分
- CodeForces 483B 二分答案
- Codeforces 847 B. Preparing for Merge Sort (二分)
- Codeforces 570D Tree Requests【Dfs序+二分】好题!
- Codeforces 471C MUH and House of Cards【找规律+二分】