Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Hash 用静态链表TLE 求大牛知道该怎么办!!!#include<iostream> #include<stdio.h> #include<cmath> using namespace std; struct D { int ele,next; }; D Link[3375000]; int head; int Hash[4000037]; int k[6],p[6]; int n,M; int ans; void init_Link() { head = 0; for(int i = 0 ; i < 3374999 ; i++)Link[i].next = i+1; Link[3374999].next = -1; } void init_Hash() { for(int i = 0 ; i < 4000037 ; i++)Hash[i] = -1; } int Malloc() { int H = head ; head = Link[head].next ; return H; } inline int Pow(int xi,int pi) { return (int)ceil(pow(1.0*xi,1.0*pi)); } void make_Hash(int d,int sum) { if(d == (n+1)/2) { int H = Malloc(); int temp = sum; temp = temp<0?-temp:temp; Link[H].next = Hash[temp%4000037]; Hash[temp%4000037] = H; Link[H].ele = sum ; return ; } else { for(int i = 1 ; i <= M ; i++) { make_Hash(d+1,sum+k[d]*Pow(i,p[d])); } } } void get_ans(int d,int sum) { if(d == n ) { int temp = sum; temp = temp<0?-temp:temp; int p = Hash[temp%4000037]; while(p!=-1) { if(Link[p].ele + sum == 0)ans++; p = Link[p].next; } return ; } else { for(int i = 1 ; i <= M ; i++) { get_ans(d+1,sum+k[d]*Pow(i,p[d])); } } } int main() { while(scanf("%d",&n)!=EOF) { ans = 0; scanf("%d",&M); for(int i = 0 ; i < n ; i++)scanf("%d%d",&k[i],&p[i]); init_Link(); init_Hash(); make_Hash(0,0); get_ans((n+1)/2,0); printf("%d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator