codeforces#1148E. Earth Wind and Fire(贪心)

Posted carcar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces#1148E. Earth Wind and Fire(贪心)相关的知识,希望对你有一定的参考价值。

 

题目链接:

http://codeforces.com/contest/1148/problem/E

题意:

 给出两个长度为$n$的序列,将第一个序列变成第二个序列,顺序不重要,只需要元素完全相同即可

只有一种修改操作

  • $a_i=a_i+d,a_j=a_j-d$满足 $a_j-a_i>=2\times d$

数据范围:

 $1\leq n\leq 3e^5$

分析: 

 待补。

ac代码:

#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=3e5+10;
struct Ans

    int a,b,c;
ans[maxn*5];
int cnt;
struct Move

    int id,now,to;
    bool operator <(const Move &a)const
    
        if(to==a.to)return id<a.id;
        return to<a.to;
    
;
pa a[maxn];
int b[maxn];
set<Move>se1,se2;
int main()

    int n;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    
        scanf("%d",&a[i].first);
        a[i].second=i;
    
    for(int i=1;i<=n;i++)
        scanf("%d",&b[i]);
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    for(int i=1;i<=n;i++)
    
        //cout<<a[i].first<<" "<<b[i]<<endl;
        if(a[i].first<b[i])
            se1.insert((Move)a[i].second,b[i]-a[i].first,b[i]);
        else if(a[i].first>b[i])
            se2.insert((Move)a[i].second,a[i].first-b[i],b[i]);
        //cout<<se1.size()<<" "<<se2.size()<<endl;
    
    while(1)
    
        //cout<<se1.size()<<" "<<se2.size()<<endl;
        //cout<<"sadf0"<<endl;
        if(se1.size()==0&&se2.size()==0)break;
        if(se1.size()==0||se2.size()==0)
        
            printf("NO\n");
            return 0;
        
        Move x=(*se1.begin());
        Move y=(*se2.begin());
        if(x.to>y.to)
        
            printf("NO\n");
            return 0;
        
      //  cout<<x.id<<" "<<y.id<<endl;
        se1.erase(x);
        se2.erase(y);
        if(x.now==y.now)
        
            ans[++cnt]=(Ans)x.id,y.id,x.now;
        
        else if(x.now<y.now)
        
            ans[++cnt]=(Ans)x.id,y.id,x.now;
            y.now-=x.now;
            se2.insert(y);
        
        else if(x.now>y.now)
        
            ans[++cnt]=(Ans)x.id,y.id,y.now;
            x.now-=y.now;
            se1.insert(x);
        
    
    printf("YES\n");
    printf("%d\n",cnt);
    for(int i=1;i<=cnt;i++)
        printf("%d %d %d\n",ans[i].a,ans[i].b,ans[i].c);
    return 0;

  

以上是关于codeforces#1148E. Earth Wind and Fire(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing1148 秘密的奶牛运输(次小生成树)

Codeforces 803E--Roma and Poker (DP)

Codeforces Round #512 E - Vasya and Good Sequences

Codeforces894E.Ralph and Mushrooms Tarjan缩点+DP

[codeforces 894 E] Ralph and Mushrooms 解题报告 (SCC+拓扑排序+DP)

CodeForces 1321E. World of Darkraft: Battle for Azathoth(线段树)