A - Gaby And Addition

Gym - 101466A

这个题目是一个字典树的变形,还是很难想到的。

因为这题目每一位都是独立的,不会进位,这个和01字典树求最大的异或和是不是很像。

知道这个了,就还比较好写了,不过要注意数组越界和超时问题。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <stack>
#include <map>
#include <string>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
ll val[maxn * 20];
int trie[maxn * 20][10], tot;
ll f[20];
void init() {
tot = 1;
memset(trie[0], 0, sizeof(trie[0]));
f[0] = 1;
for (int i = 1; i <= 18; i++) f[i] = f[i - 1] * 10;
}
 
void insert(ll x) {
int u = 0;
// printf("x=%lld\n", x);
for (int i = 18; i >= 0; i--) {
ll v = (x / f[i]) % 10;
// printf("i=%d v=%lld\n", i, v);
if (trie[u][v] == 0) {
memset(trie[tot], 0, sizeof(trie[tot]));
val[tot] = 0;
trie[u][v] = tot++;
}
// printf("u=%d v=%lld\n", u, v);
u = trie[u][v];
}
val[u] = x;
}
 
ll query_max(ll x) {
int u = 0;
for (int i = 18; i >= 0; i--) {
ll v = (x / f[i]) % 10;
bool flag = 0;
for (int j = 9 - v; j >= 0; j--) {
if (trie[u][j]) {
flag = 1;
u = trie[u][j];
break;
}
}
if (flag == 0) {
for (int j = 9; j >= 9 - v + 1; j--) {
if (trie[u][j]) {
u = trie[u][j];
break;
}
}
}
}
return val[u];
}
 
ll query_min(ll x) {
// printf("x=%lld\n", x);
int u = 0;
for (int i = 18; i >= 0; i--) {
ll v = (x / f[i]) % 10;
// printf("i=%d v=%lld\n", i, v);
bool flag = 0;
for (int j = 9 - v + 1; j <= 9; j++) {
// printf("www u=%d v=%lld j=%d\n", u, v,j);
if (trie[u][j]) {
u = trie[u][j];
// printf("j=%d\n", j);
flag = 1;
break;
}
}
if (flag == 0) {
for (int j = 0; j <= 9 - v; j++) {
if (trie[u][j]) {
u = trie[u][j];
break;
}
}
}
}
// printf("val=%lld\n", val[u]);
return val[u];
}
 
ll a[maxn];
 
ll check(ll a, ll b) {
ll ans = 0;
// printf("a=%lld b=%lld\n", a, b);
for (int i = 18; i >= 0; i--) {
ans = ans * 10 + (a / f[i] % 10 + b / f[i] % 10) % 10;
}
return ans;
}
 
int main() {
int n;
init();
scanf("%d", &n);
ll maxs = 0, mins = inf64;
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
if(i!=1)
{
ll res1 = query_max(a[i]);
ll res2 = query_min(a[i]);
maxs = max(maxs, check(a[i], res1));
mins = min(mins, check(a[i], res2));
}
insert(a[i]);
}
printf("%lld %lld\n", mins, maxs);
return 0;
}

  

