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
  • 相关阅读:
    北京各银行收取的帐户管理费
    Windows Beta2 不能识别VMWare的声卡
    Windows Vista 不再支持.hlp文件了
    不是所有的x64下的VMWare都可以安装Windows Vista x64
    Delphi下操作PDF文件的控件
    DriverWorks的KPciConfiguration不支持x64平台的解决方法
    查找Windows文件来历的好方法
    在iSEDQuickPDF中如何输出带中文的PDF文件
    英语听力简单研究
    How To Use A Launchpad PPA (Add, Remove, Purge, Disable) In Ubuntu
  • 原文地址:https://www.cnblogs.com/flyljz/p/13880893.html
Copyright © 2011-2022 走看看