第一题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;
}
T3最小树形图计数,好像很水的样子,然后写了状压dp 100
写的略长。。。
//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);
}