社区讨论

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 条回复,欢迎继续交流。

正在加载回复...