Problem 1004 BFS都TLE

613 | 2015-12-05 20:52:02Author
。。。。卡的一手好常数
kuangbin | 2015-12-05 20:55:50# 1
会T吗?
admin | 2015-12-05 20:55:55# 2
不明觉厉..
613 | 2015-12-05 21:16:30# 3
。。。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<map> #include<set> #include<vector> #define LL long long #define LD long double using namespace std;//%I64d int fa[1200010],dp[1200010][12],dpans[1200010][12]; int cop[1200010]; int kkkk; int first[2000100],last[2000100],next[2000100],des[2000100],tt; void clear(int n) { for (int i=1;i<=n;i++) first[i]=last[i]=0; for (int i=1;i<=tt;i++) next[i]=des[i]=0; tt=0; } void getin(int c,int d) { des[++tt]=d; if (!first[c]) first[c]=last[c]=tt;else last[c]=next[last[c]]=tt; } inline void bfs() { int head=1,tail=0;cop[1]=1; while (head!=tail) { int s=cop[++tail]; for (int k=first[s];k!=0;k=next[k]) { cop[++head]=des[k]; } } } inline void getdp(int n) { for (int i=0;i<=kkkk;i++) for (int ii=n;ii>=1;ii--) { int s=cop[ii]; if (i==0) {dp[s][0]=1;continue;} dp[s][i]=0; for (int k=first[s];k!=0;k=next[k]) dp[s][i]+=dp[des[k]][i-1]; } for (int i=0;i<=kkkk;i++) for (int ii=1;ii<=n;ii++) { int s=cop[ii]; dpans[s][i]=dp[s][i]; if (fa[s]) { if (i>=1) dpans[s][i]+=dp[fa[s]][i-1]; if (i>=2) dpans[s][i]-=dp[s][i-2]; } if (i) dpans[s][i]+=dpans[s][i-1]; } } int main() { int t;scanf("%d",&t); while (t--) { int n,ai,bi;scanf("%d%d%d%d",&n,&kkkk,&ai,&bi); clear(n); fa[1]=0; for (int i=2;i<=n;i++) {fa[i]=((long long)ai*(long long)i+(long long)bi)%((long long)i-1)+1;getin(fa[i],i);} bfs(); getdp(n); int ans=0; for (int i=1;i<=n;i++) { int p=0; p+=dpans[i][kkkk]; ans^=p; } printf("%d\n",ans); } }
admin | 2015-12-05 21:27:57# 4
专门给你跑了一次没有时限的,大概耗时2.5s,结果是WA~~~请赛后提交~