HDU5812 Distance 构造,预处理

分析:怎么看都是超时,但是可以先筛一遍1e6以内的每个数的最小素数

算出每个数由多少个素数组成,然后应用,c[1e6][20]

就是题解的那一套,参照题解,比赛的时候没有想到好的办法筛一个数的因子,醉了

然后赛后发现,预处理因子肯定超时,虽然是O(nlogn)的,但是n是1e6啊,常数太大

而且单组操作只有5e4,所以暴力sqrt(x)即可

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6+1;
int c[N][21],tot,prime[80000],mn[N],cnt[N],q,kase;
bool check[N];
char op[5];
void getprime()
{
    for(int i=2; i<=N-1; ++i)
    {
        if(!check[i])mn[i]=prime[++tot]=i;
        for(int j=1; j<=tot; ++j)
        {
            if(i*prime[j]>N-1)break;
            check[i*prime[j]]=true;
            mn[i*prime[j]]=prime[j];
            if(i%prime[j]==0)break;
        }
    }
}
void getcnt()
{
    for(int i=2; i<=N-1; ++i)
    {
        int tmp=i;
        while(tmp!=1)++cnt[i],tmp/=mn[tmp];
    }
}
int main()
{
    getprime();
    getcnt();
    memset(mn,0,sizeof(mn));
    while(~scanf("%d",&q),q)
    {
        printf("Case #%d:\n",++kase);
        memset(c,0,sizeof(c));
        int ttt=0;
        for(int i=0; i<q; ++i)
        {
            int x;
            scanf("%s%d",op,&x);
            if(op[0]==‘I‘)
            {
                if(mn[x]==kase)continue;
                mn[x]=kase;++ttt;
                for(int j=1; j*j<=x; ++j)
                {
                    if(x%j)continue;
                    ++c[j][cnt[x/j]];
                    if(x/j!=j)++c[x/j][cnt[j]];
                }
            }
            else if(op[0]==‘D‘)
            {
                if(mn[x]!=kase)continue;
                mn[x]=0;--ttt;
                for(int j=1; j*j<=x; ++j)
                {
                    if(x%j)continue;
                    --c[j][cnt[x/j]];
                    if(x/j!=j)--c[x/j][cnt[j]];
                }
            }
            else
            {
                if(ttt==0){printf("-1\n");continue;}
                int ans=100;
                for(int j=1; j*j<=x; ++j)
                {
                    if(x%j)continue;
                    for(int k=0; k<=20; ++k)
                    {
                        if(c[j][k])
                        {
                            ans=min(ans,k+cnt[x/j]);
                            break;
                        }
                    }
                    if(x/j!=j)
                    {
                        for(int k=0; k<=20; ++k)
                        {
                            if(c[x/j][k])
                            {
                                ans=min(ans,k+cnt[j]);
                                break;
                            }
                        }
                    }
                }
                if(ans==100)ans=-1;
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

时间: 2024-12-05 23:04:30

HDU5812 Distance 构造,预处理的相关文章

java,大数据批量插入、更新

public void exec(Connection conn){ try { conn.setAutoCommit(false); Long beginTime = System.currentTimeMillis(); //构造预处理statement PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)"); //1万次循环 for(int i=1;i<=100000;i+

预处理与构造数据

knowledge can grow with given 一.预处理(预编译)    定义:在编译之前对程序进行的处理                                预编译     编译     汇编      链接                        *.c ——> *.i —> *.S —> *.o —> elf                        MOV R1, R2 —>  1010 0001 0010 包含:头文件包含.宏定义.

1046 Shortest Distance (20point(s)) Easy only once *数组预处理问题

基本思想: 对于这个环形的正权值队列来说,完全可以从第一个节点计数,用1~i和1~j节点的距离来计算i~j节点的距离: 注意点: 1.对于高次个数,遍历不靠谱,找机会打表和优化结构: 2.对于正负权值要注意: 超时代码: 1 #include<iostream> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #include<vector> 5 #include<string> 6 #include<

数据预处理(完整步骤)

原文:http://dataunion.org/5009.html 一:为什么要预处理数据?(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据:数据仓库需要对高质量的数据进行一致地集成)(3)原始数据中存在的问题:不一致 —— 数据内含出现不一致情况重复不完整 —— 感兴趣的属性没有含噪声 —— 数据中存在着错误.或异常(偏离期望值)的数据高维度二:数据预处理的方法(1)数据清洗 —— 去噪声和无关数据(2)数

POJ - 2253 Frogger(Floyd最短路+预处理)

题目链接:http://poj.org/problem?id=2253 题意:青蛙要从点1到点2,给出各点的坐标,如果点A到点B可以通过A->C,C->B,A到B的距离可以用A->C和C-B中较长的一边代替(如果A直接到B更短的话就不用了),求点1到点2的最短距离. 题解:本来想用dijkst,但是想想就200的数据量,直接Floyd岂不美滋滋.先预处理一下各点之间的距离.因为取两条边中较长的那条边,所以转移的话,那转移的两条边都要比原来的短才可以. 值得注意的是用C的格式输入的时候要用

机器学习系列(6)_从白富美相亲看特征预处理与选择(下)

作者:viewmode=contents">龙心尘 &&寒小阳 时间:2016年1月. 出处: http://blog.csdn.net/longxinchen_ml/article/details/50493845. http://blog.csdn.net/han_xiaoyang/article/details/50503115 声明:版权全部,转载请联系作者并注明出处 1. 剧情一:挑螃蟹的秘密 李雷与韩梅梅的关系发展得不错.趁国庆休假一起来天津玩. 今天,李雷十分

《数据挖掘概念与技术》--第三章 数据预处理

一.数据预处理 1.数据如果能够满足其应用的要求,那么他是高质量的. 数据质量涉及许多因素:准确性.完整性.一致性.时效性.可信性.可解释性. 2.数据预处理的主要任务:数据清洗.数据集成.数据规约.数据变换. 二.数据清理:试图填充缺失值,光滑噪声.识别利群点.纠正数据中的不一致. 1.缺失值的处理: 1)忽略元组:缺少类标号时通常这么做.但是忽略的元组其他属性也不能用,即便是有用的. 2)人工填写:该方法很费事费时,数据集很大.缺失值很多时可能行不通. 3)使用一个全局常量填充缺失值:将缺失

UVa 729 - The Hamming Distance Problem

题目:构造n位01串,其中有m个1的所有组合. 分析:搜索.枚举.可以利用库函数,求解,也可以利用dfs求解:我这里采用位运算计算组合数. 说明:注意库啊! #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int S[20]; int main() { int T,N,M; while ( cin >> T ) for ( int t = 1 ; t

数据预处理技术

数据预处理技术数据清理:空缺值处理.格式标准化.异常数据清除.错误纠正.重复数据的清除数据集成:将多个数据源中的数据结合起来并统一存储,建立数据仓库的过程实际上就是数据集成.数据变换:平滑.聚集.规范化.最小 最大规范化等数据归约:维归(删除不相关的属性(维)).数据压缩(PCA,LDA,SVD.小波变换).数值归约(回归和对数线形模型.线形回归.对数线形模型.直方图)数据离散化和概念分层 1.数据清理:格式标准化.异常数据清除.错误纠正.重复数据的清除通过填写空缺值,平滑噪声数据,识别删除孤立