社区讨论
被自创题卡了3天3夜没想明白
学术版参与者 11已保存回复 36
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 36 条
- 当前快照
- 1 份
- 快照标识符
- @mhjrgbwy
- 此快照首次捕获于
- 2025/11/04 07:17 4 个月前
- 此快照最后确认于
- 2025/11/04 10:21 4 个月前
根据题目要求,若输入
CPP10 2
-954902377 -224762699 -652264904 -706466142 -460110438 -27127982 -973883558 -387211944 674277713 -182483790
U 7 -524606695
U 8 -116578835
Q 4 9
应输出
CPP-460110438
可代码一直没任何输出。
我又自己手算了几个样例测,代码都可以输出正确答案,可就是有些情况没输出,,一直想不明白。
代码
CPP#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
const int MXN = 300010;
struct Event {
int t;
int p;
int v;
int L, R;
int k;
int i;
};
int n, m;
int A[MXN];
int ans[MXN];
vector<int> ns;
vector<Event> evs;
class ftree {
private:
vector<int> t;
int s;
public:
ftree(int n):s(n){t.resize(n+1,0);}
void update(int i,int d){
while(i<=s){
t[i]+=d;
i+=i&-i;
}
}
int query(int i){
int sum=0;
while(i){
sum+=t[i];
i-=i&-i;
}
return sum;
}
int rq(int L,int R){
return query(R)-query(L-1);
}
};
int gid(int x){
return lower_bound(ns.begin(),ns.end(),x)-ns.begin();
}
void solve(vector<Event>& evs,int L,int R,ftree& f){
if(evs.empty()) return;
if(L==R){
for(auto& e:evs)
if(e.t==2) ans[e.i]=L;
return;
}
int mid=(L+R)/2;
vector<Event> levs, revs;
for(auto& e:evs){
if(e.t==0||e.t==1){
if(e.v<=mid){
f.update(e.p+1,e.t==0?1:-1);
levs.push_back(e);
}
else revs.push_back(e);
}
else{
int cnt=f.rq(e.L+1,e.R+1);
if(e.k<=cnt) levs.push_back(e);
else{
e.k-=cnt;
revs.push_back(e);
}
}
}
for(auto& e:evs)
if(e.t!=2&&e.v<=mid) f.update(e.p+1,e.t==0?-1:1);
solve(levs,L,mid,f);
solve(revs,mid+1,R,f);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>A[i];
ns.push_back(A[i]);
}
int qid=0;
for(int i=0;i<n;i++)
evs.push_back({0,i,A[i],-1,-1,-1,-1});
for(int i=0;i<m;i++){
char op;cin>>op;
if(op=='U'){
int idx,x;cin>>idx>>x;
evs.push_back({1,idx,A[idx],-1,-1,-1,-1});
evs.push_back({0,idx,x,-1,-1,-1,-1});
A[idx]=x;
ns.push_back(x);
}
else if(op=='Q'){
int l,r;cin>>l>>r;
int len=r-l+1;
int k=(len+1)/2;
evs.push_back({2,-1,-1,l,r,k,qid++});
}
}
sort(ns.begin(),ns.end());
ns.erase(unique(ns.begin(),ns.end()),ns.end());
int D=ns.size();
for(auto& e:evs)
if(e.t!=2) e.v=gid(e.v);
ftree f(n);
vector<Event> iev=evs;
solve(iev,0,D-1,f);
for(int i=0;i<qid;i++)
cout<<ns[ans[i]]<<'\n';
return 0;
}
回复
共 36 条回复,欢迎继续交流。
正在加载回复...