2016.11.15
BZOJ1009:DP+矩阵乘法+KMP
BZOJ1898:矩阵乘法
BZOJ4101:贪心,考虑我们往右边撞的时候,我们会向左边冲
,于是枚举答案点利用一个指针计算即可!
2016.11.14
OI队内测试
2016.11.13
BZOJ4512:乱搞
BZOJ4102:DP+bfs
BZOJ4395:bfs
BZOJ3889:双键值最短路
BZOJ4512 #include <bits/stdc++.h> using namespace std; #define LL long long int N,sx,sy,ans; char s[1020]; bool vis[2020][2020],north[2020][2020],east[2010][2010]; int main(){ // freopen("data.in","r",stdin); // freopen("A.out","w",stdout); scanf("%d%s",&N,s); sx=sy=1010; for (int i=0;i<N;i++){ vis[sx][sy]=1; char ch=s[i]; if (ch=='N'){ sy++; if (!north[sx][sy-1]&&vis[sx][sy])ans++; north[sx][sy-1]=1; } if (ch=='S'){ sy--; if (!north[sx][sy]&&vis[sx][sy])ans++; north[sx][sy]=1; } if (ch=='E'){ sx++; if (!east[sx-1][sy]&&vis[sx][sy])ans++; east[sx-1][sy]=1; } if (ch=='W'){ sx--; if (!east[sx][sy]&&vis[sx][sy])ans++; east[sx][sy]=1; } } printf("%d\n",ans); } BZOJ4102 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long #define ld long double #define N 1005 #define M N*(N+1) using namespace std; int n,p,tot; int pre[M],v[M],now[N],f[N],dis[N][N]; bool vis[N]; queue<int>q; struct data{ int val,pos; }a[N]; int read() { int x=0,f=1; char ch; while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1; while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9'); return x*f; } void ins(int a,int b){++tot; pre[tot]=now[a]; now[a]=tot; v[tot]=b; } bool cmp(data a,data b){return a.val<b.val; } void bfs(int u) { memset(vis,0,sizeof(vis)); q.push(u); dis[u][u]=0; vis[u]=1; while (!q.empty()) { int x=q.front(); q.pop(); for (int p=now[x]; p; p=pre[p]) { int son=v[p]; if (!vis[son]) { dis[u][son]=dis[u][x]+1; q.push(son); vis[son]=1; } } } } int main() { n=read(); p=read(); for (int i=1; i<=n; i++) { int x=read(),d=read(); a[i].val=x; a[i].pos=i; for (int j=1; j<=d; j++) {int y=read(); ins(i,y); ins(y,i);} } for (int i=1; i<=n; i++) bfs(i); sort(a+1,a+n+1,cmp); for (int i=1; i<=n; i++) f[i]=a[i].val; for (int i=1; i<=n; i++) for (int j=1; j<=i-1; j++) { if (a[i].val>a[j].val && dis[a[i].pos][a[j].pos]) { f[i]=max(f[i],f[j]-dis[a[i].pos][a[j].pos]*p+a[i].val); } } int ans=0; for (int i=1; i<=n; i++) ans=max(ans,f[i]); printf("%d\n",ans); return 0; } BZOJ4395 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long #define ld long double #define N 205 #define M 40005 using namespace std; int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; int pre[M],v[M],now[N*N],tot; int n,m,ans; queue<int>q; bool vis[N][N],lig[N][N]; int read() { int x=0,f=1; char ch; while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1; while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9'); return x*f; } int encode(int a,int b){return (a-1)*n+b; } void ins(int a,int b){ ++tot; pre[tot]=now[a]; now[a]=tot; v[tot]=b; } int main() { n=read(); m=read(); for (int i=1; i<=m; i++) { int a=read(),b=read(),c=read(),d=read(); ins(encode(a,b),encode(c,d)); } int last=1; ans=1; for (;;) { q.push(encode(1,1)); memset(vis,0,sizeof(vis)); vis[1][1]=1; lig[1][1]=1; while (!q.empty()) { int pp=q.front(),x,y; q.pop(); //last++; for (int p=now[pp]; p; p=pre[p]) { int son=v[p]; x=(son-1)/n+1,y=(son-1)%n+1; if (!lig[x][y]) lig[x][y]=1,ans++; } x=(pp-1)/n+1,y=(pp-1)%n+1; for (int i=0; i<4; i++) { int xx=x+dx[i],yy=y+dy[i]; if (xx<1 || xx>n || yy<1 || yy>n || !lig[xx][yy] || vis[xx][yy]) continue; vis[xx][yy]=1; q.push(encode(xx,yy)); } } if (last==ans) break; last=ans; } printf("%d\n",ans); return 0; } BZOJ3889 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long #define ld long double #define inf 100000000000000 #define N 1005 using namespace std; int s,t,m,n; ll a[N][N],b[N][N],dis[N],d[N]; int c[N]; bool vis[N]; queue<int>q; int read() { int x=0,f=1; char ch; while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1; while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9'); return x*f; } void spfa() { for (int i=1; i<=m; i++) dis[i]=inf; dis[s]=d[s]=0; vis[s]=1; q.push(s); while (!q.empty()) { int x=q.front(); q.pop(); vis[x]=0; //cout<<" "<<x<<endl; for (int i=1; i<=m; i++) { // cout<<i<<" "<<dis[i]<<" "<<dis[x]<<" "<<a[x][i]<<endl; if (dis[i]>dis[x]+a[x][i] || ((dis[i]==dis[x]+a[x][i]) && d[i]>d[x]+b[x][i])) { // cout<<" "<<x<<" "<<i<<" "<<a[x][i]+dis[x]<<endl; dis[i]=dis[x]+a[x][i]; d[i]=d[x]+b[x][i]; if (!vis[i]) vis[i]=1,q.push(i); } } //|| (dis[i]==dis[x]+a[x][i] && d[i]>d[x]+b[x][i]) } } int main() { s=read(); t=read(); n=read(); for (int i=1; i<=1000; i++) for (int j=1; j<=1000; j++) a[i][j]=inf; for (int i=1; i<=n; i++) { int len=read(),cnt=read(); for (int j=1; j<=cnt; j++) c[j]=read(),m=max(m,c[j]); for (int j=1; j<=cnt; j++) for (int k=j+1; k<=cnt; k++) if (a[c[j]][c[k]]>len || ((a[c[j]][c[k]]==len) && (b[c[j]][c[k]]>(k-j)))) a[c[j]][c[k]]=len,b[c[j]][c[k]]=k-j; } spfa(); if (dis[t]==inf) dis[t]=-1,d[t]=-1; cout<<dis[t]<<" "<<d[t]<<endl; return 0; }