首先考虑由$1!,2!,...,n!$所构成的虚树的一些性质:
1.每一个子树内所包含的阶乘的节点都是一个连续的区间(证明:对于子树k,如果存在$x!$和$y!$,即说明$x!$和$y!$的前$\delta(1,k)$大质因子相同,那么$z\in [x,y]$一定有$x! | z!|y!$,所以z!的前$\delta(1,k)$大个质因子也因该相同,即z!在k子树内);
2.记第i个点对应区间为$[l_{i}!,r_{i}!]$,设k的所有儿子$k\cdot p_{i}$(不妨设$p1<p2<...<p_{son}$),对于$x!$和$y!$($x<y$),其所在子树为$k\cdot maxdiv(x!/k)$和$k\cdot maxdiv(y!/k)$($maxdiv$为最大质因数),由于$x!|y!$,因此$maxdiv(x!/k)\le maxdiv(y!/k)$
将答案从1开始调整(不断向下走),并维护对应区间$[l!,r!]$,那么修改量$\Delta=\sum w_{i}-\sum_{i=l}^{r}w_{i}$,对于每一次移动,都需要保证新的$[l!,r!]$所对应的$\Delta>0$(容易发现能满足这个的最多只有1个),然后令$ans-=\Delta$
考虑如何维护$[l!,r!]$,由于质因子单调不上升,所以从大到小枚举质因子p,分为两类(设该节点为k):1.可以走下去,那么令$l=\min_{maxdiv(i!/k)=p}i$;2.不可以走下去,令$r=\min_{maxdiv(i!/k)=p}i-1$并减小p(同时还要维护$\Delta$)
考虑如何求$min_{maxdiv(i!/k)=p}i$,相当于要保证$i!$中p的幂次不小于$k$中p的幂次中最小的i,那么将每一个数按p的幂次为次数放入p的vector中,然后$i!$中p的幂次即vector中不大于i的数个数,由于p的幂次每一次最多+1,因此不断往后取即可
由于每一次操作要么减少素数大小,要么增加当前节点的深度,因此复杂度为$o(树高+素数个数)=o(nlog_{2}n+\frac{n}{ln\ n})$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 vector<int>v[N];
5 int n,vis[N],sum[N],le[N],ri[N];
6 long long s,ss,ans,a[N];
7 int main(){
8 for(int i=2;i<N-4;i++)
9 if (!vis[i]){
10 sum[i]=1;
11 v[i].push_back(i);
12 for(int j=2;i*j<N-4;j++){
13 vis[i*j]=1;
14 for(int k=j;k%i==0;k/=i){
15 sum[i*j]++;
16 v[i].push_back(i*j);
17 }
18 }
19 }
20 for(int i=2;i<N-4;i++)sum[i]+=sum[i-1];
21 while (scanf("%d",&n)!=EOF){
22 s=ans=0;
23 for(int i=1;i<=n;i++){
24 scanf("%lld",&a[i]);
25 s+=a[i];
26 ans+=a[i]*sum[i];
27 a[i]+=a[i-1];
28 }
29 int l=1,r=ri[n]=n,las=-1;
30 for(int i=n;i>=2;i--){
31 if (vis[i])continue;
32 le[i]=upper_bound(v[i].begin(),v[i].end(),l)-v[i].begin();
33 ans-=s*le[i]-1;
34 if (las>=0)ri[i]=v[las][le[las]]-1;
35 las=i;
36 while (1){
37 ss=2*(a[r]-a[l-1])-2*(a[ri[i]]-a[v[i][le[i]]-1]);
38 if (s-ss<=0)break;
39 s-=ss;
40 l=v[i][++le[i]];
41 r=ri[i];
42 ans-=s;
43 }
44 if (s<=0)break;
45 }
46 printf("%lld\n",ans);
47 }
48 }

[nowcoder5666B]Infinite Tree的更多相关文章

  1. HDU 5573 Binary Tree 构造

    Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...

  2. Binary Tree(二叉树+思维)

    Binary Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  3. 2015上海赛区B Binary Tree

    B - Binary Tree   Description The Old Frog King lives on the root of an infinite tree. According to ...

  4. hdu 5573Binary Tree

    Binary Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  5. hdu-5573 Binary Tree

    The Old Frog King lives on the root of an infinite tree. According to the law, each node should conn ...

  6. Binary Tree 分类: POJ 2015-06-12 20:34 17人阅读 评论(0) 收藏

    Binary Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6355   Accepted: 2922 Descr ...

  7. Element DOM Tree jQuery plugin – Firebug like functionality | RockingCode

    Element DOM Tree jQuery plugin – Firebug like functionality | RockingCode Element DOM Tree jQuery pl ...

  8. k-d tree算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

  9. Distance on the tree

    Distance on the tree https://nanti.jisuanke.com/t/38229 DSM(Data Structure Master) once learned abou ...

随机推荐

  1. Java初步学习——2021.10.05每日总结,第五周周三

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学了对象与类,如何定义类和创建对象,以及构建方法的用法. 明天课比较多,把今天未学的例子敲一遍好了. 没有遇到什么问题.

  2. pytest执行时mian函数传参

    在代码中执行pytest可以通过main函数 加参数来指定运行规则时,参数需要放在列表或者元祖中 # pytest.main(["--html=report.html"]) # p ...

  3. Android QMUI实战:实现APP换肤功能,并自动适配手机深色模式

    Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案. 之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因: 1.换肤功能的实现过程较简单.容易理解: 2.能轻松适配 ...

  4. 实现前后端分离,最好的方案就是SPA(Single Page Application)

    从通常意义来讲,说到必须,就是指最佳实践上,实现前后端分离,最好的方案就是SPA.所以才会有 前后端分离=SPA 的近似,忽视了其中的差别.但是,既然有疑问了,我们就来看一下,为什么SPA是实现前后端 ...

  5. Java(27)集合二List

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228435.html 博客主页:https://www.cnblogs.com/testero ...

  6. WEB安全指南

    说明:本文是Mozilla Web应用部署文档,对运维或者后端开发团队的部署行为进行指导.该部署安全规范内容充实,对于部署有很大意义.同时也涉及到了许多web前端应用安全的基本知识,如CSP, TOK ...

  7. Python绘制Excel图表

    今天讲解下如何使用Python绘制各种Excel图表,下面我们以绘制饼状图.柱状图.水平图.气泡图.2D面积图.3D面积图为例来说明. import openpyxlfrom openpyxl imp ...

  8. MySQL:提高笔记-4

    MySQL:提高笔记-4 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3 MySQL:提高笔记-4,本文 说 ...

  9. OO第四单元UML作业总结暨OO课程总结

    目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...

  10. 热身训练2 Another Meaning

    题目来源 简要题意: 众所周知,在许多情况下,一个词语有两种意思.比如"hehe",不仅意味着"hehe",还意味着"excuse me". ...