2019.11.09考试解题报告

2019.11.09考试解题报告

总结

期望得分:(100+ 30 + 40 = 170)
实际得分:(100 + 50 + 40 = 190)

简单记录一下


思路&&代码

T1

(n^2算法)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int A = 1e5 + 11;
const int B = 1e6 + 11;

inline int read() {
	char c = getchar(); int x = 0, f = 1;
	for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
	for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
	return x * f;
}

int n, m, all, cnt;
int d[A], w[A], a[A], la[A];

inline bool check(int x) {
	memset(la, 0, sizeof(la));
	for(int i = 1; i <= n; i++) a[i] = d[i];
	for(int i = 1; i <= x; i++) if(a[i]) a[la[a[i]]] = 0, la[a[i]] = i; 
	int tl = 0, cnt = 0;
	for(int i = 1; i <= x; i++) {
		if(a[i]) { tl -= w[a[i]]; if(tl < 0) return 0; else cnt++; }
		else tl++;
	}
	return cnt == m; 
}

int main() {
	freopen("generals.in", "r", stdin);
	freopen("generals.out", "w", stdout);
	n = read(), m = read();
	if(n < m) return puts("-1"), 0;
	for(int i = 1; i <= n; i++) d[i] = read();
	for(int i = 1; i <= m; i++) w[i] = read(), all += w[i];
	if(all > n) return puts("-1"), 0;
	int l = 0, r = n, ans = -1;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if(check(mid)) ans = mid, r = mid - 1;
		else l = mid + 1;
	}
	return cout << ans << '
', 0;
}

*/

T2

找规律

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;

const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;

inline int read() {
	char c = getchar(); int x = 0, f = 1;
	for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
	for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
	return x * f;
}

int n, m, a[A], k, ans = 0, pd[A];

int power(int a, int b, int res = 1) {
	if(a == 0 && b == 0) return 1;
	while(b) {
		if(b & 1) res = res * a % mod;
		a = a * a % mod; b >>= 1;
	} return res;
}

int an[100][100];


signed main() {
	freopen("transfer.in", "r", stdin);
	freopen("transfer.out", "w", stdout);
	an[1][1] = 1;
	an[2][1] = 1,an[2][2] = 2;
	an[3][1] = 4,an[3][2] = 2,an[3][3] = 9;
	an[4][1] = 27,an[4][2] = 8,an[4][3] = 9,an[4][4] = 64;
	an[5][1] = 256,an[5][2] = 54,an[5][3] = 36,an[5][4] = 64,an[5][5] = 625;
	an[6][1] = 3125,an[6][2] = 512,an[6][3] = 243,an[6][4] = 256,an[6][5] = 625,an[6][6] = 7776;
	an[7][1] = 46656,an[7][2] = 625,an[7][3] = 2304,an[7][4] = 1728,an[7][5] = 2500,an[7][6] = 7776,an[7][7] = 117649;
	int T = read();
	while(T--) {
		n = read(), k = read();
		if(k == n) {
			int now = power(n, n - 1) % mod;
			now = (now % mod + mod) % mod;
			cout << now << '
';
			continue;
		} else if(k == 1) {
			int now = power(n - 1, n - 1) % mod;
			now = (now % mod + mod) % mod;
			cout << now << '
';
			continue;
		} else if(n <= 7) {
			cout << an[n][k] % mod << '
';
			continue;
		} else {
			int oo = power(n - k, n - k) % mod * power(k, k - 1);
			oo = (oo % mod + mod) % mod;
			cout << oo << '
';
			continue;
		}
	}
	return 0;
}


T3

树形(DP)预处理,然后伪(O(1))查询(快速幂呀~~)

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int mod = 1e9 + 7;
const int A = 2e5 + 11;
const int B = 2e3 + 11;

inline int read() {
	char c = getchar();
	int x = 0, f = 1;
	for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
	for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
	return x * f;
}

int n, m, ans;
struct node { int to, nxt, val; } e[A << 1];
int head[A], cnt, dis[B][B], o[A][2];

inline void add(int from, int to, int val) {
	e[++cnt].to = to;
	e[cnt].nxt = head[from];
	e[cnt].val = val;
	head[from] = cnt;
}

int power(int a, int b, int res = 1) {
	while(b) {
		if(b & 1) res = res * a % mod;
		a = a * a % mod; b >>= 1;
	} return res;
}

int tot[A][2], siz[A][2], f[A][2];

void dfs1(int now, int fa, int ww) {
	f[1][ww & 1] += ww, f[1][ww & 1] %= mod;
	tot[1][ww & 1]++;
	siz[now][0] = 1;
	for(int i = head[now]; i; i = e[i].nxt) {
		int to = e[i].to;
		if(to == fa) continue;
		dfs1(to, now, ww + e[i].val);
		if(e[i].val & 1) siz[now][0] += siz[to][1], siz[now][1] += siz[to][0];
		else siz[now][0] += siz[to][0], siz[now][1] += siz[to][1];
	}
}

void dfs2(int now, int fa) {
	for(int i = head[now]; i; i = e[i].nxt) {
		int to = e[i].to;
		if(to == fa) continue;
		if(e[i].val & 1) {
			tot[to][0] = tot[now][1], tot[to][1] = tot[now][0];
			f[to][1] = (((f[now][0] % mod + e[i].val * (tot[to][1] - 2 * siz[to][1]) % mod) % mod) % mod) % mod;
			f[to][0] = (((f[now][1] % mod + e[i].val * (tot[to][0] - 2 * siz[to][0]) % mod) % mod) % mod) % mod;
		} else {
			tot[to][0] = tot[now][0], tot[to][1] = tot[now][1];
			f[to][1] = (((f[now][1] % mod + e[i].val * (tot[to][1] - 2 * siz[to][1]) % mod) % mod) % mod) % mod;
			f[to][0] = (((f[now][0] % mod + e[i].val * (tot[to][0] - 2 * siz[to][0]) % mod) % mod) % mod) % mod;
		}
		dfs2(to, now);
	}
}

signed main() {
	freopen("meet2.in", "r", stdin);
	freopen("meet.out", "w", stdout);
	n = read(), m = read();
	for(int i = 1, u, v, w; i < n; i++) {
		u = read(), v = read(), w = read();
		add(u, v, w), add(v, u, w);
	}
	dfs1(1, 0, 0), dfs2(1, 0);
	while(m--) {
		int x = read(), y = read();
		int qwq = f[x][y] % mod * power(tot[x][y], mod - 2) % mod;
		qwq = (qwq % mod + mod) % mod; cout << qwq << '
';
	}
	return 0;
}

原文地址:https://www.cnblogs.com/loceaner/p/11837070.html