• 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;
    }
    
    
  • 相关阅读:
    [微软官方]SQLSERVER的兼容级别
    使用 OPENJSON 分析和转换 JSON 数据 (SQL Server)
    WPF 解决TreeViewItem上为IsMouseOver 时 父级Item也会 受影响
    依赖注入
    关于编译告警 C4819 的完整解决方案
    你想知道的 std::vector::push_back 和 std::vector::emplace_back
    如何使用 Dump 文件?
    关于 PDB 文件你需要知道什么?
    图解哈希表及其原理
    C++ 中的虚函数表及虚函数执行原理
  • 原文地址:https://www.cnblogs.com/loceaner/p/11837070.html
Copyright © 2020-2023  润新知