1. 程式人生 > 實用技巧 >8.15集訓

8.15集訓

做題

碼風沒調,題解沒寫,日後補

魔法少女

click

#include <bits/stdc++.h>
#define lson l, mid, ls[x]
#define rson mid+1, r, rs[x]
#define LL long long
#define debug
using namespace std;
//東方之珠 整夜未眠!
const int N = 4e5+66;

int ls[N * 19], rs[N * 19], si[N * 19];
int n, tot, f[N], root[N], tag[N * 19];
int m = 1e9;
double sum[N * 19];

inline void pushdown(int x) {
	if (tag[x]) {
		si[ls[x]] = si[rs[x]] = 0;
		sum[ls[x]] = sum[rs[x]] = 0;
		tag[ls[x]] = tag[rs[x]] = 1;
		tag[x] = 0;
	}
}

inline int find(int x) {return f[x] == x ? f[x] : f[x] = find(f[x]);}

inline void add(int p, int a, double v, int l, int r, int &x)
{
	if (!x) x = ++ tot;
	si[x] += a, sum[x] += a*v;
	if (l == r) return;
	pushdown(x);
	int mid = (l + r) >> 1;
	if (p <= mid) add(p, a, v, lson);
	else add(p, a, v, rson);
}

inline void del(int b, int e, int l, int r, int x) 
{
	if (!x) return;
	if (b <= l && r <= e)
	{
		si[x] = 0, sum[x] = 0, tag[x] = 1;
		return;
	}
	pushdown(x);
	int mid = (l + r) >> 1;
	if (b <= mid) del(b, e, lson);
	if (e > mid) del(b, e, rson);
	si[x] = si[ls[x]] + si[rs[x]];
	sum[x] = sum[ls[x]] + sum[rs[x]];
}

inline int querysi(int b, int e, int l, int r, int x)
{
	if (!x) return 0;
	if (b <= l && r <= e) return si[x];
	pushdown(x);
	int mid = (l + r) >> 1, res = 0;
	if (b <= mid) res += querysi(b, e, lson);
	if (e > mid) res += querysi(b, e, rson);
	return res;
}

inline int find(int k, int l, int r, int x)
{
	if (l == r) return l;
	pushdown(x);
	int mid = (l + r) >> 1;
	if (k <= si[ls[x]]) return find(k, lson);
	else return find(k - si[ls[x]], rson);
}

inline int merge(int x, int y) 
{
	if (!x || !y) return x+y;
	si[x] += si[y], sum[x] += sum[y];
	pushdown(x);
	pushdown(y);
	ls[x] = merge(ls[x], ls[y]);
	rs[x] = merge(rs[x], rs[y]);
	return x;
}


inline int thestars()
{
	int T, c, x, y, t;
	scanf ("%d", &T);
	while (T --)
	{
		scanf ("%d%d", &c, &x);
		switch(c)
		{
			case 1: add(x, 1, log(x), 1, m, root[++ n]), f[n] = n; break;
			case 2:
			{
				scanf ("%d", &y);
				x = find(x), y = find(y);
				if (x != y)
				{
					f[y] = x;
					root[x] = merge(root[x], root[y]);
				}
				break;
			}
			case 3:
			{
				x = find(x); scanf ("%d", &y);
				t = querysi(1, y, 1, m, root[x]);
				del(1, y, 1, m, root[x]);
				add(y, t, log(y), 1, m, root[x]);
				break;
			}
			case 4:
			{
				x = find(x);  scanf ("%d", &y);
				t = querysi(y, m, 1, m, root[x]);
				del(y, m, 1, m, root[x]);
				add(y, t, log(y), 1, m, root[x]);
				break;

			}
			case 5: 
			{
				x = find(x); scanf ("%d", &y);
				cout << find(y, 1, m, root[x]) << '\n';
				break;
			}
			case 6:
			{
				x = find(x); scanf ("%d", &y);
				y = find(y);
				printf("%d\n", sum[root[x]] > sum[root[y]]);
				break;
			}
			default : x = find(x); cout << si[root[x]] << '\n';
		}
	}
	return 0;
}

int youngore = thestars();

signed main() {;}

大陸爭霸

click

#include <bits/stdc++.h>
#define LL long long
#define debug
using namespace std;
//東方之珠 整夜未眠!
typedef pair<int, int> pr;
const int N = 1e5+66;

priority_queue<pr, vector<pr>, greater<pr> >q;
vector<int>p[N];

int to[N], nex[N], head[N], cnt;
int len[N], c[N];
int f[N], g[N], v[N];

inline void add(int x, int y, int z) {
	to[++ cnt] = y;
	len[cnt] = z;
	nex[cnt] = head[x];
	head[x] = cnt;
}

inline int thestars()
{
	memset(f, 0x3f, sizeof f), memset(g, 0x3f, sizeof g);
	int i, j, k, n, m, res(0);
	int x, y, z;
	scanf ("%d%d", &n, &m);
	for (i = 1; i <= m; ++ i)
	{
		scanf ("%d%d%d", &x, &y, &z);
		add(x, y, z);
	}
	for (i = 1; i <= n; ++ i)
	{
		scanf ("%d", c + i);
		for (j = 1; j <= c[i]; ++ j)
		{
			scanf ("%d", &x);
			p[x].push_back(i);
		}
		if (!c[i]) g[i] = 0;
	}
	f[1] = 0, q.push(pr(0, 1));
	while (!q.empty()) 
	{
		z = q.top().first, x = q.top().second, q.pop();
		if (v[x]) continue;
		v[x] = 1;
		for (i = head[x]; i; i = nex[i])
		{
			y = to[i];
			if (f[y] > z + len[i])
			{
				f[y] = z + len[i];
				if (!c[y]) q.push(pr(max(f[y], g[y]), y));
			}
		}
		for (i = 0; i < (int)p[x].size(); ++ i)
		{
			y = p[x][i];
			-- c[y];
			if (!c[y])
			{
				g[y] = z;
				q.push(make_pair(max(f[y], g[y]), y));
			}
		}
	}
	cout << max(f[n], g[n]);
	return 0;
}