字典树变形 A - Gaby And Addition Gym - 101466A的更多相关文章

  1. Gaby And Addition Gym - 101466A (初学字典树)

    Gaby is a little baby who loves playing with numbers. Recently she has learned how to add 2 numbers ...

  2. POJ 3764 - The xor-longest Path - [DFS+字典树变形]

    题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-w ...

  3. CH 1602 - The XOR Largest Pair - [字典树变形]

    题目链接:传送门 描述在给定的 $N$ 个整数 $A_1, A_2,\cdots,A_N$ 中选出两个进行xor运算,得到的结果最大是多少? 输入格式第一行一个整数 $N$,第二行 $N$ 个整数 $ ...

  4. HDU 1247 Hat’s Words(字典树变形)

    题目链接:pid=1247" target="_blank">http://acm.hdu.edu.cn/showproblem.php? pid=1247 Pro ...

  5. hdu 2846 字典树变形

    mark: 题目有字串匹配的过程 有两点 1.为了高效的匹配子串 可以把所有的子串都预处理进去 然后字典树计数就放在最后面 2.在同一个母串处理自串的时候 会有重复的时候 比如abab  这里去重用个 ...

  6. CodeFoeces GYM 101466A Gaby And Addition (字典树)

    gym 101466A Gaby And Addition 题目分析 题意: 给出n个数,找任意两个数 “相加”,求这个结果的最大值和最小值,注意此处的加法为不进位加法. 思路: 由于给出的数最多有 ...

  7. A .Gaby And Addition (Gym - 101466A + 字典树)

    题目链接:http://codeforces.com/gym/101466/problem/A 题目: 题意: 给你n个数,重定义两个数之间的加法不进位,求这些数中两个数相加的最大值和最小值. 思路: ...

  8. 【贪心】【字典树】Gym - 101466A - Gaby And Addition

    题意:定义一种无进位加法运算,给你n个正整数,问你取出两个数,使得他们加起来和最大/最小是多少. 无进位加法运算,其实是一种位运算,跟最大xor那个套路类似,很容易写出对于每个数字,其对应的最优数字是 ...

  9. ACM: Gym 100935F A Poet Computer - 字典树

    Gym 100935F A Poet Computer Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d &am ...

随机推荐

  1. 2019-06-02 Python之微信好友数据分析以及运用Pyecharts可视化

    一.库的使用说明 pass 二.微信好友信息的获取 def get_friends_info(self): #获取好像信息,返回lis列表 bot = Bot() lis = [['name', 'r ...

  2. 选择IT行业的自我心得,希望能帮助到各位!(六)

    在这个社会,想做大事的人很多,但是很多事情也挺难做的,为什么说复杂的事情简单做,简单的事情重复做,这样一个人才能获得更多的优越品质,为啥说改变,人还是挺难过的,都知道本性难移,想改挺难得.在这个社会千 ...

  3. 3d模型一般怎么导入到到Threejs中使用

    这是我之前做的一个demo,导入的3d模型文件是obj格式的,需要使用OBJLoader和MTLLoader, mtl文件用于描述多边形可视面貌的材质如果你可以导出obj.mtl文件的话,那么就可以使 ...

  4. Python套接字之UDP

    目录 基于UDP的socket 发送消息 接收消息 基于UDP的socket 面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃,并不能到达服务器端 发送消息 在 ...

  5. Connections in Galaxy War ZOJ - 3261 (并查集)

    点权并查集的反向离线操作 题目大意:有n个stars,每一个都一定的“颜值”.然后stars与stars之间可以相连,query c表示再与c相连的stars中,颜值比c高的,stars的标号,如果有 ...

  6. 带权值的图 BFS

    用bfs遍历最图求最短路径时通常借用优先队列即优先考虑最大的或者最小的权值 方法1 优先队列:(内置函数,优先考虑较小的权值) #include<iostream> #include< ...

  7. Oracle计算数值型的幂次方——POWER()

    Oracle计算数值型的幂次方 简介:幂次方就是幂函数的变形,在POWER(value1,value2)中,value1就是函数的底数,value2就是函数的指数.如:POWER(value1,val ...

  8. ORM之单表、多表操作

    参考1 参考2 表与表之间的关系: 一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面 一对多(ForeignKey):一对多字段建在 ...

  9. python信息收集(三)

        前两篇介绍了利用python编写一些脚本实现二层主机的发现,这一篇介绍一下三层主机的发现.     一般来说,三层主机的发现主要是通过ICMP协议来实现的.其中ICMP协议中的ping命令可以 ...

  10. Mybatis 使用 SQL 递归获取单表中的树结构

    xml 代码 <resultMap type="xxx.xxx.xxx.xxx.实体类" id="xxxListTree"> <result ...