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. java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)

    关于JAVA Project.waitfor()返回值是1   0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...

  2. mybatis源码学习:插件定义+执行流程责任链

    目录 一.自定义插件流程 二.测试插件 三.源码分析 1.inteceptor在Configuration中的注册 2.基于责任链的设计模式 3.基于动态代理的plugin 4.拦截方法的interc ...

  3. PE文件学习(2)导入表导出表

    转自:evil.eagle https://blog.csdn.net/evileagle/article/details/12176797 导出表是用来描述模块中的导出函数的结构,如果一个模块导出了 ...

  4. 2019-2020-1 20199325《Linux内核原理与分析》第十一周作业

    实验简介: Set-UID 是 Unix 系统中的一个重要的安全机制.当一个 Set-UID 程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会 ...

  5. What does __GNUC__ mean?

    It indicates that I'm a GNU compiler and you can use GNU extensions. https://stackoverflow.com/quest ...

  6. tcpdump常用抓包命令

    主要语法 过滤主机/IP: tcpdump -i eth1 host 172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据   过滤端口: tcpdump -i ...

  7. HDU 6341 Let Sudoku Rotate

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...

  8. 【集群实战】inotify

    1. inotify简介 Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件). linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加 ...

  9. IBM:向所有云平台开放Watson人工智能系统

    据美国科技媒体TechCrunch报道,IBM今天宣布不再把沃森(Watson)品牌的人工智能服务局限于自家云计算服务,而是会允许其他企业在自己的数据中心里使用和运行这个平台."客户很难把人 ...

  10. 从零开始搭建口袋妖怪管理系统(4)-借助webpack4.6工程化项目(上)

    "手动是不可能手动的了,这辈子都不可能手动的了." 一.目标 上一章我们借助ngRoute,完成了口袋妖怪SPA系统的多模块导航开发,但是现在引用的东西越来越多,项目文件目录开始变 ...