D. Nene and the Mex Operator

原题链接

题解

考,纯纯找规律,对于区间 [l,r],其元素一定能全部变成 rl+1
遍历所有区间优先修改覆盖之后能增加 sum 且区间大小更小的区间

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll a[20];
ll pre[20]={0};
ll f[20];
struct unit
{
    ll l,r;
};

vector<unit> ans;

struct node
{
    ll l,r;
    bool operator<(const node &b)const
    {
        ll tem1=(r-l+1)*(r-l+1)-(pre[r]-pre[l-1]),tem2=(b.r-b.l+1)*(b.r-b.l+1)-(pre[b.r]-pre[b.l-1]);
        if(tem1!=tem2) return tem2>tem1;
        else return r-l>b.r-b.l;
    }
};

void fang(ll l,ll r)
{
    if(l==r) return;
    if(l+1==r)
    {
        ans.push_back({l,l});
        return;
    }
    fang(l+1,r);
    ans.push_back({l,r});

    ans.push_back({l+1,r});
    fang(l+1,r);

}

void update(ll l,ll r)
{
    if(r<l) return;
    priority_queue<node> q;
    for(ll i=l;i<=r;i++)
    {
        for(ll j=i;j<=r;j++)
        {
            if((j-i+1)*(j-i+1)-(pre[j]-pre[i-1])>0) q.push({i,j});
        }
    }

    if(q.empty())return;
    ll l1=q.top().l,r1=q.top().r;


    ans.push_back({l1,r1});
    ans.push_back({l1,r1});

    fang(l1,r1);
    ans.push_back({l1,r1});

    for(ll i=l1;i<=r1;i++) a[i]=(r1-l1+1LL);

    update(l,l1-1);
    update(r1+1,r);
}

void solve()
{
    ll n;
    cin>>n;
    for(ll i=1;i<=n;i++)
    {
        cin>>a[i];
        pre[i]=pre[i-1]+a[i];
    }
    update(1,n);
    ll sum=0;
    for(ll i=1;i<=n;i++) sum+=a[i];
    cout<<sum<<' '<<ans.size()<<'\n';
    for(auto it:ans) cout<<it.l<<' '<<it.r<<'\n';
    ans.clear();
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    ll t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

posted @   纯粹的  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示