专栏文章
题解:P11403 [RMI 2020] 软盘 / Floppy
P11403题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minait9p
- 此快照首次捕获于
- 2025/12/01 23:14 3 个月前
- 此快照最后确认于
- 2025/12/01 23:14 3 个月前
刚学通信题,这题很适合练手。
发现数据要求 ,满足这个特性的结构不多,再结合题目要求找区间最大值位置,不难想到用单调栈维护,不会用单调栈维护离线 RMQ 问题的可以看 OI-wiki。
我们从头开始扫描,入栈记为 ,出栈记为 。显然这个长度小于 。
CPP#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r,i;
bool operator<(const node a)const{
return r<a.r;
}
};
void save_to_floppy(const string&);
void read_array(int subtask_id, const vector<int> &v){
stack<int>s;
string S;
for(auto now:v){
while(!s.empty()&&s.top()<now)S=S+'0',s.pop();
S=S+'1';s.push(now);
}
save_to_floppy(S);
}
vector<int> solve_queries(int subtask_id,int N,const string &bits, const vector<int> &a,const vector<int> &b){
vector<node>x;
for(int i=0;i<a.size();i++)
x.push_back({a[i],b[i],i});
sort(x.begin(),x.end());
int s[100000],cnt=0,i=0,j=0;
vector<int>ANS(x.size());
for(auto now:x){
while(j<=now.r){
if(bits[i]=='0')cnt--;
else s[++cnt]=j++;
i++;
}
int L=1,R=cnt,ans=cnt;
while(L<=R){
int mid=L+R>>1;
if(s[mid]>=now.l)ans=s[mid],R=mid-1;
else L=mid+1;
}
ANS[now.i]=ans;
}
return ANS;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...