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

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

最后一题貌似又遇到了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. docker删除未使用到的镜像

    docker image prune -a docker image prune -a -f  #-f强制,不需要确认

  2. from urllib import parse模块的使用

    一.介绍 定义了url的标准接口,实现url的各种抽取 parse模块的作用:url的解析,合并,编码,解码 二.代码 方法一:urlparse 实现url的识别和分段 from urllib imp ...

  3. Android Drawable 详解(教你画画!)

    参考 1.Android中的Drawable基础与自定义Drawable 2.android中的drawable资源 3.Android开发之Shape详细解读 Drawable分类 No xml标签 ...

  4. PAT甲级——A1139 First Contact【30】

    Unlike in nowadays, the way that boys and girls expressing their feelings of love was quite subtle i ...

  5. Java 面试题经典 77 问(含答案)!

    金三银四了,3月底,4月初,找工作换单位的黄金时期.4月初将会有有一大批职场人士流动... 作为Java开发码农的你是不是也在蠢蠢欲动,或者已经搞了几轮车轮战了? 我们为大家准备了 77 道经典 Ja ...

  6. 16.ajax_case07

    # 通过搜索接口抓取etherscan上的合约地址 # https://etherscan.io/ import requests import re header = { 'Accept': 'te ...

  7. <day006>bootstrap的简单学习 + 轮播图

    任务1:bootstrap的简单学习 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta c ...

  8. Mid-Atlantic 2008 Lawrence of Arabia /// 区间DP oj21080

    题目大意: 输入n,m 输入n个数 将n个数切割m次分为m+1段,使得各段的Strategic Value总和最小 一组数a b c d的SV值为 a*b + a*c + a*d + b*c + b* ...

  9. eclipse-帮助文档

    Eclipse开发环境配置 1.         java环境 安装 本系统使用java6开发,老师使用1.6.0 _45版本开发,如下图所示: “开发工具”目录提供了1.6.0 _45版本32位和6 ...

  10. cv2 & PIL(pillow)显示图像

    = OpenCV和PIL中显示图像方式不一样,且支持的格式也不同 = cv在显示图像时是自定义的显示窗口,而PIL中显示是调用操作系统中的默认打开程序 如: import cv2 im = cv2.i ...