T1
以为计算几何不会,
据说正解做法很玄学每条线段拆成若干点跑SPFA,取两个最小距离的点构成的线段继续做.
爆0
T2
据说是去年二试加强版
我写了dfs
最后10分
T3
先吐槽一下附中的老爷机,写了40的矩乘被卡成10分,搞得和暴力分一样
其次T3居然是BZOJ原题
最后10分
BZOJ3583
http://www.lydsy.com/JudgeOnline/problem.php?id=3583

#include<cstdio>
#include<cstdlib>
using namespace std;
const int mod=1e9+7;
int O[1001][21],I[1001][21];
int n,m,q,x,y,z,ans;
int f[1001];
struct matrix{
int a[21][21];
matrix(){
for(register int i=0;i<m;++i)
for(register int j=0;j<m;++j)
a[i][j]=0;
}
inline matrix operator*(matrix A)const{
matrix ret;
for(register int i=0;i<m;++i)
for(register int j=0;j<m;++j)
for(register int k=0;k<m;++k)
ret.a[i][j]=(ret.a[i][j]+1ll*a[i][k]*A.a[k][j]%mod)%mod;
return ret;
}
inline matrix operator+(matrix A)const{
matrix ret;
for(register int i=0;i<m;++i)
for(register int j=0;j<m;++j){
ret.a[i][j]=a[i][j]+A.a[i][j];
if(ret.a[i][j]>=mod)
ret.a[i][j]-=mod;
}
return ret;
}
}A[51],B[51],G,S;
inline void calc(int n){
for(register int i=0;i<m;++i)
for(register int j=0;j<m;++j)
G.a[i][j]=S.a[i][j]=0;
for(register int i=0;i<m;++i)
G.a[i][i]=S.a[i][i]=1;
for(register int i=0;i<=31;++i)
if((n>>i)&1){
S=S+(B[i]*G);
G=G*A[i];
}
}
int main(){
scanf("%d%d",&n,&m);
for(register int i=0;i<n;++i){
for(register int j=0;j<m;++j)scanf("%d",O[i]+j),O[i][j]%=mod;
for(register int j=0;j<m;++j)scanf("%d",I[i]+j),I[i][j]%=mod;
}
for(register int k=0;k<n;++k)
for(register int i=0;i<m;++i)
for(register int j=0;j<m;++j)
A[0].a[i][j]=(A[0].a[i][j]+1ll*I[k][i]*O[k][j]%mod)%mod;
B[0]=A[0];
for(register int i=0;i<=31;++i){
A[i+1]=A[i]*A[i];
for(register int j=0;j<m;++j)
++A[i].a[j][j];
B[i+1]=B[i]*A[i];
for(register int j=0;j<m;++j)
--A[i].a[j][j];
}
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&x,&y,&z);--x;--y;
if(!z){
printf("%d\n",(x==y));
continue;
}
calc(z-1);
for(register int i=0;i<m;++i)f[i]=0;
ans=0;
for(register int i=0;i<m;++i)
for(register int j=0;j<m;++j)
f[i]=(f[i]+1ll*O[x][j]*S.a[j][i]%mod)%mod;
for(register int i=0;i<m;++i)
ans=(ans+1ll*I[y][i]*f[i]%mod)%mod;
printf("%d\n",(ans+(x==y))%mod);
}
return 0;
}