树线段hdu 4508 美素数(线段树)
本文朋友在青岛吃饭的时候突然想到的...近期就有想写几篇关于树线段的博客,所以回家到之后就奋笔疾书的写出来发布了
当前解题呈文都加上题目。
数据量比较大,感觉暴力的话会超时,所以用线段树处理。
逐一求出美素数,然后将美素数存入线段树中。。。。不知道该说啥了,模板级线段树。。。。。
#include<stdio.h> #include<string.h> #define N 1000005 int a[N]; struct node { int x,y; int count; }s[N*3]; void CreatTree(int t,int x,int y) { s[t].count=0; s[t].x=x; s[t].y=y; if(s[t].x==s[t].y) return ; int temp=t*2; int mid=(x+y)/2; CreatTree(temp,x,mid); CreatTree(temp+1,mid+1,y); return ; } void InsertTree(int t,int x) { if(s[t].x==s[t].y&&s[t].x==x) { s[t].count++; return ; } int temp=t*2; int mid=(s[t].x+s[t].y)/2; if(x>mid) InsertTree(temp+1,x); else InsertTree(temp,x); s[t].count=s[temp].count+s[temp+1].count; return ; } int FindTree(int t,int x,int y) { if(s[t].x==x&&s[t].y==y) return s[t].count; int mid=(s[t].x+s[t].y)/2; int temp=t*2; int sum=0; if(x>mid) sum+=FindTree(temp+1,x,y); else if(y<=mid) sum+=FindTree(temp,x,y); else { sum+=FindTree(temp,x,mid); sum+=FindTree(temp+1,mid+1,y); } return sum; } int fun(int x) { int sum; sum=0; while(x) { sum+=x%10; x/=10; } return sum; } int main() { int T; int i,j; memset(a,0,sizeof(a)); a[0]=a[1]=1; CreatTree(1,1,1000000); for(i=2;i<=1000000;i++) { if(a[i]==0) { if(a[fun(i)]==0) InsertTree(1,i); for(j=i*2;j<=1000000;j+=i) a[j]++; } } int m,n; int count; count=1; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); printf("Case #%d: %d\n",count++,FindTree(1,m,n)); } return 0; }
文章结束给大家分享下程序员的一些笑话语录: 据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。
硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。”
项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”
---------------------------------
原创文章 By
树和线段
---------------------------------