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;
}
View Code

相关文章: