C. Find a Mine
题解
观察样例解释,不难想到在四个角上询问
对左上和右下询问会得到一条或者两条平行斜线,命名为
再对左下角询问,会得到一条与的斜线垂直的斜线
如何查找交点?设交点为
如何确定是否与左上角斜线相交呢?
把斜线与
右下角同理
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~