2020HDU多校第四场By Rynar 6802-6813

1001.Anti-AK Problem

1002.Blow up the Enemy

int main(){
    int T,x,y;
    scanf("%d",&T);
    while (T--){
        int n;
        scanf("%d",&n);
        int mi=1e9,cnt=0,t;
        for (int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            t=((100+x-1)/x-1)*y;
            if (mi>t)mi=t,cnt=1;
            else if (mi==t)cnt++;
        }
        printf("%lf\n",(cnt*0.5+n-cnt)/n);
    }
    return 0;
}

1003.Contest of Rope Pulling

typedef long long ll;
const ll inf=1e16;
const int N=1e3+10;
const int M=1e6+10;
ll n,m;
ll f1[M],f2[M];
struct node{
    int w,v;
    friend bool operator<(const node &a,const node &b){
        return a.w<b.w;
    }
}a[N],b[N];
int main(){
    ll T,x,y;
    scanf("%d",&T);
    while (T--){
        scanf("%d%d",&n,&m);
        ll m1=0,m2=0;
        for (int i=1;i<=n;i++){
            scanf("%d%d",&a[i].w,&a[i].v);
            m1+=a[i].w;
        }
        for (int i=1;i<=m;i++){
            scanf("%d%d",&b[i].w,&b[i].v);
            m2+=b[i].w;
        }
        sort(a+1,a+1+n);
        sort(b+1,b+1+m);
        ll mm=min(m1,m2);
        for (int i=1;i<=mm;i++)f1[i]=f2[i]=-inf;
        f1[0]=f2[0]=0;
        ll sumw=0;
        for(int i=1;i<=n;i++){
            sumw+=a[i].w;
            for(int c=sumw;c>=a[i].w;c--){
                if (f1[c-a[i].w]!=-inf&&f1[c]<f1[c-a[i].w]+a[i].v)
                    f1[c]=f1[c-a[i].w]+a[i].v;
            }
        }
        sumw=0;
        for(int i=1;i<=m;i++){
            sumw+=b[i].w;
            for(int c=sumw;c>=b[i].w;c--){
                if (f2[c-b[i].w]!=-inf&&f2[c]<f2[c-b[i].w]+b[i].v)
                    f2[c]=f2[c-b[i].w]+b[i].v;
            }
        }
        ll mx=0;
        for (int i=1;i<=mm;i++){
            if (mx<f1[i]+f2[i])
                mx=f1[i]+f2[i];
        }
        printf("%lld\n",mx);
    }
    return 0;
}

1004.Deliver the Cake

