151012总结

第一题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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值