多校第五场
1001 Inversion
刚看到这道题的时候就知道是归并排序了,可是当时没有掌握清楚,在网上找了些例题,感觉跟题意差太远用不
上,结果刚才仔细看了下,其实就是归并排序的模板题,哎。。悲剧呀!!!
#include<cstdio>
#include<iostream>
#define maxn 100010
using namespace std;
int a[maxn],tmp[maxn];
__int64 sum;
void merge(int left,int mid,int right)
{
int i,j,k;
i=left,j=mid+1,k=1;
while(i<=mid&&j<=right)
{
if(a[i]>a[j])
{
tmp[k++]=a[j++];
sum+=mid+1-i;
}
else tmp[k++]=a[i++];
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=right) tmp[k++]=a[j++];
for(i=left,k=1;i<=right;i++,k++)
a[i]=tmp[k];
}
void mergesort(int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergesort(left,mid);
mergesort(mid+1,right);
merge(left,mid,right);
}
}
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
sum=0;
for(int i=0;i<m;i++) scanf("%d",&a[i]);
mergesort(0,m-1);
if(sum>=n) printf("%I64d\n",sum-n);
else printf("0\n");
// printf("%I64d\n",sum);
}
return 0;
}
1010 Matrix multiplication
比赛的时候看到这道题是n*n矩阵的运算,自己没有模板,感觉很难的样子,然后也就没作,然后队友也交了
几发结果TLE了。赛后看别人的解题报告才发现,原来暴高就可以过,前提是去掉数组a中为0的元素,要不然就
会TLE,哎,水。
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000
using namespace std;
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
a[i][j]%=3;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&b[i][j]);
b[i][j]%=3;
}
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(a[i][j]==0) continue;
for(int k=1;k<=n;k++)
c[i][k]=(c[i][k]+a[i][j]*b[j][k])%3;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(j!=n) printf("%d ",c[i][j]%3);
else printf("%d\n",c[i][j]%3);
}
}
return 0;
}