zoukankan      html  css  js  c++  java
  • cogs 2507 零食店

    /*
    cogs 2507 零食店
    跪了这题的数据了....
    第一遍Q*m 暴力询问 嗯 以为能的70 但只有40
    Q已经到了1e6了
    考试的时候 放弃了第三题又打了一遍
    这次是Q*(n+logn) 最后发现和暴力分一样....
    好吧数据很厉害 吓得我在地上爬23333
    好吧 考完了之后 看了正解
    我靠这不和我的一个样吗
    哎 啊啊啊 二分....
    傻傻的我笑了 都想出了方程 没打二分
    .....
    迅速的改成二分 由迅速的wa了 23333
    其实这样过不了了 Dij预处理会超时.
    看了正解 直接Floyed 巧妙利用了floyed k层循环的含义
    状态差不多 最后终于70了 然后优化常树 然后抄了个inf 1e9
    这个inf大一点小一点都不对....
    知道最后也是卡过去的 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 110
    #define inf 1e9+1
    using namespace std;
    int n,m,Q,r[maxn],f[maxn][maxn][maxn];
    int init(){
        int x=0,f=1;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();}
        return x*f;
    }
    struct node{
        int c,o;
    }p[maxn];
    int cmp(const node &x,const node &y){
        return x.c<y.c;
    }
    void Floyed(){
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    f[k][i][j]=min(f[k-1][i][j],f[k-1][i][p[k].o]+f[k-1][p[k].o][j]);
        for(int i=0;i<=n;i++)
            for(int j=1;j<=n;j++)
                sort(f[i][j]+1,f[i][j]+1+n);
    }
    int main()
    {
        freopen("snackstore.in","r",stdin);
        freopen("snackstore.out","w",stdout);
        scanf("%d%d%d",&n,&m,&Q);
        int u,v,pos,t;
        for(int i=1;i<=n;i++){
            p[i].c=init();p[i].o=i;
            r[i]=p[i].c;
        }
        sort(p+1,p+1+n,cmp);sort(r+1,r+1+n);
        for(int k=0;k<=n+1;k++)
            for(int i=0;i<=n+1;i++)
                for(int j=0;j<=n+1;j++)
                    f[k][i][j]=inf;
        for(int i=1;i<=m;i++){
            u=init();v=init();t=init();
            if(t<f[0][u][v])
                f[0][u][v]=f[0][v][u]=t;
        }
        for(int i=1;i<=n;i++)f[0][i][i]=0;
        Floyed();
        while(Q--){
            u=init();v=init();t=init();
            v=upper_bound(r+1,r+1+n,v)-r-1;
            pos=upper_bound(f[v][u]+1,f[v][u]+1+n,t)-f[v][u]-1;
            printf("%d
    ",pos-1);
        }
        return 0;
    }
    /*Dij预处理+二分找*/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #define pa pair<int,int>
    #define mk make_pair
    #define maxn 110
    #define maxm 10010
    #define inf 1e9+1
    using namespace std;
    int n,m,Q,num,head[maxn],c[maxn],r[maxn],sum;
    int dis[maxn],f[maxn][maxn][maxn];
    bool vis[maxn];
    struct node{
        int v,t,pre;
    }e[maxm*2];
    priority_queue<pa,vector<pa>,greater<pa> >q;
    int init(){
        int x=0;char s=getchar();
        while(s<'0'||s>'9')s=getchar();
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x;
    }
    void Add(int from,int to,int dis){
        num++;e[num].v=to;
        e[num].t=dis;
        e[num].pre=head[from];
        head[from]=num;
    }
    void Dij(int s,int mx){
        while(!q.empty())q.pop();
        for(int i=0;i<=n;i++)dis[i]=inf;
        memset(vis,0,sizeof(vis));
        q.push(mk(0,s));dis[s]=0;
        while(!q.empty()){
            int k=q.top().second;q.pop();
            if(vis[k]||(c[k]>mx&&k!=s))continue;vis[k]=1;
            for(int i=head[k];i;i=e[i].pre){
                int v=e[i].v;
                if(dis[v]>dis[k]+e[i].t){
                    dis[v]=dis[k]+e[i].t;
                    q.push(mk(dis[v],v));
                }
            }
        }
        for(int i=1;i<=n;i++)
            f[s][mx][i]=dis[i];
        sort(f[s][mx]+1,f[s][mx]+1+n);
    }
    void Solve(){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=sum;j++)
                Dij(i,j);
    }
    int main()
    {
        freopen("snackstore.in","r",stdin);
        freopen("snackstore.out","w",stdout);
        n=init();m=init();Q=init();
        int u,v,t;
        for(int i=1;i<=n;i++){
            c[i]=init();r[++sum]=c[i];
        }
        sort(r+1,r+1+sum);
        sum=unique(r+1,r+1+sum)-r-1;
        for(int i=1;i<=n;i++){
            int pos=lower_bound(r+1,r+1+sum,c[i])-r;
            c[i]=pos;
        }
        for(int i=1;i<=m;i++){
            u=init();v=init();t=init();
            Add(u,v,t);Add(v,u,t);
        }
        for(int k=0;k<=n+1;k++)
            for(int i=0;i<=n+1;i++)
                for(int j=0;j<=n+1;j++)
                    f[k][i][j]=inf;
        Solve();
        while(Q--){
            int pos=0;
            u=init();v=init();t=init();
            v=upper_bound(r+1,r+1+sum,v)-r-1;
            pos=upper_bound(f[u][v]+1,f[u][v]+1+n,t)-f[u][v]-1;
            printf("%d
    ",pos);
        }
        return 0;
    }
    /*SPFA暴力找*/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 110
    #define maxm 10010
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    ll n,m,Q,num,hea[maxn],dis[maxn],q[maxm*5],head,tail,c[maxn];
    bool f[maxn];
    struct node{
        ll v,t,pre;
    }e[maxm*2];
    ll init(){
        ll x=0,f=1;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();}
        return x*f;
    }
    void Add(ll from,ll to,ll dis){
        num++;e[num].v=to;
        e[num].t=dis;
        e[num].pre=hea[from];
        hea[from]=num;
    }
    void SPFA(ll s,ll mx,ll mxx){
        for(int i=1;i<=n;i++)dis[i]=inf;
        for(int i=1;i<=n;i++)f[i]=0;
        head=1;tail=0;dis[s]=0;
        q[++tail]=s;f[s]=1;
        while(head<=tail){
            ll k=q[head++];f[k]=0;
            if(c[k]>mx&&k!=s)continue;
            for(int i=hea[k];i;i=e[i].pre){
                ll v=e[i].v;
                if(dis[v]>dis[k]+e[i].t){
                    dis[v]=dis[k]+e[i].t;
                    if(f[v]==0&&dis[v]<=mxx){
                        f[v]=1;q[++tail]=v;
                    }
                }
            }
        }
    }
    int main()
    {
        freopen("snackstore.in","r",stdin);
        //freopen("snackstore.out","w",stdout);
        n=init();m=init();Q=init();
        ll u,v,t;
        for(int i=1;i<=n;i++)
            c[i]=init();
        for(int i=1;i<=m;i++){
            u=init();v=init();t=init();
            Add(u,v,t);Add(v,u,t);
        }
        while(Q--){
            int cnt=0;
            u=init();v=init();
            t=init();SPFA(u,v,t);
            for(int i=1;i<=n;i++)
                if(dis[i]<=t&&i!=u)cnt++;
            cout<<Q<<" "<<cnt<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C语言预处理
    C语言结构体对齐
    C语言共用体、大小端、枚举
    C语言内存分配方法。
    C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
    C语言中函数的传入值与传出值
    #define与typedef在重定义类型中的区别
    宏定义在位运算中的运用
    wait函数
    exit()与_exit()区别
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5984455.html
Copyright © 2011-2022 走看看