第一题CE了,我居然忘记了cena不能开黑科技,还好没判0
方法很简单,本来可以用字典树做,但是这道题的节点是字符串
那还不简单,map搞起
可惜我开了hash_map然后挂掉了,最后追加回来 100
需要注意读入,听说有人写了200+行
//Copyright(c)2015 liuchenrui #include<cstdio> #include<ctime> #include<iostream> #include<algorithm> #include<cstring> #include<hash_map> #include<map> using namespace std; using namespace __gnu_cxx; typedef map<string,int> mytree; struct node { string s; mytree son; }file[10001]; int tot=1; char s[1500]; char p[21]; void dfs(int now,int c) { if(c!=0) { for(int i=1;i<=c-2;i++)printf("| "); if(c!=1)printf("|----"); cout<<file[now].s<<endl; } for(mytree::iterator it=file[now].son.begin();it!=file[now].son.end();it++) { dfs(it->second,c+1); } } int main() { freopen("file.in","r",stdin); freopen("file.out","w",stdout); int n;scanf("%d\n",&n); while(n--) { memset(s,0,sizeof s); gets(s); int t=-1,now=1,pinko=0; while(1) { if(s[pinko]==0)break; memset(p,0,sizeof(p)); t=-1; while(s[pinko]!='/' && s[pinko]!=0)p[++t]=s[pinko++]; pinko++; string k=p; if(file[now].son[k]==0)file[now].son[k]=++tot; file[file[now].son[k]].s=k; now=file[now].son[k]; } } dfs(1,0); }T2 最难的题,双向链表加堆优化
考试写了n^2 dp 还写错。45滚粗了
//Copyright(c)2015 liuchenrui #include<cstdio> #include<ctime> #include<iostream> #include<algorithm> #include<cstring> //point 55 using namespace std; inline void R(int &v) { v=0;char c=0;int p=1; while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();} while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();} v*=p; } using namespace std; int n,m; int l[200001],r[200001]; int d[200001],pos[200001],a[200001]; void up(int x) { int i=x; while(i>1&&a[d[i]]>a[d[i/2]]) { swap(d[i],d[i/2]); swap(pos[d[i]],pos[d[i/2]]); i/=2; } } void down(int x) { { int i=x,j; while(i*2<=n) { if(i*2==n||a[d[i*2]]>a[d[i*2+1]])j=i*2; else j=i*2+1; if(a[d[i]]>a[d[j]])return; swap(d[i],d[j]); swap(pos[d[i]],pos[d[j]]); i=j; } } } int main() { freopen("compile.in","r",stdin); freopen("compile.out","w",stdout); R(n),R(m); if((n>>1)<m){cout<<"Error!";return 0;} for(int i=1;i<=n;i++) { cin>>a[i]; d[i]=i;pos[i]=i;up(i); l[i]=i-1;r[i]=i+1; } l[1]=n;r[n]=1; int ans=0; while(m--) { int x=d[1]; ans+=a[x]; a[x]=a[l[x]]+a[r[x]]-a[x]; a[l[x]]=-1111;down(pos[l[x]]); a[r[x]]=-1111;down(pos[r[x]]); down(1); l[x]=l[l[x]]; r[x]=r[r[x]]; r[l[x]]=x; l[r[x]]=x; } cout<<ans; return 0; }
写的略长。。。
//Copyright(c)2015 liuchenrui #include<cstdio> #include<ctime> #include<iostream> #include<algorithm> #include<cstring> using namespace std; inline void R(int &v) { v=0;char c=0;int p=1; while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();} while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();} v*=p; } const int zy[]={0,1,2,4,8,16,32,64,128}; int a[9][9]; int dp[9][555]; int n; void Dp(int nownum,int nownode) { int r[20],b=0,c=nownum; memset(r,0,sizeof r); while(c) { r[++b]=(c&1); c>>=1; } if(r[nownode]==1) { for(int x=1;x<nownum;x++) { int r2[20],b2=0,c2=x; memset(r2,0,sizeof r2); while(c2) { r2[++b2]=(c2&1); c2>>=1; } bool flag=true; for(int i=1;i<=19;i++) { if(r[i]==0 && r2[i]==1) { flag^=1; break; } } if(!flag)continue; for(int k=1;k<=n;k++) { if(k!=nownode) { int u=0; for(int y=19;y>=1;y--) { u<<=1; if(r[y]!=r2[y])u+=1; } int r3[20],b3=0,c3=u; memset(r3,0,sizeof r3); while(c3) { r3[++b3]=(c3&1); c3>>=1; } if(r3[k]==1) { int tot=0; for(int t=1;t<=n;t++) { if(a[t][k]==1) { int r4[20],b4=0,c4=x; memset(r4,0,sizeof r4); while(c4) { r4[++b4]=(c4&1); c4>>=1; } if(r4[t]==1)tot++; } } dp[nownode][nownum]+=tot*dp[k][nownum^x]*dp[nownode][x]; } } } } int tot=0; for(int t=1;t<=n;++t)if(r[t]==1)tot++; if(tot-1!=0)dp[nownode][nownum]/=tot-1; } } int main() { freopen("count.in","r",stdin); freopen("count.out","w",stdout); R(n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=getchar(); if(a[i][j]=='1')a[i][j]=1; else a[i][j]=0; } char c=getchar(); } for(int i=1;i<=n;++i)dp[i][1<<(i-1)]=1; for(int i=1;i<=(1<<n);i++) { for(int j=1;j<=n;j++) { Dp(i,j); } } int ans=0; for(int i=1;i<=n;++i) ans+=dp[i][(1<<n)-1]; printf("%d\n",ans); }