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. 在ensp上的ARP及Proxy ARP

    啥是ARP?啥又是Proxy ARP? ARP是用来将 IP 地址解析为 MAC 地址的协议. ARP 表项可以分为动态和静态两种类型.动态 ARP ,是利用 ARP 广播报文,动态执行并自动进行 I ...

  2. dockfile构建自己的tomcat

    touch  Dockerfile 在Dockerfile中输入以下内容 FROM centosMAINTAINER Irish<3395327965@qq.com>#把宿主机当前上下文的 ...

  3. makefile从0到1

    一.什么是makefile 百度百科:Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是Unix程序员.在 Linux(u ...

  4. C++Primer 5th Chap2 Variables and basic Types

    wchar_t,char16_t,char32_t用于拓展字符集 char和signed char并不一样,由编译器决定类型char表现上述两种中的哪一种 一般long的大小和int无二,如果超过in ...

  5. 文件和异常——python从编程入门到实践

    从文件中读取数据 1. 读取整个文件 要读取文件,首先来创建一个文件: 然后打开并读取这个文件,再将其内容显示到屏幕上: file_reader.py with open('pi_digits.txt ...

  6. Typora语法使用说明

    目录 文本 标题 超链接 锚点 列表 引用 插入图片 脚注 代码 LaTex公式 插入表情 任务列表 高亮 注脚 文本 代码: *斜体* **粗体** ***斜体加粗体*** ~~删除线~~ < ...

  7. mysql中常见正则表达式的应用

    查找name字段中以'st'为开头的所有数据: mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st'; 查找name字段中以'ok ...

  8. lombok工具插件安装(idea、eclipse)

    https://blog.csdn.net/Y_hahaha/article/details/89186284   缘由,项目在IDEA下@Data.@Builder注解不起作用.发现是lombok这 ...

  9. “SQL Server does not exist or access denied.”

    Have resolved the problem, the Port was different and so the Connection String now reads: <connec ...

  10. 进入恢复模式(Recovery HD)

    进入恢复模式(Recovery HD) 1,选中要启动的虚拟机,随后点击VM菜单的启动按钮后面向下箭头,随后点击菜单项”打开电源时进入固件“. 2,在虚拟机里面,用上下键移动到”Enter setup ...