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
原文地址:https://www.cnblogs.com/flyljz/p/13880893.html