zoukankan      html  css  js  c++  java
  • 四连测Day2

    题目:链接: https://pan.baidu.com/s/1ef_9hGBhczW0B4dz5IUKmw 密码: qgjy

    T1:

    hash后直接二分查询即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    inline long long read()
    {
        long long f=1,ans=0;char c;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return ans*f;
    }
    char str[100001];
    long long sum[100001];
    long long b[100001];
    long long bb=27; 
    long long maxn=0;
    long long l,r,mid;
    long long u,v;
    bool check(long long x)
    {
        long long x1=sum[u+x-1]-sum[u-1]*b[x];
    //    cout<<sum[u+x-1]<<" "<<sum[u-1]<<" "<<b[x]<<" "<<x1<<endl;
        long long x2=sum[v+x-1]-sum[v-1]*b[x];
    //    cout<<sum[v+x-1]<<" "<<sum[v-1]<<" "<<b[x]<<"  "<<x2<<endl;
        return x1==x2;
    }
    int main()
    {
        b[0]=1;
        for(int i=1;i<=100000;i++) b[i]=b[i-1]*bb; 
        scanf("%s",str+1);
        long long len=strlen(str+1);
        for(long long i=1;i<=len;i++) sum[i]=sum[i-1]*bb+(str[i]-'a'+1);
        long long n=read();
        for(long long i=1;i<=n;i++)
        {
            u=read(),v=read();
            l=1,r=len-max(u,v)+1;
            maxn=0;
            while(l<=r)
            {
                mid=(l+r)/2;
                if(check(mid)) 
                {
                    maxn=max(maxn,mid);
                    l=mid+1;
                }else r=mid-1;
            }
            printf("%d
    ",maxn);
        }
    }
    /*
    aabaabab
    1
    2 7
    */
    View Code

    T2:

    因为作者能力有限,数学技巧过于高深,所以先给std,学完以后再重新补写

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    inline int read()
    {
        int x=0,t=1,c;
        while(!isdigit(c=getchar()))if(c=='-')t=-1;
        while(isdigit(c))x=x*10+c-'0',c=getchar();
        return x*t;
    }
    int sig(long long x)
    {
        if(x<0)return -1;
        else if(!x)return 0;
        return 1;
    }
    long long gcd(long long a,long long b){return b?gcd(b,a%b):a;}
    class Vector
    {
    public:
        long long x,y;
        Vector(long long _x=0,long long _y=0)
        {
            x=_x;
            y=_y;
        }
        Vector operator + (const Vector &b) const
        {
            return Vector(x+b.x,y+b.y);
        }
        Vector operator - (const Vector &b) const
        {
            return Vector(x-b.x,y-b.y);
        }
        long long operator * (const Vector &b) const
        {
            return x*b.x+y*b.y;
        }
    };
    class Line
    {
    public:
        long long a,b,c;
        Line(Vector v0,Vector v1)
        {
            a=v0.x-v1.x;
            b=v0.y-v1.y;
            swap(a,b);
            a=-a;
            c=gcd(a,b);
            a/=c;
            b/=c;
            c=a*v0.x+b*v0.y;
        }
        Line(long long _a=0,long long _b=1,long long _c=0)
        {
            a=_a;
            b=_b;
            c=_c;
        }
        int side(Vector v)
        {
            return sig(v*Vector(a,b)-c);
        }
    }l1,l2;
    void Solve()
    {
        int n=read();
        Vector v0,v1,u0,u1;
        v0.x=read();v0.y=read();v1.x=read();v1.y=read();
        l1=Line(v0,v1);
        bool res=0;
        while(n--)
        {
            u0.x=read();u0.y=read();u1.x=read();u1.y=read();
            l2=Line(u0,u1);
            if(l1.a*l2.b==l1.b*l2.a)
            {
                if(l1.c*l2.b==l2.c*l1.b)
                {
                    long long l0=0,r0=(v1-v0)*(v1-v0),l1=(u0-v0)*(v1-v0),r1=(u1-v0)*(v1-v0);
                    if(l0<=r1&&l1<=r0)res=1;
                }
            }
            else
            {
                if(l1.side(u0)!=l1.side(u1)&&l2.side(v0)!=l2.side(v1))res=1;
            }
        }
        if(res)puts("YES");
        else puts("NO");
    }
    int main()
    {
        freopen("intersect.in","r",stdin);
        freopen("intersect.out","w",stdout);
        int T=read();
        while(T--)Solve();
    }
    std

    T3:

    dijkstra倒推,加优先队列优化,设dis[n]=0,dis[i]=min{dis[i],max(最大限制,dis[x(i为起点的终点)]+所对应需要的能量)}

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    using namespace std;
    inline long long read()
    {
        long long f=1,ans=0;char c;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return ans*f;
    }
    priority_queue<pair<long long,long long > >  que;
    long long n,m,cnt=1;
    struct node{
        long long a,b,c,m,nex;
    }x[2000110];
    long long head[1000010];
    long long vis[1000010];
    long long dis[1000010];
    void add(long long u,long long v,long long c,long long m)
    {
        x[cnt].a=u,x[cnt].b=v,x[cnt].c=c,x[cnt].m=m;
        x[cnt].nex=head[u],head[u]=cnt++;
    }
    long long inf;
    int main()
    {
        memset(head,-1,sizeof(head));
        memset(dis,127/3,sizeof(dis));
        inf=dis[1];
        n=read(),m=read();
        for(long long i=1;i<=m;i++)
        {
            long long u=read(),v=read(),c=read(),m=read();
            add(u,v,c,m);
            add(v,u,c,m);
        }
        dis[n]=0;
        que.push(make_pair(0,n));
        while(!que.empty())
        {
            long long xx=que.top().second;que.pop();
            if(vis[xx]==1) continue;
            vis[xx]=1;
            for(long long i=head[xx];i!=-1;i=x[i].nex)
            {
                if(dis[x[i].b]>max(x[i].m,dis[xx]+x[i].c))
                {
                    dis[x[i].b]=max(x[i].m,dis[xx]+x[i].c);
                    que.push(make_pair(-dis[x[i].b],x[i].b));
                }
                
            }
        }
        if(dis[1]!=inf) cout<<dis[1];
        else cout<<-1;
    }
    View Code
  • 相关阅读:
    函数之返回值
    函数之初识函数
    三元运算符
    枚举enumerate
    模块
    迭代器
    斐波那契
    leetcode155 最小栈
    leetcode94 二叉树的中序遍历
    leetcode20 有效的括号
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/9457743.html
Copyright © 2011-2022 走看看