0+90+0=90。我只挑了T2做。

连接格点

有一个M行N列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。

输入格式:

第一行输入两个正整数m和n。

以下若干行每行四个正整数x1,y1,x2,y2,表示第x1行第y1列的点和第x2行第y2列的点已经有连线。输入保证|x1-x2|+|y1-y2|=1。

输出格式:

输出使得连通所有点还需要的最小花费。

样例输入:

2 2

1 1 2 1

样例输出:

3

数据范围:

m,n<=1000

时间限制:

1000

空间限制:

32768

最小生成树,而且不用排序了。

无序字母对

给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

输入格式:

第一行输入一个正整数n。

以下n行每行两个字母,表示这两个字母需要相邻。

输出格式:

输出满足要求的字符串。

如果没有满足要求的字符串,请输出“No Solution”。

如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

样例输入:

4

aZ

tZ

Xt

aX

样例输出:

XaZtX

数据范围:

不同的无序字母对个数有限,n的规模可以通过计算得到。

时间限制:

1000

空间限制:

32768

题解

题意很清晰了,显然是求字典序最小的欧拉回路方案,但是我都忘了欧拉回路这回事。

手动模拟

发现合法情况一定是度数为奇数的点的个数为0或2。如果是0那就找最小的,如果是2那就找度数为奇数的最小的。

然后发现中间合并两个无序对,度数的变化是偶数2,所以一定有解。然后用set维护找字典序最小的即可。

但是交到洛谷1341发现WA了。然后看数据,发现了这种情况:

5

ax

xx

xt

tp

ps

也就是自环。在ax的时候x优先选择走t,但是之后就走不到x了。

所以在选择字典序较小的之前还要判断x下一个是否必须走到自己。这个就把其他点连回x的边数考虑一下就好了,把x放到后面边数至少为3。

最后还是有一个点莫名RE,而学军中学的数据好像是一样的,所以这题就是90分了。

#include<bits/stdc++.h>
#define co const
#define il inline
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T>il T read(T&x){
return x=read<T>();
}
using namespace std; co int N=52;
il int idx(char c){
return islower(c)?26+c-'a':c-'A';
}
il char inv(int i){
return i<26?i+'A':i-26+'a';
} int n,c[N];
multiset<int> s[N];
multiset<int>::iterator it;
int main(){
read(n);
for(int i=1;i<=n;++i){
char p[3];scanf("%s",p);
++c[p[0]=idx(p[0])],++c[p[1]=idx(p[1])];
s[p[0]].insert(p[1]),s[p[1]].insert(p[0]);
}
int cnt=0;
for(int i=0;i<N;++i)
if(c[i]&1) ++cnt;
if(cnt!=0&&cnt!=2) return puts("No Solution"),0;
char ans[3000];
if(cnt==0){
for(int i=0;i<N;++i)
if(c[i]>=2){ans[0]=i,c[i]-=1;break;}
}
else{
for(int i=0;i<N;++i)
if(c[i]&1){ans[0]=i,c[i]-=1;break;}
}
for(int i=1;i<=n;++i){
if(s[ans[i-1]].count(ans[i-1])){ // edit 1
int cnt=0;
for(int j=0;j<N;++j)if(j!=ans[i-1])
cnt+=s[j].count(ans[i-1]);
if(cnt<3){
ans[i]=ans[i-1],c[ans[i]]-=2;
s[ans[i]].erase(s[ans[i]].find(ans[i])),s[ans[i]].erase(s[ans[i]].find(ans[i]));;
continue;
}
}
int cnt=0;
it=s[ans[i-1]].begin();
if(i<n&&c[*it]==1) ++it;
ans[i]=*it,c[ans[i]]-=2; // i==n doesn't matter
s[ans[i-1]].erase(s[ans[i-1]].find(ans[i])),s[ans[i]].erase(s[ans[i]].find(ans[i-1]));
}
for(int i=0;i<=n;++i) ans[i]=inv(ans[i]);
ans[n+1]=0;
puts(ans);
return 0;
}
/*
5
ax
xx
xt
tp
ps
*/

欧拉回路

欧拉回路算法直接就可以解决这个问题。

欧拉回路是在回溯的时候把路径的答案加进去。这样在x之后如果能回来,先走的就是字典序较小的;如果不能,先走的就是x。

感觉理解深入了不少。时间复杂度\(O(n \log n)\)。

数字转换

如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以变为7。限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。

输入格式:

输入一个正整数n。

输出格式:

输出最少需要花费的时间。

样例输入:

7

样例输出:

3

数据范围:

n<=50 000。

时间限制:

1000

空间限制:

