• 字典树变形 A


    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
    ", x);
    	for (int i = 18; i >= 0; i--) {
    		ll v = (x / f[i]) % 10;
    		// printf("i=%d v=%lld
    ", 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
    ", 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
    ", x);
    	int u = 0;
    	for (int i = 18; i >= 0; i--) {
    		ll v = (x / f[i]) % 10;
    		// printf("i=%d v=%lld
    ", i, v);
    		bool flag = 0;
    		for (int j = 9 - v + 1; j <= 9; j++) {
    			// printf("www u=%d v=%lld j=%d
    ", u, v,j);
    			if (trie[u][j]) {
    				u = trie[u][j];
    				// printf("j=%d
    ", 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
    ", val[u]);
    	return val[u];
    }
     
    ll a[maxn];
     
    ll check(ll a, ll b) {
    	ll ans = 0;
    	// printf("a=%lld b=%lld
    ", 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
    ", mins, maxs);
    	return 0;
    }
    

      

  • 相关阅读:
    李洪强九宫格的实现
    iOS开发多线程篇 11 —自定义NSOperation
    CALayer3-层的属性
    网络编程小结
    iOS开发多线程篇 10 —NSOperation基本操作
    CALayer2-创建新的层
    iOS开发之多文件上传
    三级联动
    用 ERD 盘解决 Win8 自己主动更新后不能启动的问题
    hdu1028(母函数+DP)
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/11342521.html
Copyright © 2020-2023  润新知