Skip to content

Commit

Permalink
commit
Browse files Browse the repository at this point in the history
  • Loading branch information
rubabredwan committed Apr 19, 2017
1 parent 2f60065 commit dea0f6f
Show file tree
Hide file tree
Showing 8 changed files with 395 additions and 0 deletions.
62 changes: 62 additions & 0 deletions Random/boi 2016/boss.cpp
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;
}

92 changes: 92 additions & 0 deletions Random/boi 2016/cities.cpp
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;
}

2 changes: 2 additions & 0 deletions Random/boi 2016/scores.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Boss 100 pt
Cities 36 pt
Empty file added Random/boi 2016/scores.md~
Empty file.
84 changes: 84 additions & 0 deletions Random/ceoi 2011/hot.cpp
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;
}

3 changes: 3 additions & 0 deletions Random/ceoi 2011/score.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Hotel 100 pt
Teams 100 pt
Traffic 30 pt
99 changes: 99 additions & 0 deletions Random/ceoi 2011/tea.cpp
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;
}

Loading

0 comments on commit dea0f6f

Please sign in to comment.