[数据结构] HDU5812 Distance
来源:互联网 发布:网络机顶盒看直播软件 编辑:程序博客网 时间:2024/05/22 03:43
Distance
题意:
维护一个集合,有三种操作.
- 插入 x
- 删除 x
- 设y属于集合,给定x,找出f(y,x) = z,最小的z
其中f(y,x)定义为每次乘上或除上一个素数,把y变成x的最小操作次数。
思路:
可以看出f函数的值就是x和y的对应质因子的个数差的总和,一个暴力一点的思路就是遍历x的所有约数,在集合中查询有这个约数的数的答案,再考虑下其实用一组multiset,multiset[k]表示有k这个约数的数的质因子个数,因为是有序的,每次取第一个就行了,找x的约数是sqrt(x)的时间,时限比较宽,足够ac了。
关于正确性,你可能觉得除了k,还存在其他相同的质因子,这样答案不就算多了吗?其实遍历所有的,最小的肯定也找出来了。
#include<bits/stdc++.h>using namespace std;const int N = 1e6+5;int prime[N], isprime[N] = {0}, pcnt, cnt[N];void get_prime(){ pcnt = cnt[1] = 0; for(int i = 2; i < N; ++i){ if(!isprime[i]) prime[pcnt++] = i, cnt[i] = 1; for(int j = 0; j < pcnt && i*prime[j] < N; ++j){ isprime[i * prime[j]] = true; cnt[i*prime[j]] = cnt[i]+1; if(i % prime[j] == 0) break; } }}multiset<int>divisor[N];bool in[N];char s[5];int get(int x){ return divisor[x].empty()? ~0u>>3 : *(divisor[x].begin());}inline void del(int i, int x){ auto it = divisor[i].find(x); if(it != divisor[i].end()) divisor[i].erase(it);}int main(){ get_prime(); int q, ca = 1, x; while(scanf("%d", &q), q){ memset(in, 0, sizeof(in)); for(int i = 0; i < N; ++i) divisor[i].clear(); int sum = 0; printf("Case #%d:\n", ca++); while(q--){ scanf("%s%d", s, &x); if(s[0] == 'I' && !in[x]){ in[x] = 1, sum++; int i; for(i = 1; i*i < x; ++i){ if(x%i) continue; divisor[i].insert(cnt[x/i]); divisor[x/i].insert(cnt[i]); } if(i*i == x) divisor[i].insert(cnt[i]); } if(s[0] == 'D' && in[x]){ in[x] = 0, sum--; int i; for(i = 1; i*i < x; ++i){ if(x%i) continue; del(i, cnt[x/i]); del(x/i, cnt[i]); } if(i*i == x) del(i, cnt[i]); } if(s[0] == 'Q'){ if(sum == 0){ printf("-1\n"); continue; } int ans = ~0u>>3; for(int i = 1; i*i <= x; ++i){ if(x%i) continue; ans = min(ans, get(i) + cnt[x/i]); ans = min(ans, get(x/i) + cnt[i]); } printf("%d\n", ans); } } }}
0 0
- [数据结构] HDU5812 Distance
- 2016多校训练Contest7: 1004 Distance hdu5812
- HDU5812(2016多校第七场)——Distance(数论,枚举)
- hdu5812 区间操作
- Distance
- distance
- distance
- Distance
- 【利用perl的基因数据处理】复杂数据结构:矩阵 and Edit Distance Matrix
- Edit Distance (Levenshtein Distance)
- Levenshtein distance(Edit distance)
- Distance mapping
- Levenshtein Distance
- Hamming Distance
- Levenshtein Distance
- edit distance
- distance transform
- Diffussion Distance
- 如何打乱List 或 Array元素的顺序
- C++常见知识点复习-如何限制类对象只能在堆上或者栈上分配
- Android——使用GridView制作二维布局界面(行、列分布)
- 如何在Python中实现这五类强大的概率分布
- 如何使用Retrofit下载大文件
- [数据结构] HDU5812 Distance
- CodeForces 689C Mike and Chocolate Thieves
- MySQL之Field 'email' doesn't have a default value问题
- Java_Pro4_回收探究_08_10
- 百度2017年暑期实习生笔试题——单词接龙(有向欧拉图)
- js学习笔记 -运动框架(一)
- Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
- HashCode的分析
- for循环结构常用实例介绍