一拖再拖,忍无可忍,自己懒的没救了。

一周前就结束的比赛,到现在才想起来补。

最后一题貌似又遇到了splay。。。还是不会!!!shit

题目链接

A题--快速幂

 #include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; const int MOD = 1e9 + ; int mod_pow(int a, int b) {
int res = ;
while (b) {
if (b & ) res = (res * (long long)a) % MOD;
a = (a * (long long)a) % MOD;
b >>= ;
}
return res;
} int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int T;
ios::sync_with_stdio(false);
cin >> T;
while (T--) {
int t;
cin >> t;
cout << ( + mod_pow(, t + )) % MOD << endl;
}
return ;
}

B题

如果说这题的困难之处,那就是要看出来其实这种数的个数很少。所以先把所有的范围之内的数打表出来。

 #include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long LL;
#define rep(i, n) for (int i = (1); i <= (n); i++)
LL pw10[];
const LL MAX_N = (LL)1e18; int main() {
pw10[] = 1LL;
rep (i, ) pw10[i] = pw10[i - ] * ;
vector<LL> ans;
rep (i, ) ans.push_back(i);
int cur = , cur_len = , next = -;
while (true) {
if (next == - && ans[cur] * (cur_len + ) >= pw10[cur_len]) {
next = cur;
}
LL x = ans[cur] * cur_len;
if (x >= MAX_N) break;
if (pw10[cur_len - ] <= x && x < pw10[cur_len]) {
ans.push_back(x);
} else if (x >= pw10[cur_len]) {
cur = next;
next = -;
cur_len++;
continue;
}
cur++;
}
//rep (i, 25) cerr << ans[i] << endl;
int T;
cin >> T;
while (T--) {
LL A, B;
cin >> A >> B;
LL rgt = upper_bound(ans.begin(), ans.end(), B) - ans.begin();
LL lft = lower_bound(ans.begin(), ans.end(), A) - ans.begin();
LL res = rgt - lft;
if (A == ) res++;
cout << res << endl;
} return ;
}

C题

题意:给出N个结点的树,每个结点有一个权值,在树上有一种操作,可以任选一个结点,然后删除以该结点为根的子树。最多执行K次这种操作

   使得树上的权值总和最大。

首先,如果按照前序遍历访问每个结点的顺序给结点做标记,那么以某个结点为根的子树中所有结点的标记一定该结点的后面。

dfs时顺便维护一下以每个结点为根的子树中结点的个数tot[i]。

dp[i][j]表示到dfs中第i个遍历的结点为止操作了j次可以获得的最大权值。

这样当到达第i个结点时,dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + value[i])   //不删除

            dp[i + tot[i]][j + 1] = max(dp[i + tot[i]][j + 1], dp[i][j]) //删除

 #include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; const int MAX_N = ;
typedef long long LL;
const LL INF = (LL)1e19;
vector<int> G[MAX_N];
int w[MAX_N], vs[MAX_N], tot[MAX_N], cnt;
LL dp[MAX_N][]; void dfs(int u, int fa) {
int sz = (int)G[u].size();
vs[++cnt] = u;
tot[u] = ;
if (sz == ) {
return ;
}
for (int i = ; i < sz; i++) {
int v = G[u][i];
if (v == fa) continue;
dfs(v, u);
tot[u] += tot[v];
}
} void read(int &res) {
res = ;
int sign = ;
char c = ' ';
while (c < '' || c > '') {
if (c == '-') sign = -;
c = getchar();
}
while (c >= '' && c <= '') res = (res<<) + (res<<) + c - '', c = getchar();
if (sign == -) res = -res;
} int main() {
ios::sync_with_stdio(false);
int N, K;
cin >> N >> K;
//read(N); read(K);
for (int i = ; i <= N; i++) cin >> w[i];//read(w[i]);
for (int i = ; i < N; i++) {
int u, v;
cin >> u >> v;
//read(u), read(v);
G[u].push_back(v);
G[v].push_back(u);
}
cnt = ;
dfs(, -);
for (int i = ; i <= K; i++) for (int j = ; j <= N; j++) dp[j][i] = -INF;
//for (int i = 0; i <= K; i++) dp[0][i] = 0;
dp[][] = ;
for (int i = ; i <= N; i++) {
int u = vs[i];
for (int j = ; j <= K; j++) if (dp[i][j] != -INF) {
dp[i + ][j] = max(dp[i + ][j], dp[i][j] + w[u]);
if (j < K)
dp[i + tot[u]][j + ] = max(dp[i + tot[u]][j + ], dp[i][j]);
}
}
LL res = -INF;
for (int i = ; i <= K; i++) res = max(res, dp[N + ][i]);
cout << res << endl; return ;
}

