1 条题解

  • 0
    @ 2021-12-22 14:43:02

    考虑顺序询问下去,考虑一个询问会对那些答案造成影响。

    在第 aia_i 之前,已经有 i1i-1 次询问,容易发现只有在前面 i1i-1 次询问中小于 aia_i 的最大值到大于 aia_i 的最小值这段区间会造成影响。

    并且一次询问会将这个区间分成两半。

    因此直接用 set 维护区间,每个区间记一个四元组 (l,r,las,s)(l,r,las,s),分别表示左右断电,上次询问的回答以及答案就好了。


    代码
    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+5;
    struct hzy{int l,r,ff,s;};
    int n,a[N];
    bool operator<(hzy a,hzy b){return a.l<b.l;}
    bool operator>(hzy a,hzy b){return a.l>b.l;}
    multiset<hzy> se;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    	se.insert((hzy){0,n+1,2,0});
    	for(int i=1;i<=n;i++){
    		auto it=se.upper_bound((hzy){a[i],a[i],0,0});
    		it--;
    		if((it->ff)==1)se.insert((hzy){a[i],it->r,0,(it->s)+1});
    		else se.insert((hzy){a[i],it->r,0,it->s});
    		se.insert((hzy){it->l,a[i],1,it->s});
    		se.erase(it);
    	}
    	for(auto it:se)printf("%d\n",(it.s));
    }
    
    • 1

    信息

    ID
    60
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者