码迷,mamicode.com
首页 > 其他好文 > 详细

[CCC 2018] 平衡树

时间:2018-08-19 11:58:26      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:efi   targe   print   ons   const   oid   can   red   size   

题面在这里!

 

    根据题目描述就可以直接模拟出一个暴力。

    如果把前 n^(1/2) 的树的方案数先一遍 O(n^(3/4)) 暴力预处理出来(其实复杂度并到不了这个级别),然后把n带进来直接暴力算就行了。

    顺便说一下这个玩意好像就是杜教筛的复杂度?

    只不过预处理不了 O(n^(2/3)),但是效果也不错了,毕竟n只有1e9。。

 

#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int N=40005;

int n,M;
ll ans[N];
unordered_map<int,ll> mmp;

inline void init(){
	ans[1]=ans[2]=1;
	for(int i=3;i<=M;i++)
	    for(int j=2,k,now;j<=i;j=k+1){
	    	now=i/j,k=i/now;
	    	ans[i]+=ans[now]*(ll)(k-j+1);
		}
}

inline ll Get(int x){
	if(x<=M) return ans[x];
	if(mmp.count(x)) return mmp[x];
	
	ll an=0;
	for(int i=2,j,now;i<=x;i=j+1){
		now=x/i,j=x/now;
		an+=Get(now)*(ll)(j-i+1);
	}
	
	mmp[x]=an;
	return an;
}

int main(){
	scanf("%d",&n),M=sqrt(n+0.5)+1;
	init(),printf("%llu\n",Get(n));
	return 0;
}

  

[CCC 2018] 平衡树

标签:efi   targe   print   ons   const   oid   can   red   size   

原文地址:https://www.cnblogs.com/JYYHH/p/9500566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!