今天我居然A了一道题???怕不是把明年的运气都用光了
T1 题意简述:给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和。
n<=2000,m<=50000
解题思路:这道题其实最主要的是这个...每个测试点时限6秒
这告诉我们...暴力就能过...
当然也不能随便暴力。二维前缀和即可。复杂度O(nm)。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<ctime> #define ll long long using namespace std; ll n,m; ll ans,suma[2010][2010],sumb[2010][2010]; ll read() { ll f=1;ll x=0;char s=getchar(); while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();} while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} x*=f;return x; } int main() { // system("CreatRand.exe"); freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); // ll st=clock(); n=read(),m=read(); for(ll i=1;i<=n;i++) for(ll j=1;j<=n;j++) suma[i][j]=read(),suma[i][j]+=suma[i-1][j]; for(ll i=1;i<=n;i++) for(ll j=1;j<=n;j++) sumb[i][j]=read(),sumb[i][j]+=sumb[i][j-1]; for(ll i=1;i<=m;i++) { ans=0; ll xa=read(),ya=read(),xb=read(),yb=read(); if(xa>xb) swap(xa,xb); if(ya>yb) swap(ya,yb); for(ll i=1;i<=n;i++) ans+=(suma[xb][i]-suma[xa-1][i])*(sumb[i][yb]-sumb[i][ya-1]); printf("%lld\n",ans); } // ll ed=clock(); // printf("%lld\n",ed-st); return 0; }
T2 题意简述:平面上有N个整数坐标点。如果将点(x0,y0)移动到(x1,y1)。则代价为它们之间的切比雪夫距离。求使得K个点在同一位置上最少需要的代价。
原文地址:https://www.cnblogs.com/water-radish/p/9354902.html
时间: 2024-10-02 00:27:37