2017 Multi-University Training Contest - Team 2 To My Boyfriend

我是参考了这篇文章点击打开链接

接下来我讲几个比较关键的点。

1.n*m的大矩阵总的有(n+1)*n*(m+1)*m/4;

2.颜色是从0开始依次累加的。

3.这个符合要求的子矩阵存储用int 会爆掉,(这个我估算错了一次。。。)

进过这两次比赛(我是小白),感觉杭电喜欢考容斥还有贡献和问题(我认为是一类 A占有B 但是却反过来计算从B被多少A占有,就像这道题)。

这样的题目其实不是很难,起码比起那些考数学的好多了(数学渣)。

继续加油。

代码:

#include<iostream>
        #include<cstdio>
        #include<vector>
        #include<algorithm>
        using namespace std;
        
        int mp[105][105];
        vector<int> qur[105][105*105];
        
        int main()
{
	    freopen("fuck.txt","r",stdin);
	    int T;
		scanf("%d",&T);
		for(int Case=1;Case<=T;Case++)
		{
			int n,m;
			scanf("%d%d",&n,&m);
			
			for(int i=1;i<=n;i++)
			    for(int j=0;j<n*m;j++)
			        if(!qur[i][j].empty())
			            qur[i][j].clear();
			
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=m;j++)
				{
					scanf("%d",&mp[i][j]);
					qur[i][mp[i][j]].push_back(j);
				}
			}
			
			double ans1=0;
			double ans2=(n+1)*n*(m+1)*m/4; 
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=m;j++)
				{
					int z=0,y=m+1,x=n-i+1;
					for(int k=i;k>=1;k--)
					{
						if(k!=i&&mp[k][j]==mp[i][j]) break;
						
						if(qur[k][mp[i][j]].size()>0)
						{
						    int z1;
							for(int l=0;l<qur[k][mp[i][j]].size()&&qur[k][mp[i][j]][l]<j;l++)
						    {
							    z1=qur[k][mp[i][j]][l];
							    z=max(z1,z);
						    }
						}
						
						if(k!=i)
						{
							int y1;
							for(int r=qur[k][mp[i][j]].size()-1;r>=0&&qur[k][mp[i][j]][r]>j;r--)
							{
								y1=qur[k][mp[i][j]][r];
								y=min(y1,y);
							}
						}
						//printf("%d %d %d %d %d\n",i,j,x,j-z,y-j);
						//printf("%d %d %d\n",i,j,(j-z)*(y-j)*x);
						
						ans1+=(j-z)*(y-j)*x;
					}
				}
		    }
			printf("%.9llf\n",ans1/ans2);
		}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值