D题

题意:N种技能,第i种技能有ci个人学会,有T个巫师,每个巫师有两个集合A和B,他可以把一个拥有A集合中的技能的人转移到集合B中的某个技能中去。

问最多可以使多少个技能至少有一个人学会。

增加一个源点和汇点,源点到N种技能连一条容量为ci的边,从N种技能到汇点连一条容量为1的边。

对于每个巫师,从A集合中的技能连一条容量为1的边到该巫师,从该巫师连一条容量为1的边到B集合中的每种技能。

最大流即为答案。。。

 #include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; struct edge {
int to, cap, rev;
edge() {}
edge(int _to, int _cap, int _rev):to(_to), cap(_cap), rev(_rev) {}
};
const int INF = 0x3f3f3f3f;
const int MAX_V = ; // ????`
vector<edge> G[MAX_V]; // ?????
int level[MAX_V]; // ??????????
int iter[MAX_V]; // ????????????????
int Q[MAX_V]; // BFS?? void add_edge(int from, int to, int cap) {
G[from].push_back(edge(to, cap, G[to].size()));
G[to].push_back(edge(from, , G[from].size() - ));
} // ?????????????????
void bfs(int s) {
memset(level, -, sizeof(level));
int ini = , end = ;
Q[end++] = s;
level[s] = ;
while (end > ini) {
int v = Q[ini++];
for (int i = ; i < G[v].size(); i++) {
edge &e = G[v][i];
if (e.cap > && level[e.to] < ) {
level[e.to] = level[v] + ;
Q[end++] = e.to;
}
}
}
} // ??????????
int dfs(int v, int t, int f) {
if (v == t) return f;
for (int &i = iter[v]; i < G[v].size(); i++) {
edge &e = G[v][i];
if (e.cap > && level[v] < level[e.to]) {
int d = dfs(e.to, t, min(f, e.cap));
if (d > ) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return ;
} // ??????????
int Dinic(int s, int t) {
int flow = ;
for (;;) {
bfs(s);
if (level[t] < ) return flow;
memset(iter, , sizeof(iter));
int f;
while ((f = dfs(s, t, INF)) > ) {
flow += f;
}
}
} int main() {
ios_base::sync_with_stdio(false); int N, T;
cin >> N >> T;
int s = , t = N + T + ; for (int i = ; i <= N; i++) {
int C;
cin >> C;
add_edge(s, i, C);
add_edge(i, t, );
}
for (int i = ; i <= T; i++) {
int A, B;
cin >> A;
for (int j = ; j <= A; j++) {
int x;
cin >> x;
add_edge(x, N + i, );
}
cin >> B;
for (int j = ; j <= B; j++) {
int x;
cin >> x;
add_edge(N + i, x, );
}
} cout << Dinic(s, t) << endl;
return ;
}
 #include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; struct edge {
int to, cap, rev;
edge() {}
edge(int _to, int _cap, int _rev):to(_to), cap(_cap), rev(_rev) {}
};
const int INF = 0x3f3f3f3f;
const int MAX_V = ; // ????`
vector<edge> G[MAX_V]; // ?????
int level[MAX_V]; // ??????????
int iter[MAX_V]; // ????????????????
int Q[MAX_V]; // BFS?? void add_edge(int from, int to, int cap) {
G[from].push_back(edge(to, cap, G[to].size()));
G[to].push_back(edge(from, , G[from].size() - ));
} // ?????????????????
void bfs(int s) {
memset(level, -, sizeof(level));
int ini = , end = ;
Q[end++] = s;
level[s] = ;
while (end > ini) {
int v = Q[ini++];
for (int i = ; i < G[v].size(); i++) {
edge &e = G[v][i];
if (e.cap > && level[e.to] < ) {
level[e.to] = level[v] + ;
Q[end++] = e.to;
}
}
}
} // ??????????
int dfs(int v, int t, int f) {
if (v == t) return f;
for (int &i = iter[v]; i < G[v].size(); i++) {
edge &e = G[v][i];
if (e.cap > && level[v] < level[e.to]) {
int d = dfs(e.to, t, min(f, e.cap));
if (d > ) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return ;
} // ??????????
int Dinic(int s, int t) {
int flow = ;
for (;;) {
bfs(s);
if (level[t] < ) return flow;
memset(iter, , sizeof(iter));
int f;
while ((f = dfs(s, t, INF)) > ) {
flow += f;
}
}
} int main() {
ios_base::sync_with_stdio(false); int N, T;
cin >> N >> T;
int s = , t = N + T + ; for (int i = ; i <= N; i++) {
int C;
cin >> C;
add_edge(s, i, C);
add_edge(i, t, );
}
for (int i = ; i <= T; i++) {
int A, B;
cin >> A;
for (int j = ; j <= A; j++) {
int x;
cin >> x;
add_edge(x, N + i, );
}
cin >> B;
for (int j = ; j <= B; j++) {
int x;
cin >> x;
add_edge(N + i, x, );
}
} cout << Dinic(s, t) << endl;
return ;
}

E题

Weekly Challenges - Week 11的更多相关文章

  1. Murano Weekly Meeting 2015.11.11

    Meeting time: 2015.November.11th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting su ...

  2. Murano Weekly Meeting 2015.11.04

    Meeting time: 2015.November.4th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting sum ...

  3. How do I learn machine learning?

    https://www.quora.com/How-do-I-learn-machine-learning-1?redirected_qid=6578644   How Can I Learn X? ...

  4. Laravel-任务调度

    简介Cron 是 UNIX.SOLARIS.LINUX 下的一个十分有用的工具,通过 Cron 脚本能使计划任务定期地在系统后台自动运行.这种计划任务在 UNIX.SOLARIS.LINUX下术语为 ...

  5. ansible的基础使用(一)

    ansible基础使用(一) ansible的主要功能 A:为什么是ansible B:ansible的安装 C:ansible的相关文件 D:ansible的基本使用 ansible的简单操作 A: ...

  6. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  7. CI Weekly #11 | 微服务场景下的自动化测试与持续部署

    又一周过去了,最近我们的工程师正在搞一个"大事情" --「[flow.ci](http://flow.ci/?utm_source=bokeyuan&utm_medium= ...

  8. The promises and challenges of std::async task-based parallelism in C++11 C++11 std::async/future/promise

    转载 http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-task-based-parallelism- ...

  9. Murano Weekly Meeting 2015.08.11

    Meeting time: 2015.August.11th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting summ ...

随机推荐

  1. Redis过滤器如何与Envoy代理一起使用

    1.克隆源码到机器 [root@cx-- ~]# git clone https://github.com/envoyproxy/envoy Cloning into 'envoy'... remot ...

  2. IDEA引入jar但无法导入class

    如图,jar已经导入,但是无法import class 选择setting->maven->Ignored Files,将被忽略的model取消选中就可以解决了

  3. Windbg 查看SSDT表

    SSDT HOOK 的原理其实非常简单,我们先实际看看KeServiceDescriptorTable是什么样的.         lkd> dd KeServiceDescriptorTabl ...

  4. Web开发-Servlet&HTTP&Request

    <!doctype html>02 - JavaEE - Servlet&HTTP&Request figure:first-child { margin-top: -20 ...

  5. vc 识别移动硬盘 U盘,本地硬盘

    说明:有时候我们在做设备监控的时候,要识别一些链接设备,在使用函数GetDriveType的时候,U盘可以返回DRIVE_REMOVABLE,而本地硬盘硬盘和移动硬盘DRIVE_FIXED,因此还需要 ...

  6. python requests 高级用法 -- 包括SSL 证书错误的解决方案

    Session Objects会话对象 Session对象在请求时允许你坚持一定的参数.此外,还坚持由Session实例的所有请求的cookie. 让我们坚持在请求时使用 s = requests.S ...

  7. Excel生成Oracle数据库表sql工具类

    1.解决问题: 开发文档中字段比较多的时候,建表sql(Oracle下划线命名规范)比较麻烦,容易出错~~ (主要是懒) 特意手写一个工具,根据excel字段,生成建表的sql语句. ~~~末尾附Gi ...

  8. Python(四)基础篇之「文件对象&错误处理」

    [笔记]Python(四)基础篇之「文件对象&错误处理」 2016-12-08 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  9. typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)

    1.typedef  int (init_fnc_t) (void);表示定义init_fnc_t为函数类型,该函数返回int型,无参数.而“init_fnc_t  *init_sequence[]= ...

  10. PAT甲级——A1086 Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...