32768

题解

只能向较小的连无向边,所以最后图一定是森林。

然后跑树的直径就可以了。

可以用来练习线性筛求约数和(误)。

线性筛的第二重循环中要筛出来的数\(x=i\times p_j\)最小质因子一定是现在枚举的\(p_j\),此时分为两种情况:

  • \(i\)没有质因子\(p_j\),那么直接计算即可。
  • \(i\)有质因子\(p_j\),那么应该修改\(p_j\)的贡献。所以需要记录每个数的最小质因子对它的约数和的贡献。

然后时间复杂度\(O(n)\)。

test20190731 夏令营NOIP训练16的更多相关文章

  1. test20190805 夏令营NOIP训练20

    100+0+0=100,由于第二题写挂rank 1就没了 山 xyz现在站在一个斜坡面前 这个斜坡上依次排布这n座山峰,xyz打算爬上其中的一座 因为xyz体力不好,所以他只能爬上最矮的一座山 又因为 ...

  2. test20190803 夏令营NOIP训练19

    60+100+0=160 贪婪大陆 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...

  3. test20190802 夏令营NOIP训练18

    今天的题很有难度啊.然而我10:40才看题-- 高一学堂 在美丽的中山纪念中学里面,有一座高一学堂.所谓山不在高,有仙则名:水不在深,有龙则灵.高一学堂,因为有了yxr,就成了现在这个样子 = =. ...

  4. test20190729 夏令营NOIP训练14

    40+100+0=140. 基因光线 黑大帅统治古古怪界后,一直在玩一种很奇葩的游戏.在一个二维平面上,他先复制了n个小A,把他们放在不同的位置,然后射出一条ax+by+c=0的基因光线,宽度为d,即 ...

  5. 夏令营501-511NOIP训练16——数字转换

    传送门:QAQQAQ 题意:如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和:如果对于某个y>x且y的约数和为x,那么x也可以变成y.例如,4可以变为3,1可以变为 ...

  6. Noip 训练指南

    目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...

  7. 9.19[XJOI] NOIP训练37

    上午[XJOI] NOIP训练37 T1 同余方程 Problem description 已知一个整数a,素数p,求解 $x^{2}\equiv a(mod p) $ 是否有整数解 Solution ...

  8. NOIP训练测试2(2017081502)

    唔,这是今天第二场训练测试. 上一轮不够难,现在来一波更简单的.[滑稽] 注意时间! 测试时间:3小时 题目一:Cantor表 题目二:回文数 题目三:拼数 题目四:进制位 题目五:邮票面值设计 都是 ...

  9. 2018.11.02 NOIP训练 停车场(线段树)

    传送门 这是一道困饶了我一年的题. 其实就是去年去NOIP提高组试水的时候考的模拟题 但当时我水平不够,跟ykykyk一起杠了一个下午都没调出来. 今天终于AAA了. 其实就是一个维护最长连续0101 ...

随机推荐

  1. PostgreSql11.5源码安装

    参考:https://yq.aliyun.com/articles/675687/ 1.先下载postgresql11.5的源码包:https://www.postgresql.org/ftp/sou ...

  2. PHP设计模式 - 享元模式

    运用共享技术有效的支持大量细粒度的对象 享元模式变化的是对象的存储开销 享元模式中主要角色: 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口.那些 ...

  3. LeetCode | 152. 乘积最大子序列

    原题(Medium): 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 思路: 遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素 ...

  4. 20191213-RF中报告打不开提示Opening Robot Framework report failed

    配置好Jenkins的RF框架后跑了一次autotest发现哦豁report打不开,网上找了一堆方法都是只能临时解决,重启后又失效了.现在给出临时解决方案和永久解决方案 首先错误信息如下:  临时解决 ...

  5. WITH AS学习

    一.WITH AS的含义     WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...

  6. TiDB基本架构简单总结

    TiDB特点 高可用 水平拓展 事务 SQL支持 TiDB架构 ​ 和MySql不同,TiDB是一个分布式的数据库而不是单个进程,所以整个TiDB是由以下角色组成: TiKV, PD, TiDB, T ...

  7. InnoDB的MVCC实现原理

    InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的. 这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间).当然存储的并不是实际时间,而是系统版本号(sytem ve ...

  8. Microsoft.AspNet.Identity 自定义使用现有的表—登录实现,aspnet.identity

    Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...

  9. 测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯

    编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...

  10. Redis之RDB和AOF持久化介绍

    什么是数据库状态 redis是一个键值对的数据库服务器,服务器中通常包含中任意个非空的数据库,而每个数据库又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及他们的键值对统称为数据库状 ...