关于O2
查看原帖
关于O2
233815
zhjzhmh楼主2023/2/24 22:37
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100010],b[200010],rt[100010],L,cnt,T[2][210],c0,c1;
char opt;
struct node{int ls,rs,s;}tree[40000010];
struct ask{int opt,l,r,k,p,t;}q[100010];
int read()
{
	int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
void update(int &root,int l,int r,int x,int s)
{
	if(!root) root=++cnt;
	tree[root].s+=s;
	if(l==r) return;
	int mid=(l+r)/2;
	if(x<=mid) update(tree[root].ls,l,mid,x,s);
	  else update(tree[root].rs,mid+1,r,x,s);
}
void change(int x,int s)
{
	int k=lower_bound(b+1,b+L+1,a[x])-b;
	for(;x<=n;x+=x&(-x)) update(rt[x],1,L,k,s);
}
int query(int l,int r,int k)
{
	if(l==r) return l;
	int mid=(l+r)/2,s=0;
	for(int i=1;i<=c1;i++) s+=tree[tree[T[1][i]].ls].s;
	for(int i=1;i<=c0;i++) s-=tree[tree[T[0][i]].ls].s;
	if(k<=s)
	{
		for(int i=1;i<=c1;i++) T[1][i]=tree[T[1][i]].ls;
		for(int i=1;i<=c0;i++) T[0][i]=tree[T[0][i]].ls;
		return query(l,mid,k);
	}
	else
	{
		for(int i=1;i<=c1;i++) T[1][i]=tree[T[1][i]].rs;
		for(int i=1;i<=c0;i++) T[0][i]=tree[T[0][i]].rs;
		return query(mid+1,r,k-s);
	}
}
int ask(int l,int r,int k)
{
	memset(T,0,sizeof(T));c0=c1=0;l--;
	for(;r;r-=r&(-r)) T[1][++c1]=rt[r];
	for(;l;l-=l&(-l)) T[0][++c0]=rt[l];
	return query(1,L,k);
}
int main()
{
	cin>>n>>m;L=n;
	for(int i=1;i<=n;i++) b[i]=a[i]=read();
	for(int i=1;i<=m;i++)
	{
		cin>>opt;q[i].opt=(opt=='Q');
		if(q[i].opt) q[i].l=read(),q[i].r=read(),q[i].k=read();
		  else q[i].p=read(),b[++L]=q[i].t=read();
	}
	sort(b+1,b+L+1);L=unique(b+1,b+L+1)-b-1;
	for(int i=1;i<=n;i++) change(i,1);
	for(int i=1;i<=m;i++)
	{
		if(q[i].opt) printf("%d\n",b[ask(q[i].l,q[i].r,q[i].k)]);
		else change(q[i].p,-1),a[q[i].p]=q[i].t,change(q[i].p,1);
	}
} 

RT,mxqz,为什么此程序在开O2后运行时间(TLE7)远远低于不开O2的时间(AC)

2023/2/24 22:37
加载中...