Nov.2nd总结

Posted on 2017-11-02 16:01  Murs  阅读(476)  评论(0)    收藏  举报

要稳啊,t1,t3贼水

一个模拟,一个两次最短路(反着各点到1,正着1到各点),SPFA跑一遍就完事

//XD Murs XD//
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define oo 0x3f3f3f3f
#define F(i,s,e) for(int i=s;i<=e;i++)
#define D(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
const int maxn=110000;
int n,m,q,head[maxn],rest[maxn],to[maxn],END[maxn],x[maxn],y[maxn],z[maxn],len;
int first[maxn],second[maxn];
bool vis[maxn];

struct queue//手工stl_XD
{
    int head,tail;
    int num[100100];
    queue() {head=0;    tail=0;}
    inline void push(int o) {num[tail++]=o;}
    inline int pop()    {return num[head++];}
    inline bool empty() {return head>=tail;}
    inline int top() {return num[head];}
}kept;

void push(int u,int v,int w)
{
    len++;
    to[len]=v;
    END[len]=w;
    rest[len]=head[u];
    head[u]=len;
}

void resetf()
{
    len=0;
    memset(head,0,sizeof(head));
    memset(first,oo,sizeof(first));
    memset(vis,0,sizeof(vis));
}

int quest(int a,int b)
{
    //printf("f %d s %d\n",first[a],second[b]); 
    if(first[a]==oo||second[b]==oo)
        return -1;
    return first[a]+second[b];
}

void SPFA()
{
    vis[1]=1;
    kept.push(vis[1]);
    first[1]=0;
    while(!kept.empty())
    {
        int u=kept.top();
        kept.pop();
        vis[u]=0;
        for(int i=head[u];i;i = rest[i])
        {
            int v=to[i];
            if(first[v]>first[u]+END[i])
            {
                first[v]=first[u]+END[i];
                if(!vis[v])
                {
                    vis[v]=1;
                    kept.push(v);
                }
            }
        }
    }
}

void slove()
{
    resetf();
    F(i,1,m)
        push(x[i],y[i],z[i]);
    SPFA();
    F(i,1,n)
        second[i]=first[i];
    resetf();
    F(i,1,m)
        push(y[i],x[i],z[i]);
    SPFA();
}

int main()
{
    freopen("production.in","r",stdin);
    freopen("production.out","w",stdout);
    scanf("%d%d",&n,&m);
    F(i,1,m)
        scanf("%d%d%d",&x[i],&y[i],&z[i]);
    slove();
    scanf("%d",&q);
    F(i,1,q)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",quest(a,b));
    }
    return 0;
}

T1 RE了,原因是我开的整数组,分为两半分别处理,只有指向2*n大小的空间,但是在运行时会算到最大4*n的地址,然后指针指向就错误了,最后re.XD

#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,s,e) for(int i=s;i<=e;i++)
#define D(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
const int maxn=100100;
int n,l1[maxn],l2[maxn];
int main()
{
    freopen("expedition.in","r",stdin);
    freopen("expedition.out","w",stdout);
    scanf("%d",&n);
    int *l1=new int[2*n+1];
    int *l2=new int[n+1];
    int ans=0;
    F(i,1,2*n)
        scanf("%d",&l1[i]);
    F(i,1,n)
        l2[i]=0;
    F(i,1,n)   
        l2[l1[2*i]]+=l1[2*i-1];
    F(i,1,n)
        ans+=l2[i]*l2[i];
    printf("%d\n",ans);
    return 0;
}

 

T2 高精度乘法,比较麻烦,而且一般只用到"+","-",就没有敲。但是暴力也是有10分的。