D. Nene and the Mex Operator
题解
考,纯纯找规律,对于区间 \([l,r]\),其元素一定能全部变成 \(r-l+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;
}

浙公网安备 33010602011771号