typedef long long ll;
typedef pair<ll,ll>P;
const ll inf=1e16;
const int N=1e5+10;
ll n,m,k;
char sss[N];
ll c[N][3],ss[N];
vector<P>v[N];
ll dijkstra(ll x,ll y){
    for (int i=1;i<=n;i++)for (int j=1;j<=2;j++)c[i][j]=inf;
    priority_queue< P , vector<P> , greater<P> > q;
    if (ss[x]!=0)q.push({0*1ll,x}),c[x][ss[x]]=0;
    else q.push({0*1ll,x}),c[x][2]=0,c[x][1]=0;
    while(!q.empty()){
        P r=q.top();
        q.pop();
        int u=r.second;
        if (c[u][1]<r.first&&c[u][2]<r.first)continue;
        for (P i:v[u]){
            ll to=i.first,d=i.second;
            if (ss[to]==1){
                if(c[u][1]+d<c[to][1]){
                    c[to][1]=c[u][1]+d;q.push({c[to][1],to});
                }
                if(c[u][2]+d+k<c[to][1]){
                    c[to][1]=c[u][2]+d+k;q.push({c[to][1],to});
                }
            }
            else if (ss[to]==2){
                if(c[u][1]+d+k<c[to][2]){
                    c[to][2]=c[u][1]+d+k;q.push({c[to][2],to});
                }
                if(c[u][2]+d<c[to][2]){
                    c[to][2]=c[u][2]+d;q.push({c[to][2],to});
                }
            }
            else if (ss[to]==0){
                if(c[u][1]+d<c[to][1]){
                    c[to][1]=c[u][1]+d;q.push({c[to][1],to});
                }
                if(c[u][2]+d+k<c[to][1]){
                    c[to][1]=c[u][2]+d+k;q.push({c[to][1],to});
                }
                if(c[u][1]+d+k<c[to][2]){
                    c[to][2]=c[u][1]+d+k;q.push({c[to][2],to});
                }
                if(c[u][2]+d<c[to][2]){
                    c[to][2]=c[u][2]+d;q.push({c[to][2],to});
                }
            }
        }
    }
    return min(c[y][1],c[y][2]);
}
void add(int x,int y,int z){
    v[x].push_back({y,z});v[y].push_back({x,z});
}
int main(){
    int T;
    scanf("%d",&T);
    ll s,t,x,y,z;
    while (T--){
        scanf("%lld%lld%lld%lld%lld",&n,&m,&s,&t,&k);
        for (int i=1;i<=n;i++)v[i].clear();
        scanf("%s",sss+1);
        for (int i=1;i<=n;i++){
            if (sss[i]=='M')ss[i]=0;
            if (sss[i]=='L')ss[i]=1;
            if (sss[i]=='R')ss[i]=2;
        }
        while (m--){
            scanf("%lld%lld%lld",&x,&y,&z);
            add(x,y,z);
        }
        printf("%lld\n",dijkstra(s,t));
    }
    return 0;
}

1005.Equal Sentences

1006.Fake Photo

1007.Go Running

思路:匈牙利算法求二分图最大独立点集,+时间戳进行used的清空,O(n*m),也可用dinic网络流,建立超级源点汇点求二分匹配,O(m*sqrt(n))

typedef long long ll;
typedef pair<int,int>P;
const int N=2e5+10;
int n,flag;
struct node{
    int x,id;
}a[N],b[N];
vector<int>v[N];
bool cmp(node a,node b){
    return a.x<b.x;
}
bool cmp1(node a,node b){
    return a.id<b.id;
}
int f[N],used[N],match[N];
bool dfs(int x){
    for (int i:v[x]){
        if(used[i]!=flag){
            used[i]=flag;
            if(!match[i]||dfs(match[i])){
                match[i]=x;
                return 1;
            }
        }
    } 
    return 0;
}
int main(){
    int T;
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        int x,y;
        for (int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            a[i].x=x-y;b[i].x=x+y;
            a[i].id=b[i].id=i;
        }
        sort(a+1,a+1+n,cmp);sort(b+1,b+1+n,cmp);
        int cnt=0;f[a[1].id]=++cnt;
        for (int i=2;i<=n;i++){
            if (a[i].x==a[i-1].x)f[a[i].id]=f[a[i-1].id];
            else f[a[i].id]=++cnt;
        }
        int p=cnt;
        f[b[1].id+n]=++cnt;
        for (int i=2;i<=n;i++){
            if (b[i].x==b[i-1].x)f[b[i].id+n]=f[b[i-1].id+n];
            else f[b[i].id+n]=++cnt;
        }
        sort(a+1,a+1+n,cmp1);sort(b+1,b+1+n,cmp1);
        for (int i=1;i<=n;i++)v[i].clear();
        for (int i=1;i<=n;i++){
            v[f[i]].push_back(f[i+n]);v[f[i+n]].push_back(f[i]);
        }
        for (int i=1;i<=cnt;i++)match[i]=used[i]=0;
        flag=0;
        int ans=0;
        for(int i=1;i<=p;i++){
            flag++;//时间戳
            if(dfs(i))ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

1008.Head Maker

1009.Imperative Meeting

1010.Joyful Party

1011.Kindergarten Physics

1012.Last Problem

posted @ 2020-07-30 17:41  Rynar  阅读(390)  评论(0)    收藏  举报