uva 10909 - Lucky Number(树状数组)
来源:互联网 发布:其孰能讥之乎的其 编辑:程序博客网 时间:2024/06/01 10:52
题目链接:uva 10909 - Lucky Number
题目大意:定义Lucky Number, 给定一个数n,输出有两个差值最小Lucky Number,x和y,要求x+y=n。
解题思路:根据Lucky Number定义,用树状数组预处理出所有的Lucky Number,然后对于每个n,用二分找到最接近n/2的Lucky Number,然后去枚举。
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#define lowbit(x) ((x)&(-x))const int maxn = 2000000;int N, fenw[maxn+5], vis[maxn+5], num[maxn+5];void add (int x, int v) { while (x <= maxn) { fenw[x] += v; x += lowbit(x); }}int find (int k) { int c = 0, p = 0; for (int i = 20; i >= 0; i--) { p += (1<<i); if (p > maxn || c + fenw[p] >= k) p -= (1<<i); else c += fenw[p]; } return p + 1;}int init (int n) { memset(fenw, 0, sizeof(fenw)); for (int i = 1; i <= maxn; i += 2) add(i, 1); n /= 2; for (int i = 2; i <= n; i++) { int l = find(i); if (n < l) break; for (int j = l; j <= n; j += l) vis[j] = find(j); for (int j = l; j <= n; j += l) add(vis[j], -1); n -= n / l; } memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { num[i] = find(i); vis[num[i]] = 1; } return n;}void solve (int n) { //int k = upper_bound(num.begin(), num.end(), n / 2) - num.begin(); //int k = lower_bound(num.begin(), num.end(), n / 2) - num.begin(); if ((n&1) == 0) { int k = upper_bound(num + 1, num + 1 + N, n / 2) - num - 1; while (k >= 1) { if (vis[n - num[k]]) { printf("%d is the sum of %d and %d.\n", n, num[k], n - num[k]); return; } k--; } } printf("%d is not the sum of two luckies!\n", n);}int main () { N = init(maxn); int n; while (~scanf("%d", &n)) { solve(n); } return 0;}
0 0
- UVA 10909 - Lucky Number(树状数组)
- uva 10909 - Lucky Number(树状数组)
- CF 121E Lucky Array 【树状数组】
- uva 12086 树状数组
- UVA 1513 树状数组
- lucky number
- Lucky Number
- Lucky Number
- lucky number
- Lucky Number
- Lucky Number
- CodeForces 121E Lucky Array (树状数组)
- CodeForces 121E -- Lucky Array (树状数组)
- CF 121E - Lucky Array(树状数组裸题)
- codeforces-121E Lucky Array(树状数组)
- Number sequence 树状数组基础
- HDU1394Minimum Inversion Number(树状数组)
- Minimum Inversion Number [树状数组]
- 关于路径问题
- f
- hdu5015 233 Matrix 西安网络赛I题 构造矩阵
- Spring事务详解
- Codeforces Round #266 (Div. 2)
- uva 10909 - Lucky Number(树状数组)
- 学习笔记
- HDU 1069 dp
- 内部类/内部接口那点事
- 单例模式在游戏中的运用
- ubuntu下安装matlab
- 频繁模式挖掘(Frequent Pattern Mining)
- hdu 5014 Number Sequence 位运算+规律
- 算法题目:寻找迷失的数字。