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 ...
随机推荐
- linux watch命令查看网卡流量
watch命令可以反复的执行一个命令,默认时间间隔为2秒钟.TX是发送(transport),RX是接收(receive)RX bytes:总下行流量TX bytes:总上行流量 可以每隔两秒监视网络 ...
- duilib教程之duilib入门简明教程8.完整的自绘标题栏
看了前面那么多教程,相信对duilib已有基本映像了,我们就快马加鞭,做出一个完整的自绘标题栏吧~ 看到下面这个效果图,小伙伴们是不是有点惊呆了呢~O(∩_∩)O~ duilib实现以 ...
- from Crypto.Cipher import AES加密解密
一.代码 from Crypto.Cipher import AES import base64 """ AES加密算法 """ #加密 d ...
- hibernate_02_hibernate的入门
1.什么是Hibernate框架? Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接 ...
- 阿里云CentOs7上安装JDK
一.查看服务器是否已经预装了JDK 在拿到新机器以后,要先看下机器上是否已经预装了JDK,命令: rpm -qa|grep jdk 如果有的话,卸载openjdk(无需输全称).命令: yum -y ...
- nginx下Thinkphp 隐藏index.php
thinkphp config配置: 'URL_MODEL' => '2', //URL模式 nginx rewrite配置: location / { if (!-e $request_fil ...
- Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1
Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...
- C# 16进制与字符串、字节数组之间的转换(串口通讯中)
1.c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString( ...
- selenium学习笔记11——driver.get(url) 页面加载时间太长
在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...
- uoj60 怎样提高智商
题意:你需要构造n个四项选择题.格式为:问在前i个问题中选了几个hi字母? 输出有最多正确答案的构造方案. 标程: #include<cstdio> using namespace std ...