C. Find a Mine

原题链接

题解

观察样例解释,不难想到在四个角上询问
对左上和右下询问会得到一条或者两条平行斜线,命名为 A,B
再对左下角询问,会得到一条与的斜线垂直的斜线 C,这条斜线一定与 A,B 某条线相交,且交点是其中一个井
如何查找交点?设交点为 x,y ,假设与左上角询问产生的斜线相交,则有

  • x1+y1==k1
  • nx+y1==k2

如何确定是否与左上角斜线相交呢?
把斜线与 y==1 相交的格子标记出来,则 C,A 所标记的格子,之间至少相差奇数个格子,且 C 所标记的格子在 A 的上面
右下角同理

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