标签:ima algorithm memset set name ems cpp const oid
列完式子后发现可以用前缀和进行优化为O(nm)
矩阵题看见矩乘超时就列式子尝试简化
//By Menteur_Hxy
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
typedef long long LL;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=2010;
int n,m;
LL ans;
LL A[N][N],B[N][N],t1[N][N],t2[N][N];
int main() {
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
n=read();m=read();
F(i,1,n) F(j,1,n) A[i][j]=read();
F(i,1,n) F(j,1,n) B[i][j]=read();
F(i,1,n) F(j,1,n) t1[i][j]=t1[i-1][j]+A[i][j];
F(i,1,n) F(j,1,n) t2[i][j]=t2[i][j-1]+B[i][j];
while(m--) {
int a=read(),b=read(),c=read(),d=read();
if(a>c) swap(a,c); if(b>d) swap(b,d);
ans=0;
F(i,1,n) ans+=(t1[c][i]-t1[a-1][i])*(t2[i][d]-t2[i][b-1]);
printf("%lld\n",ans);
}
return 0;
}
反(hen)证(xian)法(ran)可知距离最小的点的x坐标与y坐标一定是给出点坐标中\(n^2\)枚举x和y即可
//By Menteur_Hxy
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
typedef long long LL;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=60;
int n;
LL xi[N],yi[N],mi[N],dis[N];
int main() {
freopen("tower.in","r",stdin);
freopen("tower.out","w",stdout);
n=read();
F(i,1,n) xi[i]=read(),yi[i]=read();
M(mi,0x3f);
F(i,1,n) F(j,1,n) {
int x=xi[i],y=yi[j];
F(k,1,n) dis[k]=abs(x-xi[k])+abs(y-yi[k]);
sort(dis+1,dis+1+n);
LL sum=0;
F(k,1,n) sum+=dis[k],mi[k]=min(mi[k],sum);
}
F(i,1,n) printf("%lld\n",mi[i]);
return 0;
}
很简单的树形dp就能做出来。。
无高精版:
//By Menteur_Hxy
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef long long LL;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=1010;
int n,cnt,rt;
int nxt[N],to[N],head[N],deg[N],du[N];
LL dp[N][2],g[N][2];
void dfs(int u) {
LL sum=0,mul=1;
E(i,u) { int v=to[i];
dfs(v);
sum+=max(dp[v][0],dp[v][1]);
if(dp[v][0]>dp[v][1]) mul*=g[v][0];
else if(dp[v][0]<dp[v][1]) mul*=g[v][1];
else mul*=(g[v][0]+g[v][1]);
}
dp[u][0]=sum,g[u][0]=mul;
E(i,u) { int v=to[i];
LL now=sum-max(dp[v][0],dp[v][1])+dp[v][0]+1;
if(now>dp[u][1]) {
dp[u][1]=now;
if(dp[v][0]>dp[v][1]) g[u][1]=mul;
else if(dp[v][0]<dp[v][1]) g[u][1]=mul/g[v][1]*g[v][0];
else g[u][1]=mul/(g[v][0]+g[v][1])*g[v][0];
} else if(now==dp[u][1]) {
if(dp[v][0]>dp[v][1]) g[u][1]+=mul;
else if(dp[v][0]<dp[v][1]) g[u][1]+=mul/g[v][1]*g[v][0];
else g[u][1]+=mul/(g[v][0]+g[v][1])*g[v][0];
}
}
}
#define add(a,b) nxt[++cnt]=head[a],to[cnt]=b,head[a]=cnt
int main() {
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
n=read();
F(i,1,n) {
int u=read(); deg[u]=read();
F(j,1,deg[u]) {
int v=read();
add(u,v);du[v]++;
}
}
F(i,1,n) if(!du[i]) {rt=i;break;}
dfs(rt);
// E(i,rt) cout<<to[i]<<" "<<endl;
// F(i,1,n) cout<<i<<" "<<dp[i][0]<<" "<<dp[i][1]<<endl;cout<<endl;
// F(i,1,n) cout<<i<<" "<<g[i][0]<<" "<<g[i][1]<<endl;cout<<endl;
printf("%lld\n",max(dp[rt][0],dp[rt][1]));
if(dp[rt][0]>dp[rt][1]) cout<<g[rt][0];
else if(dp[rt][0]<dp[rt][1]) cout<<g[rt][1];
else cout<<g[rt][0]+g[rt][1];
return 0;
}
高精版:坑
标签:ima algorithm memset set name ems cpp const oid
原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9355488.html