记2018/5/5 qbxt 测试
记2018/5/5 qbxt 测试
竞赛时间: 2018 年 5 月 5 日 13:30-17:00
T1
一、maze(1s,512MB):
简单的迷宫问题:给定一个n*m的迷宫,.表示可以通过,#表示不能通过。每一步可以向上下左右的任意方向移动,问是否能够正好k步从s走到t
输入格式:
第一行n,m表示迷宫的大小
接下来n行每行m个字符表示迷宫
接下来一行五个数字 x1,y1,x2,y2,k 表示起点为(x1,y1) 终点为(x2,y2) 步数为k
输出格式:
如果可以正好k步从s走到t输出方案,L表示向左,R表示向右,U表示向上,D表示向下。如果不能输出-1
样例:
输入:
3 3
…
.#.
…
1 1 3 3 4
输出:
RRDD
数据范围:
30%的数据满足n,m<=3 保证一定能到
60%的数据满足 n,m,k<=100
100%的数据满足 n,m<=1000 k<=1000000
思路:广搜 or 深搜 + 剪枝
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,x1,x2,y1,y2,K;
char c;
int g[][],f[][];
int q[][];
int answer[], dir[][];
int main() {
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i = ; i<=n; i++)
for (int j = ; j<=m; j++) {
scanf(" %c",&c);
if (c=='.') {
g[i][j] = ;
} else if (c=='#') {
g[i][j] = ;
}
f[i][j] = -;
}
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&K);
if (g[x1][y1] == ) {
printf("-1\n");
return ;
}
f[x1][y1] = ;
q[][] = x1;
q[][] = y1;
for (int s = ,t = ; s<=t; s++) {
int x = q[s][], y=q[s][];
if (x-> && g[x-][y] == &&f[x-][y] == -) {
f[x-][y] = f[x][y]+;
t++;
q[t][] = x-;
q[t][] = y;
dir[x-][y] = ;
}
if (x+<=n && g[x+][y] == && f[x+][y] ==-) {
f[x+][y] = f[x][y] +;
t++;
q[t][] = x+;
q[t][] = y;
dir[x+][y] = ;
}
if (y-> && g[x][y-]== && f[x][y-] == -) {
f[x][y-] = f[x][y]+;
t++;
q[t][] = x;
q[t][] = y-;
dir[x][y-] = ;
}
if (y+<=m && g[x][y+] == &&f[x][y+] == -) {
f[x][y+] = f[x][y] +;
t++;
q[t][] = x;
q[t][] = y+;
dir[x][y+] = ;
}
}
if (f[x2][y2] == - || (f[x2][y2]+K)% == || f[x2][y2]>K) {
printf("-1\n");
} else {
int x3 = x2, y3 = y2;
for (int i = ; x2!=x1 ||y2!=y1; i++) {
answer[f[x2][y2]] = dir[x2][y2];
int tmp = dir[x2][y2];
if (tmp == ) x2++;
else if (tmp == ) x2--;
else if (tmp==) y2++;
else y2--;
}
x2 = x3,y2=y3;
for (int i =; i<=f[x2][y2]; i++) {
if (answer[i] == ) printf("U");
else if (answer[i] == ) printf("D");
else if (answer[i]==) printf("L");
else if (answer[i]==) printf("R");
}
for (int i = f[x2][y2]+; i<=K; i+=) {
if (x2+<=n && g[x2+][y2]==) printf("DU");
else if (x2-> && g[x2-][y2]==) printf("UD" );
else if (y2+<=m && g[x2][y2+] == ) printf("RL");
else
printf("LR");
}
}
return ;
}
标程
T2
二、tree(1s,512MB):
对于一个无根树,他的任意一个联通子图称为他的一个子树。现给出一个无根树,每个节点上有一个权值。 一个子树的权值为这个子树上所有节点权值的xor和。比如子树包含有权值为(1,2,4)的节点,那么子树的权值为 1 xor 2 xor 4 = 7。给定一个无根树求所有子树的权值的和,由于这个数可能很大结果对10^9+7取余。
输入格式:
第一行一个整数n表示树的节点数目
第二行n个整数表示每个节点的权值
接下来n-1行每行两个树 a,b表示a到b有一条边 (输入保证一定是一个树)
输出格式:
一个数 表示所有子树权值的和对10^9+7取余的结果
样例:
输入
3
1 2 3
1 2
1 3
输出:
11
样例解释:
所有的子树有{1}, {2},{3},{1,2},{1,3},{1,2,3}
子树的权值为1, 2, 3, 3, 2, 0
答案为 1+2+3+3+2+0 = 11
数据范围:
30%的数据满足 n<=5
60%的数据满足 n<=100
100%的数据满足 n<=100000 树上节点的权值为正整数<=10000000000
其中有40%的数据满足节点权值=0或者1 另有其他10%的数据满足节点权值为1
思路:Xor可以拆城若干个二进制位 之间互不影响
考虑一个二进制位:
随便选一个点为根,f[i][0] 表示以 i 为根的子树 xor 和为 0 的子树个数,f[i][1] 表示以 i 为根的子树xor 和为 1 的子树
f[i][0] = f[i][0]*(f[son[i]][0] + 1) + f[i][1]*f[son[i][1]]
f[i][1] = f[i][1]*(f[son[i][0]] + 1) + f[i][0]*f[son[i][1]]
最后 for 一遍所有的节点 统计答案
f[fa[i][0]] = f[fa[i]][0]*(f[i][0] + 1) + f[fa[i][1]]*f[i][1]
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = ;
int fa[maxn],ne[maxn],h[maxn],poi[maxn],q[maxn],vis[maxn];
long long f[maxn][];
int a[maxn];
int n,tot,x,y;
int main() {
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
scanf("%d",&n);
for (int i =; i<=n; i++)
scanf("%d",&a[i]);
for (int i = ; i<n-; i++) {
scanf("%d%d",&x,&y);
tot++;
ne[tot] = h[x];
h[x] = tot;
poi[tot]= y;
tot++;
ne[tot]= h[y];
h[y] = tot;
poi[tot]=x;
}
q[] = ;
vis[] = ;
for (int s = , t = ; s<=t; s++) {
int x = q[s];
for (int j = h[x]; j; j=ne[j])
if (vis[poi[j]] == ) {
fa[poi[j]] = x;
t++;
q[t] = poi[j];
vis[poi[j]] = ;
}
}
long long ans = ;
for (int t = ; t>=; t--) {
for (int i = ; i<=n; i++) { if (a[i]&(<<t)) f[i][] = , f[i][] = ;
else f[i][] = , f[i][] = ;
}
for (int i = n; i>=; i--) {
int k = q[i];
int tmp0 = f[fa[k]][],tmp1 = f[fa[k]][];
f[fa[k]][] = (tmp0*(f[k][]+) + tmp1*f[k][])%;
f[fa[k]][] = (tmp0*f[k][] + tmp1*(f[k][]+))%;
}
for (int i =; i<=n; i++)
ans = (ans + f[i][]*(1LL<<t))%;
}
printf("%lld",ans);
return ;
}
标程
T3
三、number(1s,512MB)
数字的变化一直是千奇百怪的,于是本题只研究数字的加法和乘法。给定一个数s,每次你能将s变为 s+a 或者 s*b。问最少用几步变为t,无解输出-1
输入格式:
四个数 s,t,a,b (s,t为非负整数,a,b为正整数)
输出格式:
一个数表示最少的步数
样例:
输入
5 26 3 2
输出
3
样例解释:
S = 5
S = S * B = 5*2 = 10
S = S+A = 5+3 = 13
S = S*B= 13*2 = 26 = T
所以只要3步
数据范围:
30%的数目满足 s,t,a,b<=100
60%的数据满足s,t,a,b<=1000000
100%的数据满足 s,t,a,b<=1000000000000000000
思路:S = 0, 就是将 T/a b进制分解将所有的数字加起来
枚举 x 表示 s 乘了 x 次 b 记结果为 res
将 ( T-res) / a b 进制分解,小于 x 位的数字加起来大于等于 x 位的转成十进制加。( T-res) 能够整除a
#include <cstdio>
#include <cstring>
using namespace std;
long long s,t,a,b;
int main() {
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
scanf("%lld %lld %lld %lld",&s,&t,&a,&b);
if (b==) {
if ((t-s) %a == ) printf("%lld\n",(t-s)/a);
else printf("-1\n");
return ;
}
long long ans;
if ((t-s) %a == )
ans = (t-s)/a ;
else ans = 1000000000000000003LL;
for (int i = ; ; i++) {
if (t/s < b) break;
s*=b;
long long tt = t-s;
if (tt%a == ) {
tt/=a;
long long ans1 =;
for (int j = ; j<=i; j++) {
ans1+=tt%b;
tt/=b;
}
ans1+=tt+i;
if (ans1<ans) ans = ans1;
}
}
if (ans != ) printf("%lld",ans);
else printf("-1\n");
}
标程
希望今天前往北京参加APIO的学长学姐以及同级的同学可以考出让自己满意的成绩
不负初心,继续前进
记2018/5/5 qbxt 测试的更多相关文章
- 记2018/4/29 qbxt 测试
记 2018/4/29 qbxt 测试(提高基础班) 简单的 NOIP 模拟赛 竞赛时间: 2018 年 4 月 29 日 13:30-17:00 题目名称 乘法 求和 计数 输入文件名 mul.i ...
- 2018/8/21 qbxt测试
2018/8/21 qbxt测试 期望得分:0? 实际得分:0 思路:manacher 会写模板但是不会用 qwq 听了某人的鬼话,直接输出0,然后就gg了 #include <cstdio ...
- 2018/8/15 qbxt 测试
2018/8/15 qbxt 测试 期望得分:100:实际得分:50 不知道为什么写挂了,明明是个水题 T^T 思路:模拟 注意:如果用 char 类型存储的话,如果有'z' + 9 会爆char ...
- Node.js躬行记(14)——压力测试
公司有个匿名聊天的常规H5界面,运营向做一次 50W 的推送,为了能配合她的计划,需要对该界面做一次压力测试. 一.JMeter 压测工具选择了JMeter,这是Apache的一个项目,它是用Java ...
- 2018中国科大自主测试-B卷部分试题
数学部分 z = e^{\frac{2i\pi}{3}}, 求z^{2018}. \sin(2x) = \frac 35, 求\frac{\tan(x+15^{\circ})}{\tan(x-15^{ ...
- [转]nginx折腾记(HTTP性能能测试,与Apache对比)
话说nginx在大压力的环境中比apache的表现要好,于是下载了一个来折腾一下. 下载并编译安装,我的编译过程有点特别: 1.去除调试信息,修改$nginx_setup_path/auto/cc ...
- 2018.8.2 Juint测试介绍及其命名的规范
JUnit - 测试框架 什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能够轻松完成以 ...
- 2018全球十大测试工具Top2 Katalon
引言 由Capgemini,Sogeti和Micro Focus发布的2017-2018年世界质量报告中,Katalon超越老牌测试工具UFT(源自QTP)成为黑马新秀,在全球十大自动化测试工具中排名 ...
- 记一次使用LR测试UDP和TCP的过程
背景 最近项目要做性能测试,要出要一份性能报告,让我出一个有关Tcp和Udp的功能模块的测试,流程大概是这样,先走TCP协议协商一下会话,协商成功后走Udp收发数据. 有点简单啊,自己写个功能模块测一 ...
随机推荐
- DataTable转成Json
/// <summary> /// DataTable转成Json /// </summary> /// <param name=&quo ...
- js插件---强大的图片裁剪Cropper
js插件---强大的图片裁剪Cropper 一.总结 一句话总结:官网或者github里面的文档或者demo才是真的详细 使用的话找到图片裁剪后的base64数据,然后这个数据可下载可传递到服务器 1 ...
- spring-security-oauth2注解详解
spring-security-oauth2支持的注解有: 1.EnableOAuth2Client 适用于使用spring security,并且想从Oauth2认证服务器来获取授权的web应用环境 ...
- Linux系统安全加固(一)
Linux系统安全加固(一) 去年8月,某所网站遭黑客攻击瘫痪虽然港交所随后及时启用备用系统,但还是致使7支股票1支债卷被迫停牌,次日再次遭受攻击而瘫痪:在去年年底继CSDN信息安全出现之后, ...
- vue中剖析中的一些方法
1 判断属性 71 -81 var hasOwnProperty = Object.prototype.hasOwnProperty; /** * Check whether the object h ...
- OPENCV(6) —— 角点检测
图像特征的类型通常指边界.角点(兴趣点).斑点(兴趣区域).角点就是图像的一个局部特征,应用广泛.harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高,但由于采 ...
- SQL函数_Charindex()
1 charindex()函数的作用是用于发现目标字符串第一次出现在源字符串中出现的开始位置. 语法如下 : select charinde(目标字符串,列名或字符串[,起始位置]) from 表名
- UVA And Then There Was One
约瑟夫环问题,只不过每次删除一个后,在移m的倍数. #include <iostream> #include <cstdio> #include <cstring> ...
- Ubunut PPA源概述
Ubuntu 自带的“软件”应用,可以安装海量软件,既包括发行者支持的软件.社区支持的软件,也包括专有驱动和版权软件.有时,我们需要的软件通过这些渠道仍然无法找到.这时,可以到 PPA 软件源中查找. ...
- Python正则表达式初识(十)附正则表达式总结
今天分享正则表达式最后一个特殊字符“\d”,具体的教程如下. 1.特殊字符“\d”十分常用,其代表的意思是数字.代码演示如下图所示. 其中“+”的意思是表示连续,在这里代表的意思是连续的数字.但是输出 ...