社区讨论
T了第7个点,90,求条
P3765总统选举参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjs6k0pl
- 此快照首次捕获于
- 2025/12/30 14:02 2 个月前
- 此快照最后确认于
- 2026/01/02 12:00 2 个月前
rt
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int k=0,f=1;
char c=getchar_unlocked();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar_unlocked();
}
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar_unlocked();
return k*f;
}
inline void print(int x){
if(x<0)putchar('-'),x=-x;
if(x<10)putchar(x+'0');
else print(x/10),putchar(x%10+'0');
}
int n,m;
int a[500005];
mt19937 rnd(time(NULL));
struct node {int ls,rs,key,size;unsigned pri;}t[3000005];
int cnt;
class treap{
int root;
inline int newNode(int x){
t[++cnt].key=x;
t[cnt].size=1;
t[cnt].pri=rnd();
return cnt;
}
inline void Update(int u){t[u].size=t[t[u].ls].size+1+t[t[u].rs].size;}
inline void Split(int u,int x,int &L,int &R){
if(u==0){L=R=0;return ;}
if(t[u].key<=x){
L=u;
Split(t[u].rs,x,t[u].rs,R);
}
else {
R=u;
Split(t[u].ls,x,L,t[u].ls);
}
Update(u);
}
inline int Merge(int L,int R){
if(!L||!R)return L+R;
if(t[L].pri>t[R].pri){
t[L].rs=Merge(t[L].rs,R);
Update(L);
return L;
}
else {
t[R].ls=Merge(L,t[R].ls);
Update(R);
return R;
}
}
public:
inline void insert(int x){
int L,R;
Split(root,x,L,R);
root=Merge(Merge(L,newNode(x)),R);
}
inline void Delete(int x){
int L,R,p;
Split(root,x,L,R);
Split(L,x-1,L,p);
root=Merge(L,R);
}
inline int rank(int x){
int L,R;
Split(root,x,L,R);
int s=t[L].size;
root=Merge(L,R);
return s;
}
}tr[500005];
inline int ran(int l,int r){
int x=r-l+1;
return l+rnd()%x;
}
int vis[500005];
inline int query(int l,int r){
int ans=-1;
stack<int>st;
for(int i=1;i<=17;i++){
int x=a[ran(l,r)];
if(vis[x])continue;
vis[x]=1;st.push(x);
if(tr[x].rank(r)-tr[x].rank(l-1)>(r-l+1)/2){ans=x;break;}
}
while(!st.empty())vis[st.top()]=0,st.pop();
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// srand(time(NULL));
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read(),tr[a[i]].insert(i);
for(int i=1;i<=m;i++){
int l,r,s,k;l=read(),r=read(),s=read(),k=read();
int w=query(l,r);
if(w==-1)w=s;
for(int i=1;i<=k;i++){
int x=read();
tr[a[x]].Delete(x);
a[x]=w;
tr[a[x]].insert(x);
}
print(w),putchar('\n');
}
int w=query(1,n);
print(w);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...