8VC Venture Cup 2016 - Final Round (Div. 2 Edition)
暴力 A - Orchestra
import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) {Scanner cin = new Scanner (System.in);int r = cin.nextInt ();int c = cin.nextInt ();int n = cin.nextInt ();int k = cin.nextInt ();int[][] a = new int[12][12];for (int i=0; i<n; ++i) {int x = cin.nextInt ();int y = cin.nextInt ();a[x][y] = 1;}int ans = 0;for (int sx=1; sx<=r; ++sx) {for (int lx=0; sx+lx<=r; ++lx) {for (int sy=1; sy<=c; ++sy) {for (int ly=0; sy+ly<=c; ++ly) {int cnt = 0;for (int i=sx; i<=sx+lx; ++i) {for (int j=sy; j<=sy+ly; ++j) {if (a[i][j] == 1) cnt++;if (cnt >= k) break;}}if (cnt >= k) ans++;}}}}System.out.println (ans);}
}
找规律 B - Island Puzzle
相对位置不变,0的位置任意,当做不存在.查看每个点到对应的点是否能一起移动到.
#include <bits/stdc++.h>const int N = 2e5 + 5;
int a[N], b[N];
int n;int main() {scanf ("%d", &n);int tot1 = 0, tot2 = 0;for (int x, i=0; i<n; ++i) {scanf ("%d", &x);if (x != 0) a[tot1++] = x;}for (int x, i=0; i<n; ++i) {scanf ("%d", &x);if (x != 0) b[tot2++] = x;}int s = 0;for (; s<tot2; ++s) {if (b[s] == a[0]) break;}bool flag = true;for (int i=0; i<tot1; ++i) {if (b[(i+s)%(n-1)] != a[i]) {flag = false; break;}}if (flag) puts ("YES");else puts ("NO");return 0;
}
数位DP C - XOR Equation
题意:求多少对(a, b)满足a + b == s && a ^ b == x
分析:s和x拆分成二进制,dp[i][4][0/1]第一维是二进制长度,第二维是a和b二进制下第i位的方案(01,10,00,11),第三维是是否第i位会进位,递推一下能够在log(N)解决.
#include <bits/stdc++.h>typedef long long ll;
int s[41], x[41];
ll dp[41][4][2];void updata(int id) {if (s[id] == x[id]) {if (s[id] == 0) { //0 0if (id == 0) {dp[id][2][0] = dp[id][3][1] = 1;}else {for (int j=0; j<4; ++j) {dp[id][2][0] += dp[id-1][j][0];dp[id][3][1] += dp[id-1][j][0];}}}else { //1 1if (id == 0) {dp[id][0][0] = dp[id][1][0] = 1;}else {for (int j=0; j<4; ++j) {dp[id][0][0] += dp[id-1][j][0];dp[id][1][0] += dp[id-1][j][0];}}}}else {if (s[id] == 0) { //0 1for (int j=0; j<4; ++j) {dp[id][0][1] += dp[id-1][j][1];dp[id][1][1] += dp[id-1][j][1];}}else { //1 0for (int j=0; j<4; ++j) {dp[id][2][0] += dp[id-1][j][1];dp[id][3][1] += dp[id-1][j][1];}}}
}int main() {ll S, X; std::cin >> S >> X;if (X == 0) {puts ("1"); return 0;}bool same = false;if (S == X) same = true;int n = 0, m = 0;while (S) {if (S & 1) s[n++] = 1;else s[n++] = 0;S >>= 1;}while (X) {if (X & 1) x[m++] = 1;else x[m++] = 0;X >>= 1;}int len = std::max (n, m);for (int i=0; i<len; ++i) {updata (i);}ll ans = 0;for (int i=0; i<4; ++i) {ans += dp[len-1][i][0];}if (same && ans >= 2) ans -= 2;std::cout << ans << '\n';return 0;
}
树状数组 D - Factory Repairs
单点更新以及区间求和,不过不知道该点是k天前还是后,树状数组开二维.
import java.io.*;
import java.util.*;public class Main {static int[][] C;static int[] A;static int n;static void updata(int i, int j, int x) {while (i <= n) {C[i][j] += x;i += i & -i;}}static int query(int i, int j) {int ret = 0;while (i > 0) {ret += C[i][j];i -= i & -i;}return ret;}static int min(int a, int b) {if (a < b) return a;else return b;}public static void main(String[] args) {Scanner cin = new Scanner (new BufferedInputStream (System.in));n = cin.nextInt ();int k = cin.nextInt ();int a = cin.nextInt ();int b = cin.nextInt ();int q = cin.nextInt ();C = new int[n+5][2];A = new int[n+5];for (int i=0; i<q; ++i) {int op = cin.nextInt ();if (op == 1) {int d = cin.nextInt ();int e = cin.nextInt ();int tmp = A[d]; A[d] += e;updata (d, 0, min (b, A[d]) - min (b, tmp));updata (d, 1, min (a, A[d]) - min (a, tmp));}else {int p = cin.nextInt ();int ans = query (p - 1, 0) + query (n, 1) - query (p+k-1, 1);System.out.println (ans);}}}
}
贪心+双端队列 E - Package Delivery
题意:m个加油站,每单位油有价格,汽车有油的容量,初始满油,问到终点最少消费多少.
分析: 假设起点也算是一个加油站,免费,且汽车初始空油,那么每一个加油站最多能给汽车充n单位油,那么到下一个加油站要选择之前加油站价格最少的加油,这里用双端队列维护最低价格的加油站.
#include <bits/stdc++.h>typedef long long ll;
const int N = 2e5 + 5;
int dque[N];
std::pair<int, int> station[N];
int d, n, m;int main() {scanf ("%d%d%d", &d, &n, &m);for (int i=0; i<m; ++i) {scanf ("%d%d", &station[i].first, &station[i].second);}station[m++] = std::make_pair (0, 0);station[m++] = std::make_pair (d, 0);std::sort (station, station+m);for (int i=0; i<m-1; ++i) {if (station[i].first + n < station[i+1].first) {puts ("-1"); return 0;}}int qs = 0, qe = 0, now = 0; ll ans = 0;for (int i=0; i<m; ++i) {int x = station[i].first, p = station[i].second;while (qs < qe && station[dque[qs]].first + n < x) {ans += 1ll * (station[dque[qs]].first + n - now) * station[dque[qs]].second;now = station[dque[qs]].first + n;qs++;}ans += 1ll * (x - now) * station[dque[qs]].second;now = x;while (qs < qe && station[dque[qe-1]].second > p) {qe--;}dque[qe++] = i;}std::cout << ans << '\n';return 0;
}
树形DP F - Preorder Test
题意:选择一条k长的DFS先序遍历路径,使得其中的最小值最大
分析:二分枚举最小值,然后枚举每个点出发的大于最小值的路径长度.求路径长度用到树形DP
首先down[u]表示u的子树下最多能走的路径长度,然后第二次dp[u]表示以u为根节点下最多能走的路径长度,up是u以上完整的最大长度
#include <bits/stdc++.h>const int N = 2e5 + 5;
struct DP {int sum, mx;DP operator + (const DP &rhs) const {return DP {sum + rhs.sum, std::max (mx, rhs.mx)};}
};
int a[N], total[N], down[N], dp[N];
bool good[N];
std::vector<int> edge[N];
int n, k;void DFS(int u, int fa) {total[u] = 1;int sum = 0, mx = 0;for (auto v: edge[u]) {if (v == fa) continue;DFS (v, u);total[u] += total[v];if (down[v] == total[v]) {sum += total[v];} else {mx = std::max (mx, down[v]);}}down[u] = sum + mx + 1;if (!good[u]) down[u] = 0;
}void DFS2(int u, int fa, int up) { //learn from touriststd::vector<int> children;int sum = 0, mx = 0;for (auto v: edge[u]) {if (v == fa) continue;if (down[v] == total[v]) {sum += down[v];} else {mx = std::max (mx, down[v]);}children.push_back (v);}if (up == n - total[u]) {sum += up;} else {mx = std::max (mx, up);}dp[u] = sum + mx + 1;if (!good[u]) dp[u] = 0;int sz = children.size ();if (sz == 0) return ;std::vector<DP> predown (sz + 1);predown[0] = {0, 0};for (int i=0; i<sz; ++i) {int v = children[i];predown[i+1] = predown[i];if (down[v] == total[v]) {predown[i+1].sum += down[v];} else {predown[i+1].mx = std::max (predown[i+1].mx, down[v]);}}std::vector<DP> sufdown (sz + 1);sufdown[sz] = {0, 0};for (int i=sz-1; i>=0; --i) {int v = children[i];sufdown[i] = sufdown[i+1];if (down[v] == total[v]) {sufdown[i].sum += down[v];} else {sufdown[i].mx = std::max (sufdown[i].mx, down[v]);}}for (int i=0; i<sz; ++i) {int v = children[i];DP now = predown[i] + sufdown[i+1];if (up == n - total[u]) {now.sum += up;} else {now.mx = std::max (now.mx, up);}int new_up = now.sum + now.mx + 1;if (!good[u]) new_up = 0;DFS2 (v, u, new_up);}
}bool check(int v) {for (int i=1; i<=n; ++i) good[i] = (a[i] >= v);DFS (1, 0);DFS2 (1, 0, 0);for (int i=1; i<=n; ++i) {if (dp[i] >= k) return true;}return false;
}int main() {scanf ("%d%d", &n, &k);for (int i=1; i<=n; ++i) {scanf ("%d", a+i);}for (int u, v, i=1; i<n; ++i) {scanf ("%d%d", &u, &v);edge[u].push_back (v);edge[v].push_back (u);}int low = 0, high = 1000005;while (low < high) {int mid = (low + high + 1) >> 1;if (check (mid)) {low = mid;} else {high = mid - 1;}}printf ("%d\n", low);return 0;
}
转载于:https://www.cnblogs.com/Running-Time/p/5239284.html
8VC Venture Cup 2016 - Final Round (Div. 2 Edition)相关推荐
- 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) C. XOR Equation 数学
C. XOR Equation 题目连接: http://www.codeforces.com/contest/635/problem/C Description Two positive integ ...
- 解题报告(一)D、(CROC 2016 - Final Round C)Binary Table(矩阵 + 状态压缩 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation 动态规划
E. Goods transportation 题目连接: http://codeforces.com/contest/724/problem/E Description There are n ci ...
- codeforces Intel Code Challenge Final Round (div.1 + div.2 combined)
比赛水掉3题rk559 rating+115 赛后切掉C n年没打cf了终于又重新变蓝了,果然太弱... 1.A题 Checking the Calendar 给定两个星期几,问是否可能分别是两个月 ...
- Facebook Hacker Cup 2016 Qualification Round 解题报告
Boomerang Constellations 题意: 给定N≤2×103个点,求满足dis(x,y)=dis(y,z)的三元组(x,y,z)个数,(x,y,z)与(z,y,x)被认为是相同的给定N ...
- CROC 2016 - Elimination Round (Rated Unofficial Edition) B. Mischievous Mess Makers 贪心
B. Mischievous Mess Makers 题目连接: http://www.codeforces.com/contest/655/problem/B Description It is a ...
- Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))
Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 题号 题目 知识点 A Simply Strange Sor ...
- Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A-F全题解
Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 文章目录 A. Simply Strange Sort B. ...
- Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)切题报告(A-B题)
这是我第二次参加CF比赛,也是第一次写博客,写得不好,望各位大佬海涵. A. Single Wildcard Pattern Matching 原题链接 这道题,这是难到让人无法直视,太水了. 题目大 ...
- COCI 2016/2017 Round #3 题解
COCI 2016/2017 Round #3 这套题代码量似乎有些大呀...前五题代码都已经破4KB了... 而且还要卡空间.卡常数... Imena 题目翻译 分析 细节模拟题,注意可能会出现名字 ...
最新文章
- UIImage的scale
- SQL update select语句
- linux脚本 程序输入,[转]Linux中shell脚本如何自动输入…
- js/jq基础(日常整理记录)-3-一个自定义表格
- 用html可以写游戏,javascript可以写游戏吗?
- php dhcp,ip如何设置dhcp
- setTimeout 和 setInterval
- 【转】datagridview的checkbox列,当修改checkbox状态时实时获得其准确状态值
- ABAP git客户端的简单介绍
- Java线程池,从使用到原理
- 计算机视觉应用开发功能图,《计算机视觉算法:基于OpenCV的计算机应用开发》 —1.3 理解计算机图像...
- redis之proxy集群之twemproxy
- php foreach 不等于_你不知道的接口测试之简单的开始
- 迁徙图_2亿农民工10年迁徙图: “中西飞”成大趋势,进城者减少
- 转【28个Unix/Linux的命令行神器-----陈皓】
- 【数据预测】基于matlab双向长短时记忆(BiLSTM)数据预测【含Matlab源码 1824期】
- unity3d游戏开发第二版pdf_从零开始学基于ARKit的Unity3d游戏开发系列10
- python 读取png图片 透明度
- Java实现支付宝网页支付
- SGU 水题集合2 SGU112 SGU113 SGU114 SGU115
热门文章
- 如何利用自己的知识设计一块属于自己的单片机开发板
- python3关键字详解_Python解析、提取url关键字的实例详解
- 哪一类功率放大电路效率最高_集成电路工艺之双极型工艺
- V.Replication and Sharding(创建主从数据库)
- 【渝粤教育】广东开放大学 集体谈判与集体合同 形成性考核 (30)
- 【渝粤教育】广东开放大学 操作系统原理与应用 形成性考核 (46)
- 【Python实例第15讲】分类概率图
- 机器博弈 (二) 遗憾最小化算法
- 【5分钟 Paper】Dueling Network Architectures for Deep Reinforcement Learning
- [转帖]java必备的开发知识和技能