2018.09.01测试

D2

T1

              水题

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
#define maxn 1000+10
using namespace std;

int n,m,q,x,y,z;
int color[maxn][2],tim[maxn][2];

int read()
{
	int xx=0,kk=1;char ch=' ';
	while(!isdigit(ch)){ch=getchar();if(ch=='-')kk=-1;}
	while(isdigit(ch)){xx=xx*10+ch-'0';ch=getchar();}
	return kk*xx;
}

void print()
{
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
			printf("%d ",tim[i][0]>tim[j][1]?color[i][0]:color[j][1]);
		puts("");
	}
	
}

int main()
{
	froepen("matrix.in","r",stdin);
	freopen("matrix.out","w",stdout);
	n=read(),m=read(),q=read();
	for(int i=1;i<=q;++i)
	{
		x=read(),y=read(),z=read();
		color[y][x-1]=z;tim[y][x-1]=i;
	}
	print();
	return 0;
}

T2 

             dp[i][0]表示第i步向上走的方案数,dp[i][1]表示向左/右的方案数,向左向右的方案是有对称性的所以处理一个就好啦

              我们可以轻松的得到dp方程:

                                    dp[i][0]=2*dp[i-1][0]+dp[i-1][1];    dp[i][1]=dp[i-1][0]+dp[i-1][1];

             看了一眼数据范围,然后就很愉快的交给矩阵快速幂了

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
#define ll long long
#define maxn 3
using namespace std;

int n;
const int plane=1e9+7;

struct matrix
{
	ll m[maxn][maxn];
	void clear()
	{
		for(int i=0;i<maxn;++i)
		for(int j=0;j<maxn;++j)
		    m[i][j]=0;
	}
}a,b,e;

int read()
{
	int xx=0,kk=1;char ch=' ';
	while(!isdigit(ch)){ch=getchar();if(ch=='-')kk=-1;}
	while(isdigit(ch)){xx=xx*10+ch-'0';ch=getchar();}
	return kk*xx;
}

matrix mul(matrix a,matrix b)
{
	matrix c;c.clear();
	for(int i=1;i<maxn;++i)
	for(int j=1;j<maxn;++j)
	for(int k=1;k<maxn;++k)
	    c.m[i][j]=(a.m[i][k]*b.m[k][j]%plane+c.m[i][j])%plane;
	return c;
}

matrix poww(matrix a,int b)
{
	matrix base=a,ans=e;
	while(b)
	{
		if(b&1) ans=mul(ans,base);
		base=mul(base,base);
		b>>=1;
	}
	return ans;
}

int main()
{
	freopen("coordinate.in","r",stdin);
	freopen("coordinate.out","w",stdout);
	n=read();a.clear();b.clear();e.clear();
	a.m[1][1]=1,a.m[2][1]=1;e.m[1][1]=1,e.m[2][2]=1;
	b.m[1][1]=1,b.m[1][2]=1,b.m[2][1]=2,b.m[2][2]=1;
	matrix ans=mul(a,poww(b,n));
	printf("%lld",(ans.m[1][1]+2*ans.m[1][2])%plane);
	return 0;
}

T3

有点向通往奥格瑞玛的道路,SPFA+二分可做,然而那丑恶的数据范围让我以为爆搜可以过???然后我就很懒的打了个dfs就交了,亲手断送自己的ak道路。今天时间不够,还没来得及写正解,先糊着叭

猜你喜欢

转载自blog.csdn.net/qq_40942982/article/details/82291102
今日推荐