D. Slimes
1.C. Insert and Equalize2.C. Removal of Unattractive Pairs3.D. Jumping Through Segments4.E. Good Triples5.F. Shift and Reverse6.D. Yet Another Monster Fight7.A. Constructive Problems8.C. Game with Multiset9.A. Rating Increase10.B. Swap and Delete11.A. Problemsolving Log12.B. Preparing for the Contest13.C. Quests14.D. Three Activities15.E2. Game with Marbles (Hard Version)16.cf刷题有感17.A. Anonymous Informant18.A. Forked!19.B. Make Almost Equal With Mod20.C. Heavy Intervals21.D. Split Plus K22.A. 202323.B. Two Divisors24.C. Training Before the Olympiad25.D. Mathematical Problem26.F. Greetings27.C. Partitioning the Array28.G. Bicycles29.E. Eat the Chip30.G. Lights31.D. Array Repetition32.D. Berserk Monsters33.E. Increasing Subsequences34.D. Very Different Array35.G. Mischievous Shooter36.B. Plus-Minus Split37.B. A Balanced Problemset38.C. Did We Get Everything Covered39.D. Find the Different Ones!40.C. Grouping Increases41.D. Good Trip42.C. Physical Education Lesson43.E. Final Countdown44.D. Divisible Pairs45.G. Vlad and Trouble at MIT46.A. Brick Wall47.B. Minimize Inversions48.C. XOR-distance49.A. Moving Chips50.B. Monsters Attack!51.C. Find B
52.D. Slimes
53.C. Turtle Fingers: Count the Values of k54.D. Turtle Tenacity: Continual Mods55.D. Vlad and Division56.C. LR-remainders57.D. Lonely Mountain Dungeons题解
对于任何一个粘液块s而言,要么是从左边被吞并,要么是从右边被吞并,根据对称性,两边的决策是一样的,因此先考虑右边
对于被右边吞并而言,有以下几个特征
1.起始粘液一定是吞掉了s右边一整块连续的粘液
2.右边区间一定存在大小不同的相邻粘液,这样才能发动吞并
3.由一二猜想,只要存在不同的相邻粘液,这一片区间上的粘液都会被吞并至只剩下一个粘液
证明:
假如只存在一个不同相邻粘液
最大的吞并比他小的-->原来大的比同伴大-->吞并同伴
存在两个及以上同理
4.因此我猜想,对于右边区间而言,存在不同相邻粘液块且区间和大于s的最小区间就是答案
开始证明
运用反证法:如果该区间不是最小区间,那么区间缩小,区间和会减小以至于可能小于s,也可能不存在相同相邻粘液,与题意不符,得证
然后很容易发现区间和具有单调性,是否存在不同相邻粘液也有单调性(不会减小)
因此二分
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll pres[300005]={0};
ll sufs[300005]={0};
ll a[300005]={0};
ll prech[300005]={0};
ll sufch[300005]={0};
ll press(ll l,ll r,ll x)
{
r++;
l--;
ll i=l;
if(a[i]<a[i+1])return i+1;
while(l+1<r)
{
ll mid=(l+r)/2;
if(pres[mid]-pres[i]>a[i]&&prech[mid]-prech[i+1]>0)
r=mid;
else l=mid;
}
return r;
}
ll sufss(ll l,ll r,ll x)
{
l--;
r++;
ll i=r;
if(a[i-1]>a[i])return i-1;
while(l+1<r)
{
ll mid=(l+r)/2;
if(sufs[mid]-sufs[i]>a[i]&&sufch[mid]-sufch[i-1]>0)
l=mid;
else r=mid;
}
return l;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
pres[i]=pres[i-1]+a[i];
if(i!=1)prech[i]=prech[i-1]+(a[i]!=a[i-1]);
}
sufs[n]=a[n];
sufch[n]=0;
for(ll i=n-1;i>=1;i--)
{
sufs[i]=sufs[i+1]+a[i];
sufch[i]=sufch[i+1]+(a[i]!=a[i+1]);
}
for(ll i=1;i<=n;i++)
{
if(i==1)
{
ll r=press(2,n,a[1]);
if(r!=n+1) cout<<r-i<<" ";
else printf("-1 ");
}
else if(i==n)
{
ll l=sufss(1,n-1,a[1]);
if(l!=0) cout<<i-l<<" ";
else printf("-1 ");
}
else
{
ll r=press(i+1,n,a[i]);
ll l=sufss(1,i-1,a[i]);
if(l!=0&&r!=n+1)cout<<min(i-l,r-i)<<" ";
else if(l!=0) cout<<i-l<<" ";
else if(r!=n+1) cout<<r-i<<" ";
else printf("-1 ");
}
}
puts("");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~