# 300iq Contest 1

## Best Subsequence

``````#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
set<pair<int, int>> q;
int n, k, a[N], pre[N], nxt[N];
int main()
{
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
pre[i] = (i - 1 + n) % n;
nxt[i] = (i + 1) % n;
}
for (int i = 0; i < n; ++i)
q.emplace(a[i] + a[nxt[i]], i);
while (q.size() > k)
{
int x = q.rbegin()->second;
if (a[x] < a[nxt[x]])
x = nxt[x];
q.erase({a[x] + a[nxt[x]], x});
q.erase({a[pre[x]] + a[x], pre[x]});
q.emplace(a[pre[x]] + a[nxt[x]], pre[x]);
nxt[pre[x]] = nxt[x];
pre[nxt[x]] = pre[x];
}
printf("%d", q.rbegin()->first);
}
``````

### 现场打了个二分+DP+离散化+树状数组前缀最小值

``````#include <bits/stdc++.h>
using namespace std;
typedef int ll;
const int N = 2e5 + 9, INF = 2e9 + 9;
int n, k, a[N];
struct Ranker : vector<ll>
{
void init() { sort(begin(), end()), resize(unique(begin(), end()) - begin()); }
int ask(ll x) const { return lower_bound(begin(), end(), x) - begin(); }
} rk;
struct Fenwick : vector<ll>
{
Fenwick(int n) : vector<ll>(n, 0) {}
{
ll r = 0;
for (; x; x -= x & -x)
r = max(r, at(x));
return r;
}
void upd(int x, ll val)
{
for (; x < size(); x += x & -x)
at(x) = max(at(x), val);
}
};
int ok(int m)
{
Fenwick t(rk.size() + 9);
t.upd(rk.ask(a[1]) + 2, 1);
for (int i = 2; i <= n; ++i)
if (m - a[i] > 0)
{
ll now = t.ask(rk.ask(m - a[i] + 1) - 1 + 2);
if (now > 0)
{
if (m - a[i] >= a[1] && now + 1 >= k)
return 1;
t.upd(rk.ask(a[i]) + 2, now + 1);
}
}
return 0;
}
int bs(int b, int e)
{
if (e - b < 2)
return e;
int m = b + (e - b >> 1);
return ok(m) ? bs(b, m) : bs(m, e);
}
int main()
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]), rk.push_back(a[i]);
rk.push_back(INF);
rk.push_back(-INF);
rk.init();
rotate(a + 1, min_element(a + 1, a + n + 1), a + n + 1);
printf("%d", bs(0, INF));
}
``````

## Cool Pairs

``````#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 3e5 + 9;
ll n, k, a[N], b[N], c[N];
int main()
{
scanf("%lld%lld", &n, &k);
for (ll i = 0, x; i < n; ++i)
{
scanf("%lld", &x), --x;
a[x] = i - n;
b[x] = n;
}
for (ll i = 0, x; k && i < n; ++i)
{
scanf("%lld", &x), --x;
if (k >= x)
{
k -= x;
b[x] = -n;
}
else
{
copy(a, a + x, c);
nth_element(c, c + k - 1, c + x);
b[x] = -c[k - 1] - 1;
k = 0;
}
}
printf("Yes\n");
for (ll i = 0; i < n; ++i)
printf("%lld ", a[i]);
printf("\n");
for (ll i = 0; i < n; ++i)
printf("%lld ", b[i]);
}
``````

## Free Edges

``````#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
vector<int> g[N];
int n, m, vis[N];
void dfs(int u)
{
vis[u] = 1;
for (int to : g[u])
if (!vis[to])
dfs(to);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0, x, y; i < m; ++i)
{
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 1; i <= n; ++i)
if (!vis[i])
dfs(i), ++m;
printf("%d", m - n);
}
``````