zoukankan      html  css  js  c++  java
  • 2020ICPC 小米 网络选拔赛第一场

    A

    牛逼队友写的,貌似卡常?

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    int dp[N],num[N],dis[N],con=1;
    map<int,int>mp;
    int pos[10000010];
    inline int read()
    {
         int sum=0;
         char c;
         c=getchar();
         while(c<'0'||c>'9')
         c=getchar();
         while(c>='0'&&c<='9')
         {
         sum=sum*10+c-'0';
         c=getchar();
         }
     return sum;
    }
    int main()
    {
        // freopen("1.txt","r",stdin);
         int n;n=read();
         int mx=0;
         int ans=0;
         for(int i=0;i<n;++i)
         {
              num[i]=read();
              mx=max(mx,num[i]);
              if(num[i]==1)
                   ans++;
              else
              {
              if(mp[num[i]]==0)
                   dis[con++]=num[i];
              mp[num[i]]++;
              }
         }
        // cout<<'a'<<endl;
         sort(dis+1,dis+con);
         for(int i=1;i<con;++i)
              pos[dis[i]]=i;
         int tmp=0;
         for(int i=1;i<con;++i)
         {
         //     cout<<dis[i]<<' '<<mp[dis[i]]<<endl;
           //   pos[dis[i]]=i;
              //int mid=sqrt(dis[i]);
              dp[i]+=mp[dis[i]];
              for(int j=dis[i]*2;j<=mx;j+=dis[i])
              {
                   int q=pos[j];
                   if(pos[j])
                   {
                        dp[q]=max(dp[q],dp[i]);
                   }
              }
         //    cout<<i<<' '<<dp[i]<<endl;
              tmp=max(tmp,dp[i]);
         }
         cout<<tmp+ans<<endl;
         return 0;
    }
    View Code

    B

    真正有用的各线段的端点,对各点预处理是否连边(是否与已有线段相交).

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010,M=4*N,M1=N*N;
    double dist[M];
    int n,m,k;
    int S,T;
    int h[N],e[M1],ne[M1]; double w[M1];int idx;
    struct Point
    {
        int x,y;
    }a[M];
    struct line
    {
        Point x,y;
    }b[N];
    void add(int a,int b,double c)
    {
        ne[idx]=h[a];
        e[idx]=b;
        w[idx]=c;
        h[a]=idx++;
    }
    bool seg(Point a,Point b,Point c,Point d){
           if(!(min(a.x,b.x)<=max(c.x,d.x) && min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x) && min(a.y,b.y)<=max(c.y,d.y)))return false;
           double u,v,w,z;
           u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
           v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
           w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
           z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);
           return (u*v<0 && w*z<0);
    }
    bool check(int x,int y)
    {
        for(int i=0;i<k;i++)
         if(seg(a[x],a[y],b[i].x,b[i].y))
         return false;
        return true;
    }
    double dis(Point a,Point b)
    {
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    struct node
    {
        double x;
        int y;
        bool operator <(const node &c)const
        {
            return x>c.x;
        }
    };
    int vis[M];
    void dijkstra()
    {
        for(int i=0;i<=2*k+2;i++)
            dist[i]=8e18;
        dist[S]=0;
        priority_queue<node>q;
        q.push({0,S});
        while(q.size())
        {
            auto t=q.top();
            q.pop();
            double d=t.x;
            int u=t.y;
            if(vis[u])continue;
            vis[u]=1;
            for(int i=h[u];i!=-1;i=ne[i])
            {
                int j=e[i];
                if(dist[j]>dist[u]+w[i])
                {
                    dist[j]=dist[u]+w[i];
                    q.push(node{dist[j],j});
                }
            }
        }
        return;
    }
    int main()
    {
        //freopen("1.txt","r",stdin);
        memset(h,-1,sizeof h);
        cin>>n>>m>>k;
        for(int i=0;i<=k;i++)
        {
           scanf("%d%d%d%d",&a[i*2].x,&a[i*2].y,&a[i*2+1].x,&a[i*2+1].y);
           b[i]={a[i*2],a[i*2+1]};
           //cout<<dis(b[i].x,b[i].y)<<endl;
        }
        for(int i=0;i<=2*k+1;i++)
        for(int j=0;j<=2*k+1;j++)
          if(check(i,j))
        {
            add(i,j,dis(a[i],a[j]));
        }
        S=2*k,T=2*k+1;
        dijkstra();
        printf("%.4lf",dist[2*k+1]);
        return 0;
    }
    View Code

    C

    签到

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
        string s;cin>>s;
        int x=0;
        long long ans=0;
        for(int i=0;i<s.length();++i)
        {
           if(s[i]=='w')
               x++;
            else
            {
                ans+=max(0,x*2-1);
                x=0;
            }
        }
        ans+=max(0,x*2-1);
        cout<<ans<<endl;
            return 0;
    }
    View Code

    F.

    #include<bits/stdc++.h>
    #define ll long long
    #define Int __int128
    using namespace std;
    const int N=1e5+100;
    ll a[N];
    ll ql[N],qr[N];
    int n,L,R;
    ll res,resl,resr;
    void write(Int x) {
        if (x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }
    bool check(Int mid)
    {
        Int ans=0,ans1=0;
        ans=mid*(res-resl);
        for(int i=1;i<=n;i++)
          if(a[i]<mid*ql[i])
          return false;   
        for(int i=1;i<=n;i++)
        {
            ans1+=min(a[i]-mid*ql[i],mid*(qr[i]-ql[i]));
        }
        return ans1>=ans;
    }
    int main()
    {
        cin>>n>>L>>R;
        for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld%lld",&ql[i],&qr[i]);
            resl+=ql[i];
            resr+=qr[i];
        }
        if(resr<L||resl>R)
        {
            puts("0");
            return 0;
        }
        res=max(resl,(ll)L);
        Int l=0,r=1e18,mid;
        while(l<r)
        {
            mid=(l+r+1)>>1;
            if(check(mid))l=mid;
            else r=mid-1;
        }
        write(l);
        return 0;
    }
    View Code

    G

    题解构造很巧妙.要多练(

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+100;
    int a[N],b[N],pos[N];
    int main()
    {
        //freopen("1.txt","r",stdin);
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            pos[a[i]]=i;
        }
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        puts("YES");
        for(int i=2,cur=b[1];i<=n;i++)
        {
            printf("%d %d
    ",cur,b[i]);
            if(pos[cur]>pos[b[i]])
                cur=b[i];
        }
        return 0;
    }
    View Code

    I

    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<int,int> pii; 
    const int N=1100;
    int dp[N][N];
    char g[N][N];
    //bool st[N][N];
    int n,m;
    map<pii,bool>mp;
    //int cnt=0;
    bool dfs(int x,int y){
        //cnt++;
        if(x<1||x>n||y<1||y>m) return true;
        if(mp[{x,y}]) return false;
        mp[{x,y}]=true;
        if(dp[x][y]!=-1){
            if(dp[x][y]==0) return false;
            else return true; 
        }
        if(g[x][y]=='W'){
            if(dfs(x-1,y)) return dp[x][y]=1;
            else return dp[x][y]=0;
        }
        if(g[x][y]=='A'){
            if(dfs(x,y-1)) return dp[x][y]=1;
            else return dp[x][y]=0;
        }
        if(g[x][y]=='S'){
            if(dfs(x+1,y)) return dp[x][y]=1;
            else return dp[x][y]=0;
        }
        if(g[x][y]=='D'){
            if(dfs(x,y+1)) return dp[x][y]=1;
            else return dp[x][y]=0;
        }
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%s",g[i]+1); 
        }
        int ans=0;
        memset(dp,-1,sizeof dp);
        //cout<<dp[1][1]<<endl;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                mp.clear();    
                if(dfs(i,j)) ans++;
            }
        }
        //cout<<cnt<<endl;
        printf("%d
    ",ans);
        return 0;
    }
    View Code

    J.

    二维差分签到题

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010;
    int g[N][N];
    int res[N][N];
    void insert(int x1,int y1,int x2,int y2,int c)
    {
        g[x1][y1]+=c;
        g[x1][y2+1]-=c;
        g[x2+1][y1]-=c;
        g[x2+1][y2+1]+=c;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
         memset(g,0,sizeof g);
        int n,m,a,b;
        cin>>n>>m>>a>>b;
        int f=1;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
             scanf("%d",&res[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                g[i][j]=g[i][j]+g[i-1][j]+g[i][j-1]-g[i-1][j-1];
                int t=g[i][j]+res[i][j];
                if(t<0)
                {
                    f=0;
                    break;
                }
                else if(t>0)
                {
                    if(i+a-1>n||j+b-1>m)
                    {
                        f=0;
                        break;
                    }
                    insert(i,j,min(n,i+a-1),min(m,j+b-1),-t);
                }
            }
            if(f)
            {
                puts("^_^");
            }
            else puts("QAQ");
        }
    }
    View Code
  • 相关阅读:
    Codeforces 1045C Hyperspace Highways (看题解) 圆方树
    Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
    Codeforces 803G Periodic RMQ Problem 线段树
    Codeforces 420D Cup Trick 平衡树
    Codeforces 295E Yaroslav and Points 线段树
    Codeforces 196E Opening Portals MST (看题解)
    Codeforces 653F Paper task SA
    Codeforces 542A Place Your Ad Here
    python基础 异常与返回
    mongodb 删除
  • 原文地址:https://www.cnblogs.com/flyljz/p/13880893.html
Copyright © 2011-2022 走看看