int youngore = thestars();

signed main() {;}

小豬

click

//bu bi yong vector
// dui x qu chu low
#include <bits/stdc++.h>
#define LL long long
#define debug
using namespace std;
//東方之珠 整夜未眠!
const int N = 1e6+66;

struct edge{int to, nex;}e[N]; int head[N], bian;

inline void add(int x, int y)
{
	e[++ bian].to = y;
	e[bian].nex = head[x];
	head[x] = bian;
}

int dfn[N], low[N], sta[N], in[N], tar[N];
int tp, tot, cnt, cd[N];

inline void tarjan(int x) {
	int i, y;
	dfn[x] = low[x] = ++ tot;
	sta[++ tp] = x, in[x] = 1;
	for (i = head[x]; i; i = e[i].nex)
	{
		y = e[i].to;
		if (!dfn[y])
		{
			tarjan(y);
			low[x] = min(low[x], low[y]);
		} 
		else if (in[y]) low[x] = min(low[x], dfn[y]);
	}
	if (low[x] == dfn[x])
	{
		++ cnt;
		do {
			y = sta[tp --];
			in[y] = 0;
			tar[y] = cnt;
		} while (y != x);
	}
}

inline int thestars()
{
	int i, j, x, y, n, res(0);
	cin >> n;
	for (i = 1; i <= n; ++ i) scanf ("%d", &x), add(i, x);
	for (i = 1; i <= n; ++ i) if (!dfn[i]) tarjan(i);
	for (x = 1; x <= n; ++ x)
	{
		for (i = head[x]; i; i = e[i].nex)
		{
			y = e[i].to;
			if (tar[x] == tar[y]) continue;
			else cd[tar[x]] = 1;
		}
	}
	for (i = 1; i <= cnt; ++ i) if (!cd[i]) ++ res;
	cout << res;
	return 0;
}

int youngore = thestars();

signed main() {;}

食物鏈

click

#include <bits/stdc++.h>
#define int long long
#define debug
using namespace std;
//東方之珠 整夜未眠!
const int N = 5e5+66;
 
queue<int>q;
int rd[N], cd[N], f[N];
int to[N], nex[N], head[N], cnt;

inline void add(int x, int y)
{
	to[++ cnt] = y;
	nex[cnt] = head[x];
	head[x] = cnt;
}
//f[i] has showed that from which zero to i's ways
inline int thestars()
{
	int i, x, y, n, m, res(0);
	cin >> n >> m;
	for (i = 1; i <= m; ++ i)
	{
		scanf ("%lld%lld", &x, &y);
		add(x, y);
		++ rd[y];
		++ cd[x];
	}
	for (i = 1; i <= n; ++ i)
	{
		if (!rd[i]) 
		{
			if (cd[i]) f[i] = 1;
			q.push(i);
		}
	}
	while (!q.empty())
	{
		x = q.front(); q.pop();
		for (i = head[x]; i; i = nex[i])
		{
			y = to[i];
			f[y] += f[x];
			-- rd[y];
			if (!rd[y]) q.push(y);
		}
	}
	for (i = 1; i <= n; ++ i) if (!cd[i]) res += f[i];
	cout << res;
	return 0;
}

int youngore = thestars();

signed main() {;}

BLO

click

割點經典好題

#include <bits/stdc++.h>
#define LL long long
#define debug
using namespace std;
//東方之珠 整夜未眠!
const int N = 5e5+66;

int to[N<<1], head[N<<1], nex[N<<1], cnt;

inline void add(int x, int y)
{
	to[++ cnt] = y;
	nex[cnt] = head[x];
	head[x] = cnt;
}

int low[N], dfn[N], si[N], cut[N];
int n, m, tot;
LL ans[N];

inline void tarjan(int x) 
{
	int i, y;
	low[x] = dfn[x] = ++ tot, si[x] = 1;
	int flag(0), sum(0);
	for (i = head[x]; i; i = nex[i])
	{
		y = to[i];
		if (! dfn[y])
		{
			tarjan(y);
			si[x] += si[y];
			low[x] = min(low[x], low[y]);
			if (low[y] >= dfn[x])
			{
				++ flag;
				ans[x] += (LL)si[y] * (n - si[y]);
				sum += si[y];
				if (x != 1 || flag > 1) cut[x] = 1;
			}
		} else low[x] = min(low[x], dfn[y]);
	}
	if (cut[x]) ans[x] += (LL)(n - sum - 1) * (sum + 1) + (n - 1);
	//dui yu ge dian (n-1) duiying dandu yige dian deqingkuang
	//yijingjisuanle size[s1....sk]de qingkuang
	//(n - sum - 1) * (sum + 1)shi nage zitu
	else ans[x] = (n - 1)<<1;
}

inline int thestars()
{
	int i, x, y;
	cin >> n >> m;
	cnt = 1;
	for (i = 1; i <= m; ++ i){
		scanf ("%d%d", &x, &y);
		if (x == y) continue;
		add(x, y);
		add(y, x);
	}
	tarjan(1);
	for (i = 1 ; i <= n; ++ i) cout << ans[i] << '\n';
	return 0;
}

int youngore = thestars();

signed main() {;}