「杂题乱刷2」CF1108E2
1.「杂题乱刷」CF1904B2.「杂题乱刷」CF1620E3.「杂题乱刷」CF978G4.「杂题乱刷」洛谷P92535.「杂题乱刷」CF624B6.「杂题乱刷」CF1221B7.「杂题乱刷」CF1585B8.「杂题乱刷」CF468A9.「杂题乱刷」洛谷P951510.「杂题乱刷」CF283A11.「杂题乱刷」洛谷P953312.「杂题乱刷」CF1914E1 & CF1914E213.「杂题乱刷」AT_abc280_d14.「杂题乱刷」CF1916C15.「杂题乱刷」AT_arc041_b16.【待补题解】AT_arc146_a17.「杂题乱刷」AT_abc337_e18.「杂题乱刷」AT_abc308_f19.「杂题乱刷」ZhengRui 54. 【17 普及 13】幻想嘉年华20.「杂题乱刷」CF1925C & CF1924A21.「杂题乱刷」CF1927D22.「杂题乱刷」洛谷 P1015523.「杂题乱刷」洛谷 P171224.「杂题乱刷」洛谷 P886625.「杂题乱刷」CF1937C & CF1936A26.「杂题乱刷」CF1934D227.「杂题乱刷」洛谷 P480128.「杂题乱刷」ZhengRui 611 【19寒假普转提】树的权29.「杂题乱刷」ZhengRui 281 汪初雪与高流星30.「杂题乱刷」at_abc092_d & AT_arc093_b31.「杂题乱刷」CF74E32.「杂题乱刷」AT_abc279_e33.「杂题乱刷」AT_abc096_d34.「杂题乱刷」CF1973D35.「杂题乱刷」CF1650D36.「杂题乱刷」CF1650E37.「杂题乱刷」CF1977B38.「杂题乱刷」CF1977C39.「杂题乱刷」CF460C40.「杂题乱刷」P827941.「杂题乱刷」AT_abc160_e42.「杂题乱刷」P1051243.「杂题乱刷」AT_abc358_g44.「杂题乱刷」 AT_abc123_d45.「杂题乱刷」P7840 & AT_abc359_f46.「杂题乱刷」CF1987C47.「杂题乱刷」P1067848.「杂题乱刷2」CF1702F49.「杂题乱刷2」CF402D Upgrading Array50.「杂题乱刷2」CF1506E Restoring the Permutation51.「杂题乱刷2」CF727D52.「杂题乱刷2」CF1615C Menorah53.「杂题乱刷2」CF1889A Qingshan Loves Strings 254.「杂题乱刷2」CF1527B2
55.「杂题乱刷2」CF1108E2
56.「杂题乱刷2」CF827B57.「杂题乱刷2」CF1227D258.「杂题乱刷2」CF2066B题目链接
解题思路
这篇题解分 E1,E2 两个部分来讲。
E1 sol:
我们发现可以暴力枚举最后经过所有操作之后的最大值,那么显然的,我们将不会做任何经过这个位置的操作,会做不经过这个区间的所有操作。
直接暴力进行操作即可。
时间复杂度
E2 sol:
发现这个暴力的过程可以使用区间加,区间最大值,区间最小值的线段树来维护,此时时间复杂度变为
参考代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll int
#define pb push_back
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define mid ((l+r)>>1)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
template<typename T1,typename T2>bool Max(T1&x,T2 y){if(y>x)return x=y,1;return 0;}
template<typename T1,typename T2>bool Min(T1&x,T2 y){if(y<x)return x=y,1;return 0;}
ll _t_;
void _clear(){}
/*
0 -4 1 1 2
*/
ll n,m;
ll id;
ll maxn;
ll a[100010],b[100010],c[100010];
ll l[100010],r[100010];
ll vis[510];
struct node{
ll l,r,minn,maxn,tag;
}tree[400010];
struct nide{
ll x,id;
}d[100010];
bool cmp(nide x,nide y){
return x.x<y.x;
}
void pushup(ll x){
tree[x].minn=min(tree[x*2].minn,tree[x*2+1].minn);
tree[x].maxn=max(tree[x*2].maxn,tree[x*2+1].maxn);
}
void pushdown(ll x)
{
tree[x*2].minn+=tree[x].tag;
tree[x*2+1].minn+=tree[x].tag;
tree[x*2].tag+=tree[x].tag;
tree[x*2+1].tag+=tree[x].tag;
tree[x*2].maxn+=tree[x].tag;
tree[x*2+1].maxn+=tree[x].tag;
tree[x].tag=0;
}
void build(ll x,ll l,ll r)
{
tree[x].l=l,tree[x].r=r;
if(l==r)
{
tree[x].minn=a[l];
tree[x].maxn=a[l];
return ;
}
build(x*2,l,mid);
build(x*2+1,mid+1,r);
pushup(x);
}
void add(ll x,ll l,ll r,ll y)
{
if(l<=tree[x].l && tree[x].r<=r)
{
tree[x].minn+=y;
tree[x].maxn+=y;
tree[x].tag+=y;
return ;
}
pushdown(x);
ll Mid=(tree[x].l+tree[x].r)/2;
if(l<=Mid)
add(x*2,l,r,y);
if(Mid<r)
add(x*2+1,l,r,y);
pushup(x);
}
ll querymin(ll x,ll l,ll r)
{
if(l<=tree[x].l && tree[x].r<=r)
return tree[x].minn;
pushdown(x);
ll Mid=(tree[x].l+tree[x].r)/2,ans=1e9;
if(l<=Mid)
Min(ans,querymin(x*2,l,r));
if(Mid<r)
Min(ans,querymin(x*2+1,l,r));
return ans;
}
ll querymax(ll x,ll l,ll r)
{
if(l<=tree[x].l && tree[x].r<=r)
return tree[x].maxn;
pushdown(x);
ll Mid=(tree[x].l+tree[x].r)/2,ans=-1e9;
if(l<=Mid)
Max(ans,querymax(x*2,l,r));
if(Mid<r)
Max(ans,querymax(x*2+1,l,r));
return ans;
}
ll check(ll x)//x最终为最大值
{
// forl(i,0,n+2)
// c[i]=0;
forl(i,1,m)
{
if(l[i]>x || r[i]<x)
{
if(!vis[i])
add(1,l[i],r[i],-1),vis[i]=1;
}
else
{
if(vis[i])
add(1,l[i],r[i],1),vis[i]=0;
}
}
//c[l[i]]--,c[r[i]+1]++;
// forl(i,1,n)
// c[i]+=c[i-1];
ll maxn=-1e9,minn=1e9;
maxn=querymax(1,1,n),minn=querymin(1,1,n);
// forl(i,1,n)
// cout<<querymax(1,i,i)<<' ';
// cout<<endl;
// forl(i,1,m)
// if(l[i]>x || r[i]<x)
// add(1,l[i],r[i],1);
/// forl(i,1,n)
// Max(maxn,c[i]+a[i]),
// Min(minn,c[i]+a[i]);
// cout<<a[i]+c[i]<<' ';
// cout<<endl;
// cout<<"<"<<minn<<' '<<maxn<<endl;
return maxn-minn;
}
void check2(ll x)//x最终为最大值
{
vector<ll>ans;
forl(i,0,n+2)
c[i]=0;
forl(i,1,m)
if(l[i]>x || r[i]<x)
ans.pb(i);
cout<<ans.size()<<endl;
for(auto i:ans)
cout<<i<<' ';
// {
// cout<<
// }
// c[l[i]]--,c[r[i]+1]++;
// forl(i,1,n)
// c[i]+=c[i-1];
// ll maxn=-1e18,minn=1e18;
/// forl(i,1,n)
// Max(maxn,c[i]+a[i]),
// Min(minn,c[i]+a[i]);
// cout<<a[i]+c[i]<<' ';
// cout<<endl;
// cout<<minn<<' '<<maxn<<endl;
// return maxn-minn;
}
void solve()
{
_clear();
cin>>n>>m;
forl(i,1,n)
cin>>a[i];//,d[i].x=a[i],d[i].id=i;
build(1,1,n);
forl(i,1,m)
cin>>l[i]>>r[i];
maxn=-1e9;
// check(5);
// sort(d+1,d+1+n,cmp);
forl(i,1,n)
if(Max(maxn,check(i)))
id=i;
/* forr(i,n,max(5001,n-5000))
if(Max(maxn,check(i)))
id=i; */
cout<<maxn<<endl;
check2(id);
}
int main()
{
// freopen("tst.txt","r",stdin);
// freopen("sans.txt","w",stdout);
IOS;
_t_=1;
// cin>>_t_;
while(_t_--)
solve();
QwQ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效