ACM-9月14日周四周中训练心得

来源:互联网 发布:一维数组杨辉三角java 编辑:程序博客网 时间:2024/05/16 15:24

    这周开始的时候,我们队的队长给我们发了上周末的乌鲁木齐网络赛的题解,终于能看到题解了,那个变态的网站一开始居然连题目都看不了,不过后来可以看了,仔细看了看上周末没做出来的skiing,题目大概的意思是给出好几个点之间的距离,然后找到其中最长的一条连通路,并输出其长度。看到网上的一些题解用的是邻接表,这个知识我还不会,问了一下其他组是怎么做的,发现用了弗洛伊德算法居然没有超时。

#include<iostream>#include<cstring>#include<iomanip>#include<algorithm>#include<stdio.h>using namespace std;long long T,m,n;long long look[10005],f[10005],aa[100005];struct mou{    int x,y,l;}c[100005];bool cmp(mou cc,mou v){    //if(cc.x==v.x) return cc.y<v.y;    return cc.x<v.x;}int main(){int i,x,y,l;        long long S;    scanf("%lld",&T);    for(long long zz=1;zz<=T;zz++)    {        memset(f,0,sizeof(f));        memset(look,0,sizeof(look));        S=0;        scanf("%lld%lld",&m,&n);        for(i=0;i<n;i++)        {            scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].l);            look[c[i].y]++;        }        sort(c,c+n,cmp);        while(1)        {            int z=-1,vv=0;            for(i=0;i<n;i++)            {                //cout<<c[i].x<<" "<<look[c[i].x]<<endl;            if(look[c[i].x]==0)                {                    if(f[c[i].y]<f[c[i].x]+c[i].l)                    f[c[i].y]=f[c[i].x]+c[i].l;                    look[c[i].y]--;                    aa[vv++]=c[i].x;                    if(S<f[c[i].y]) S=f[c[i].y];                    z=1;                }            }            if(z==-1) break;            for(int mm=0;mm<vv;mm++)                    {look[aa[mm]]--;                    }        }        cout<<S<<endl;    }}
    还看了一下线段树里的离散化,就是先读入所有区间,然后把区间端点离散化到map中,然后求出所有新的区间(范围变小了),然后再一次set线段树操作,最后求出线段树中一共有多少种不同的值即可。


原创粉丝点击