-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2f60065
commit dea0f6f
Showing
8 changed files
with
395 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
/* Bismillahir Rahmanir Rahim */ | ||
|
||
#include <bits/stdc++.h> | ||
|
||
#define rep(i, n) for(int i=0;i<n;i++) | ||
#define repn(i, n) for(int i=1;i<=n;i++) | ||
#define set(i, n) memset(i, n, sizeof(i)) | ||
|
||
#define pb push_back | ||
|
||
using namespace std; | ||
|
||
const int N = 5005; | ||
const long long oo = 1e18; | ||
|
||
int n, vis[N]; | ||
long long val[N]; | ||
vector<int>g[N], gg[N]; | ||
|
||
long long solve(int at){ | ||
set(vis, 0); | ||
rep(i, N) gg[i].clear(); | ||
queue<int>q; | ||
stack<int>s; | ||
q.push(at); vis[at] = 1; | ||
while(!q.empty()){ | ||
int u = q.front(); q.pop(); | ||
s.push(u); | ||
for(auto v : g[u]){ | ||
if(vis[v]) continue; | ||
vis[v] = 1; | ||
gg[u].push_back(v); | ||
q.push(v); | ||
} | ||
} | ||
long long ret = 0; | ||
while(!s.empty()){ | ||
int i = s.top(); s.pop(); | ||
val[i] = 1; | ||
for(auto u : gg[i]) val[i] += val[u]; | ||
ret += val[i]; | ||
} | ||
repn(i, n) if(vis[i] == 0) return oo; | ||
return ret; | ||
} | ||
|
||
int main(){ | ||
int x, y, k; | ||
scanf("%d", &n); | ||
repn(i, n){ | ||
scanf("%d", &k); | ||
while(k--){ | ||
scanf("%d", &x); | ||
g[x].pb(i); | ||
} | ||
} | ||
long long ret = oo; | ||
repn(i, n) ret = min(ret, solve(i)); | ||
printf("%lld\n", ret); | ||
return 0; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* Bismillahir Rahmanir Rahim */ | ||
|
||
#include <bits/stdc++.h> | ||
|
||
#define rep(i, n) for(int i=0;i<n;i++) | ||
#define repn(i, n) for(int i=1;i<=n;i++) | ||
#define set(i, n) memset(i, n, sizeof(i)) | ||
|
||
#define pb push_back | ||
|
||
using namespace std; | ||
|
||
typedef pair<int, long long> pii; | ||
|
||
const int N = 200005; | ||
const long long oo = 1e18; | ||
|
||
int n, m, k, im[N], uu[N], vv[N], par[N]; | ||
vector<pii>g[N], roads; | ||
long long dis[N][3]; | ||
|
||
void bfs(int at, int id){ | ||
rep(i, N) dis[i][id] = oo; | ||
dis[at][id] = 0; | ||
priority_queue<pii>q; | ||
q.push({0, at}); | ||
while(!q.empty()){ | ||
pii f = q.top(); q.pop(); | ||
int u = f.second; | ||
for(auto v : g[u]){ | ||
if(dis[v.first][id] > dis[u][id] + v.second){ | ||
dis[v.first][id] = dis[u][id] + v.second; | ||
q.push({-dis[v.first][id], v.first}); | ||
} | ||
} | ||
} | ||
} | ||
|
||
bool Check(int mask, int bit){ return mask & (1 << bit); } | ||
|
||
int Find(int at){ | ||
return par[at] == at ? at : par[at] = Find(par[at]); | ||
} | ||
|
||
void brute(){ | ||
repn(i, k) im[i]--; | ||
long long ret = oo; | ||
int a, b; | ||
sort(roads.begin(), roads.end()); | ||
for(int mask=1;mask<(1<<n);mask++){ | ||
bool flag = true; | ||
repn(i, k) if(!Check(mask, im[i])) flag = false; | ||
if(!flag) continue; | ||
long long ans = 0, comp = __builtin_popcount(mask); | ||
rep(i, n) par[i] = i; | ||
for(auto u : roads){ | ||
a = uu[u.second] - 1, b = vv[u.second] - 1; | ||
if(!Check(mask, a)) continue; | ||
if(!Check(mask, b)) continue; | ||
if(Find(a) == Find(b)) continue; | ||
par[Find(a)] = Find(b); | ||
ans += u.first; comp--; | ||
} | ||
if(comp == 1) ret = min(ret, ans); | ||
} | ||
printf("%lld\n", ret); | ||
} | ||
|
||
int main(){ | ||
int x, y, c; | ||
scanf("%d %d %d", &n, &k, &m); | ||
repn(i, k) scanf("%d", &im[i]); | ||
repn(i, m){ | ||
scanf("%d %d %d", &uu[i], &vv[i], &c); | ||
g[uu[i]].pb({vv[i], c}); | ||
g[vv[i]].pb({uu[i], c}); | ||
roads.pb({c, i}); | ||
} | ||
if(n <= 20 && m <= 40){ | ||
brute(); | ||
return 0; | ||
} | ||
assert(k == 3); | ||
bfs(im[1], 0); | ||
bfs(im[2], 1); | ||
bfs(im[3], 2); | ||
long long ret = oo; | ||
repn(i, n) ret = min(ret, dis[i][0] + dis[i][1] + dis[i][2]); | ||
printf("%lld\n", ret); | ||
return 0; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
Boss 100 pt | ||
Cities 36 pt |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* Bismillahir Rahmanir Rahim */ | ||
|
||
#include <bits/stdc++.h> | ||
|
||
#define rep(i, n) for(int i=0;i<n;i++) | ||
#define repn(i, n) for(int i=1;i<=n;i++) | ||
#define set(i, n) memset(i, n, sizeof(i)) | ||
|
||
#define pb push_back | ||
|
||
using namespace std; | ||
|
||
typedef pair<int, int> pii; | ||
|
||
const int N = 500005; | ||
|
||
int n, m, o; | ||
pii t[N*4], a[N], b[N]; | ||
|
||
void build(int l, int r, int id){ | ||
if(l == r){ | ||
t[id] = make_pair(b[l].second, l); | ||
return; | ||
} | ||
int mid = (l + r) / 2; | ||
build(l, mid, 2*id); | ||
build(mid+1, r, 2*id+1); | ||
t[id] = max(t[2*id], t[2*id+1]); | ||
} | ||
|
||
void update(int l, int r, int id, int pos){ | ||
if(l == r){ | ||
t[id] = make_pair(0, l); | ||
return; | ||
} | ||
int mid = (l + r) / 2; | ||
if(pos <= mid) update(l, mid, 2*id, pos); | ||
else update(mid+1, r, 2*id+1, pos); | ||
t[id] = max(t[2*id], t[2*id+1]); | ||
} | ||
|
||
pii get(int l, int r, int id, int x, int y){ | ||
if(y < l || r < x || x > y) return make_pair(-1, -1); | ||
if(x <= l && r <= y) return t[id]; | ||
int mid = (l + r) / 2; | ||
return max(get(l, mid, 2*id, x, y), get(mid+1, r, 2*id+1, x, y)); | ||
} | ||
|
||
int bs(int val){ | ||
int lo = 1, hi = m, ret = 0; | ||
while(lo <= hi){ | ||
int mid = (lo + hi) / 2; | ||
if(b[mid].first <= val) ret = mid, lo = mid + 1; | ||
else hi = mid - 1; | ||
} | ||
return ret; | ||
} | ||
|
||
int main(){ | ||
scanf("%d %d %d", &n, &m, &o); | ||
repn(i, n) scanf("%d %d", &a[i].first, &a[i].second); | ||
repn(i, m) scanf("%d %d", &b[i].second, &b[i].first); | ||
sort(a+1, a+1+n); | ||
sort(b+1, b+1+m); | ||
build(1, m, 1); | ||
long long ret = 0; | ||
vector<long long>v; | ||
repn(i, n){ | ||
pii f = get(1, m, 1, 1, bs(a[i].second)); | ||
|
||
if(f.first < a[i].first) continue; | ||
|
||
update(1, m, 1, f.second); | ||
|
||
v.push_back(f.first - a[i].first); | ||
} | ||
sort(v.begin(), v.end()); | ||
reverse(v.begin(), v.end()); | ||
o = min(o, int(v.size())); | ||
rep(i, o) ret += v[i]; | ||
printf("%lld\n", ret); | ||
return 0; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
Hotel 100 pt | ||
Teams 100 pt | ||
Traffic 30 pt |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/* Bismillahir Rahmanir Rahim */ | ||
|
||
#include <bits/stdc++.h> | ||
|
||
#define rep(i, n) for(int i=0;i<n;i++) | ||
#define repn(i, n) for(int i=1;i<=n;i++) | ||
#define set(i, n) memset(i, n, sizeof(i)) | ||
|
||
#define pb push_back | ||
#define gc getchar_unlocked | ||
#define f first | ||
#define s second | ||
|
||
using namespace std; | ||
|
||
const int N = 1000005; | ||
const int oo = 1e9; | ||
const int SQ = 1000; | ||
|
||
typedef pair<int, int>pii; | ||
|
||
void scanF(int &x){ | ||
register int c = gc(); | ||
x = 0; | ||
for(;(c<48 || c>57);c = gc()); | ||
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;} | ||
} | ||
|
||
int n, mx, lst[N]; | ||
pii A[N], dp[N], dummy; | ||
|
||
void init(){ | ||
sort(A+1, A+1+n); | ||
dp[0] = make_pair(0, 0); | ||
for(int i=1;i<=n;i++){ | ||
dp[i] = dp[i-1]; | ||
if(i - A[i].f > 0) dp[i] = max(dp[i], make_pair(dp[ i - A[i].f ].f + 1, 0)); | ||
} | ||
mx = dp[n].f; | ||
} | ||
|
||
void reset(){ | ||
dummy = make_pair(-oo, +oo); | ||
rep(i, N) dp[i] = dummy; | ||
} | ||
|
||
bool OK(int gap, bool print){ | ||
reset(); | ||
dp[0] = make_pair(0, 0); | ||
lst[0] = 0; | ||
for(int i=1;i<=n;i++){ | ||
lst[i] = lst[i-1]; | ||
|
||
if(A[i].first > i) continue; | ||
|
||
if(gap >= i) dp[i] = make_pair(1, 0); | ||
|
||
if(i > A[i].first){ | ||
int S = max(1, i - gap), E = i - A[i].first; | ||
if(lst[E] >= S){ | ||
pii g = dp[lst[E]]; | ||
g.f += 1, g.s = lst[E]; | ||
dp[i] = max(dp[i], g); | ||
} | ||
} | ||
|
||
if(dp[i].f >= dp[lst[i]].f) lst[i] = i; | ||
|
||
} | ||
if(!print){ | ||
if(dp[n].f >= mx) return true; | ||
else return false; | ||
} | ||
printf("%d\n", dp[n].f); | ||
int cur = n; | ||
while(cur){ | ||
int f = dp[cur].s; | ||
printf("%d", cur - f); | ||
for(int i=f+1;i<=cur;i++) printf(" %d", A[i].s); | ||
printf("\n"); | ||
cur = f; | ||
} | ||
return true; | ||
} | ||
|
||
int main(){ | ||
scanF(n); | ||
repn(i, n) scanF(A[i].first), A[i].second = i; | ||
init(); | ||
int lo = A[n].first, hi = n, ret = n; | ||
while(lo <= hi){ | ||
int Mid = (lo + hi) / 2; | ||
if(OK(Mid, 0)) ret = Mid, hi = Mid - 1; | ||
else lo = Mid + 1; | ||
} | ||
OK(ret, 1); | ||
return 0; | ||
} | ||
|
Oops, something went wrong.