1 条题解
-
0
考虑顺序询问下去,考虑一个询问会对那些答案造成影响。
在第 之前,已经有 次询问,容易发现只有在前面 次询问中小于 的最大值到大于 的最小值这段区间会造成影响。
并且一次询问会将这个区间分成两半。
因此直接用 set 维护区间,每个区间记一个四元组 ,分别表示左右断电,上次询问的回答以及答案就好了。
代码
#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
- 上传者