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. vs中调试程序查看变量在内存中的内容的方法

    vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...

  2. SpringBoot + Mybatis搭建完整的项目架构

    准备工作: Java开发环境 已安装 springboot 插件(STS)的 Eclipse MySQL服务  一. 创建 springboot 项目 1. 打开Eclipse  --> 左上角 ...

  3. 大型web项目构建之负载均衡

    日常开发和学习中经常会听到或者会看到“负载均衡”这个词汇,但是对于很多初级每天只面对增删改代码的开发人员来说,这个词汇好像离我们很遥远又很接近,很多人多多少少都有点一知半解 我结合以前在开发中遇到的场 ...

  4. son-server模拟http mock数据

    json-server 前端开发中,想通过异步请求服务端json数据,但是服务端还没有开发完,此时可以快速启动一个server服务 1,安装json-server插件 npm -g add json- ...

  5. Tomcat logs文件夹下不同文件的意义

      tomcat每次启动时,自动在logs目录下生产以下日志文件,按照日期自动备份   localhost.2016-07-05.txt   //经常用到的文件之一 ,程序异常没有被捕获的时候抛出的地 ...

  6. 用GDB调试程序(四)

    查看栈信息————— 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中.你可以用GDB命令 ...

  7. D03-R语言基础学习

    R语言基础学习——D03 20190423内容纲要: 1.导入数据 (1)从键盘输入 (2)从文本文件导入 (3)从excel文件导入 2.用户自定义函数   3.R访问MySQL数据库 (1)安装R ...

  8. 通过Visual Studio快速生成Json或XML反序列化类代码

    Visual Studio不愧是宇宙第一强的IDE工具,在Json.XML格式漫天飞.反序列化需求遍地走的现在,居然到最近才知道原来微软已经在Visual Studio集成了这么一样的良心功能,自动根 ...

  9. ABP 基于DDD的.NET开发框架 学习(六)创建新动态Api

    我们想要这个服务暴露成一个Web API控制器,以方便客户端调用.ASP.NET Boilerplate能够自动且动态地为这个应用服务创建Web API 控制器,只需要一行配置代码即可完成. Dyna ...

  10. 【转载】 C#使用Math.Abs返回数值的绝对值

    在C#的数值运算中,有时候我们需要计算值类型对象的绝对值,此时需要用到C#的数值计算类Math类中的Abs绝对值函数,Math.Abs绝对值函数一共有7个重载类型,支持decimal.double.f ...