夏令营提高班上午上机测试 Day 2 解题报告
题目描述小G有一群好朋友,他们经常互相借钱。假如说有三个好朋友A,B,C。A欠B20元,B欠C20元,总债务规模为20+20=40元。小G是个追求简约的人,他觉得这样的债务太繁杂了。他认为,上面的债务可以完全等价为A欠C20元,B既不欠别人,别人也不欠他。这样总债务规模就压缩到了 20 元。现在给定n个人和m条债务关系。小G想找到一种新的债务方案,使得每个人欠钱的总数不变,或被欠钱的总数不变(但是对象可以发生变化),并且使得总债务规模最小。输入格式输入文件第一行两个数字 n, m,含义如题目所述。接下来 m 行,每行三个数字 ai, bi, ci ,表示 ai欠 bi的钱数为 ci。注意,数据中关于某两个人 A 和 B 的债务信息可能出现多次,将其累加即可。如”A 欠 B 20 元”、”A 欠 B 30 元”、”B 欠 A 10 元”,其等价为”A 欠 B 40 元”。输出格式输出文件共一行,输出最小的总债务规模。样例输入 15 31 2 102 3 12 4 1样例输出 110样例输入 24 31 2 12 3 13 1 1样例输出 20数据范围对于 30% 的数据,1 ≤ n ≤ 10,1 ≤ m ≤ 10。对于 60% 的数据,1 ≤ n ≤ 100, 1 ≤ m ≤ 104。对于 80% 的数据,1 ≤ n ≤ 104,1 ≤ m ≤ 104。对于 100% 的数据,1 ≤ n ≤ 106,1 ≤ m ≤ 106。对于所有的数据,保证 1 ≤ ai, bi≤ n, 0 < ci≤ 100。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std; const int max_n = 1e6 + ;
const int max_m = 1e6 + ;
int a[max_n]; inline int getnum()
{
int ans = ; bool flag = false;
char c;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-') flag = true;
else ans = c - '';
while (isdigit(c = getchar()))
ans = ans * + c - '';
return ans;
} int main()
{
freopen("debt.in", "r", stdin);
freopen("debt.out", "w", stdout);
int n = getnum();
int m = getnum();
for (int i = ; i <= m; i++)
{
int aa, bb, c;
aa = getnum(); bb = getnum(); c = getnum();
a[aa] += c; a[bb] -= c;
}
int ans = ;
for (int i = ; i <= n; i++)
if (a[i] > ) ans += a[i];
cout << ans << endl;
}
题目描述小 G 喜欢玩排列。现在他手头有两个 n 的排列。n 的排列是由 0, 1, 2, ..., n − 1这 n 的数字组成的。对于一个排列 p,Order(p) 表示 p 是字典序第 Order(p) 小的排列(从 0 开始计数)。对于小于 n! 的非负数 x,Perm(x) 表示字典序第 x 小的排列。现在,小 G 想求一下他手头两个排列的和。两个排列 p 和 q 的和为 sum = Perm((Order(p) + Order(q))%n!)。输入格式输入文件第一行一个数字 n,含义如题。接下来两行,每行 n 个用空格隔开的数字,表示小 G 手头的两个排列。输出格式输出一行 n 个数字,用空格隔开,表示两个排列的和。样例输入 120 11 0样例输出 11 0样例输入 231 2 02 1 0样例输出 21 0 2数据范围1、2、3、4 测试点,1 ≤ n ≤ 10。5、6、7 测试点,1 ≤ n ≤ 5000,保证第二个排列的 Order ≤ 105。8、9、10 测试点,1 ≤ n ≤ 5000。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std; const int max_n = 5e4 + ;
int cnt[max_n], p1[max_n], p2[max_n], pp1[max_n], pp2[max_n], ans[max_n];
int n; inline int getnum()
{
int ans = ; char c; bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-') flag = true; else ans = c - '';
while (isdigit(c = getchar())) ans = ans * + c - '';
return ans * (flag ? - : );
} int main()
{
freopen("perm.in", "r", stdin);
freopen("perm.out", "w", stdout);
n = getnum();
for (int i = n; i >= ; i--) p1[i] = getnum();
for (int i = n; i >= ; i--) p2[i] = getnum(); for (int i = ; i <= n; i++)
for (int j = ; j < i; j++)
if (p1[j] < p1[i]) pp1[i]++;
for (int i = ; i <= n; i++)
for (int j = ; j < i; j++)
if (p2[j] < p2[i]) pp2[i]++; for (int i = ; i <= n; i++)
{
ans[i] += pp1[i] + pp2[i];
ans[i + ] += ans[i] / i;
ans[i] %= i;
} for (int i = n; i >= ; i--)
{
int _ = -;
while (ans[i] >= )
{
_++;
if (!cnt[_]) ans[i]--;
}
printf("%d ", _);
cnt[_] = ;
}
}
题目描述rzyz 有一棵苹果树。苹果树有 n 个节点(也就是苹果),n − 1 条边(也就是树枝)。调皮的小 G 爬到苹果树上。他发现这棵苹果树上的苹果有两种:一种是黑苹果,一种是红苹果。小 G 想要剪掉 k 条树枝,将整棵树分成 k + 1 个部分。他想要保证每个部分里面有且仅有一个黑苹果。请问他一共有多少种剪树枝的方案?输入格式第一行一个数字 n,表示苹果树的节点(苹果)个数。第二行一共 n − 1 个数字 p0, p1, p2, p3, ..., pn-2,pi 表示第 i + 1 个节点和 pi节点之间有一条边。注意,点的编号是 0 到 n − 1。第三行一共 n 个数字 x0, x1 , x2 , x3 , ..., xn-1 。如果 x 是 1,表示 i 号节点是黑苹果;如果 x 是 0,表示 i 号节点是红苹果。输出格式输出一个数字,表示总方案数。答案对 109+ 7 取模。样例输入 130 00 1 1样例输出 12样例输入 260 1 1 0 41 1 0 0 1 0样例输出 21样例输入 3100 1 2 1 4 4 4 0 80 0 0 1 0 1 1 0 0 1样例输出 327数据范围对于 30% 的数据,1 ≤ n ≤ 10。对于 60% 的数据,1 ≤ n ≤ 100。对于 80% 的数据,1 ≤ n ≤ 1000。对于 100% 的数据,1 ≤ n ≤ 105。对于所有数据点,都有 0 ≤ pi≤ n − 1,xi = 0 或 xi = 1。特别地,60% 中、80% 中、100% 中各有一个点,树的形态是一条链。
- i点是黑色的,所有i的子树v和i相接,必须接dp[v][0]。
- i点是红色的,所有i的子树,有一棵接dp[v][1],其余的接dp[v][0]。
- i点是黑色的,所有i的子树v和i相接,必须接dp[v][0],并且i上面的那条边得割断。
- i点是红色的,所有i的子树,有一棵接dp[v][1],其余的接dp[v][0],且i上面的那条边得割断。
- i点是红色的,所有i的子树v和i相接,都接dp[v][0]。
- 子树全都用dp[v][0]。
- 子树一棵用dp[v][1],其余用dp[v][0]。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std; #define ll long long
const int MAXN = 1e5 + ;
const int MOD = 1e9 + ; ll f[MAXN][];
int point[MAXN] = {}, nxt[MAXN * ] = {}, v[MAXN * ] = {}, tot = ;
bool color[MAXN] = {};
int n; inline void addedge(int x, int y)
{
tot++;
nxt[tot] = point[x]; point[x] = tot; v[tot] = y;
} void dfs(int now, int father)
{
f[now][] = ;
f[now][] = ;
for (int tmp = point[now]; tmp; tmp = nxt[tmp])
if (v[tmp] != father)
{
dfs(v[tmp], now);
f[now][] = (f[now][] * f[v[tmp]][]) % MOD;
f[now][] = (f[now][] + f[now][] * f[v[tmp]][]) % MOD;
f[now][] = (f[now][] * f[v[tmp]][]) % MOD;
}
if (color[now])
f[now][] = f[now][];
else
f[now][] = (f[now][] + f[now][]) % MOD;
} int main()
{
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
int x;
scanf("%d", &x);
addedge(i, x + ); addedge(x + , i);
}
for (int i = ; i <= n; i++)
{
int x;
scanf("%d", &x);
if (x == ) color[i] = true;
else color[i] = false;
}
dfs(, );
cout << f[][] << endl;
}
夏令营提高班上午上机测试 Day 2 解题报告的更多相关文章
- 夏令营提高班上午上机测试 Day 3 解题报告
今天的题的确水.T3还是一道NOIP原题. 嘛,多刷点水题也不是什么坏事嘛. 说来也快,夏令营结束了整一星期了呢.大家也都回到了日常的暑假生活呢. 今天学业水平测试出成绩了...嗯结果还算满意呢,至少 ...
- 夏令营提高班上午上机测试 Day 4 解题报告
我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...
- 夏令营提高班上午上机测试 Day 1 解题报告
Day 1的题难度上来说不算太高,但是T2和T3还是有一定的思维量的. 一个比较好的开始.虽然AK的人只有几个.. (懒得去翻result了..忘了当时拿了多少分了 (哦,前两天我们机房是没有成绩的, ...
- nowcoder(牛客网)OI测试赛3 解题报告
昨天因为胡搞了一会儿社团的事情,所以错过(逃过)了nowcoder的测试赛..... 以上,听说还是普及组难度qwq,而且还有很多大佬AK(然而我这么蒻肯定还是觉得有点难度的吧qwq) 不过我还是日常 ...
- 牛客OI赛制测试赛3 解题报告
前话: 话说考试描述:普及难度. 于是想在这场比赛上涨点信心. 考出来的结果:Point:480 Rank:40 然而同机房的最好成绩是 510. 没考好啊!有点炸心态,D题一些细节没有注意, ...
- nowcoder(牛客网)提高组模拟赛第四场 解题报告
T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是
- nowcoder(牛客网)OI测试赛2 解题报告
qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...
- nowcoder 提高组模拟赛 最长路 解题报告
最长路 链接: https://www.nowcoder.com/acm/contest/178/A 来源:牛客网 题目描述 有一张 \(n\) 个点 \(m\) 条边的有向图,每条边上都带有一个字符 ...
- [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)
题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...
随机推荐
- See you~(二维树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1892 See you~ Time Limit: 5000/3000 MS (Java/Others) ...
- Kafka入门介绍
1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...
- 五 : springMVC拦截器
springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方式是继承实现了HandlerInte ...
- Spark性能调优之资源分配
Spark性能调优之资源分配 性能优化王道就是给更多资源!机器更多了,CPU更多了,内存更多了,性能和速度上的提升,是显而易见的.基本上,在一定范围之内,增加资源与性能的提升,是成正比的:写完了 ...
- 最简单方法将项目上传到github
准备材料: 1.首先你需要一个github账号,所有还没有的话先去注册吧!https://github.com/ 2.我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可:ht ...
- window.top.location.href 和 window.location.href 的区别
window.location.href 是本页面跳转 window.top.location.href是最外层的页面跳转
- nginx重启报找不到nginx.pid的解决方法
nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找 ...
- Git学习记录--git仓库
Git是一款强大的版本控制工具,与svn相比git的分布式提交,本地仓库等在使用时确实比较方便.当然两者之间各有优劣,我在这里不多做比较.由于之前少有接触git,只是零星大致地了解一点,所以找时间系统 ...
- 数据库复习总结(2)-SQLServer的管理
1.需要安装SQLServer2008或者SQLServer2012,若要使用SQLServer管理工具进行开发还要安装SQL Server Management Studio,还可以使用Visual ...
- Hadoop问题:apt-get install docker-engine -> Depends: init-system-helpers (>= 1.18~) but 1.14 is to be installed
问题描述:$ apt-get install docker-engine -> Depends: init-system-helpers (>= 1.18~) but 1.14 is to ...