Weekly Challenges - Week 11
一拖再拖,忍无可忍,自己懒的没救了。
一周前就结束的比赛,到现在才想起来补。
最后一题貌似又遇到了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的更多相关文章
- Murano Weekly Meeting 2015.11.11
Meeting time: 2015.November.11th 1:00~2:00 Chairperson: Serg Melikyan, PTL from Mirantis Meeting su ...
- Murano Weekly Meeting 2015.11.04
Meeting time: 2015.November.4th 1:00~2:00 Chairperson: Serg Melikyan, PTL from Mirantis Meeting sum ...
- 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? ...
- Laravel-任务调度
简介Cron 是 UNIX.SOLARIS.LINUX 下的一个十分有用的工具,通过 Cron 脚本能使计划任务定期地在系统后台自动运行.这种计划任务在 UNIX.SOLARIS.LINUX下术语为 ...
- ansible的基础使用(一)
ansible基础使用(一) ansible的主要功能 A:为什么是ansible B:ansible的安装 C:ansible的相关文件 D:ansible的基本使用 ansible的简单操作 A: ...
- 地区sql
/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...
- CI Weekly #11 | 微服务场景下的自动化测试与持续部署
又一周过去了,最近我们的工程师正在搞一个"大事情" --「[flow.ci](http://flow.ci/?utm_source=bokeyuan&utm_medium= ...
- 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- ...
- Murano Weekly Meeting 2015.08.11
Meeting time: 2015.August.11th 1:00~2:00 Chairperson: Serg Melikyan, PTL from Mirantis Meeting summ ...
随机推荐
- MySQL 笔记一
一.基本语法 1.数据库操作 create database [IF NOT EXIEST ] 数据库名 --创建数据库 drop database 数据库名 ...
- bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)
传送门 解题思路 看到最大,肯定要先想二分答案.二分之后首先从小到大枚举\(k\)个小于\(lim\)的所有一级公路,然后用并查集连到一起,然后就在剩下的里面从小到大找n-1-k个二级公路,模仿最小生 ...
- BZOJ 1911 (APIO 2010) 特别行动队
题目描述 你有一支由n名预备役士兵组成的部队,士兵从1到n编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,-,i+k)的序列. 编 ...
- window.location 对象中各种方法的用途
一.简介 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 href 完整的 URL pathname 当 ...
- hdu多校第四场 1003 (hdu6616) Divide the Stones 机智题
题意: 给你重量分别为1到n的n个石头,让你分成重量相等,数量也相等的k组,保证k是n的约数.问你能不能分配,如果能,输出具体的分配方案. 题解: 首先,如果1到n之和不能整除k,那么一定不能如题意分 ...
- 02-Nov-2017 07:11:56.475 信息 [http-nio-8080-exec-10] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource. Initializing c3p0 pool...
报错: 02-Nov-2017 07:11:56.475 信息 [http-nio-8080-exec-10] com.mchange.v2.c3p0.impl.AbstractPoolBackedD ...
- Windows下 vundle的安装和使用
准备工作 1. 安装git 去官网下载,安装即可. 2. 添加git的环境变量 并将Git 的安装路径加入环境变量Path,如 D:\Program Files\Git\cmd 然后运行cmd,输入 ...
- 批量处理数据 SqlBulkCopy
string connectionString = new PublicDBHelper().GetCon(System.Configuration.ConfigurationManager.AppS ...
- Activiti学习笔记2 — HelloWorld
一. Maven的POM配置文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...
- 拦截器和自定义注解@interface
1 .拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略. 拦截用户的请求并进行相应的处理,比如:判断用 ...