帮我查错的人rp++
查看原帖
帮我查错的人rp++
226523
RAYMOND_7楼主2020/8/21 13:58

小菜鸡的线段树炸成67pts,好心人救救我呀。

各位路过的神犇求助。

代码如下

#2,#3炸了,WA,没有TLE的。

#include <cstdio>
#define ll long long
#include <algorithm>
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
void read(ll &x){//读优
	char c=getchar();
	int k=1;
	while(c<'0'||c>'9') {if(c=='-') k=-1;c=getchar();}
	for(x=0;c>='0'&&c<='9';c=getchar())
	x=x*10+c-'0';
	x*=k;
}
#define N 1000001
#define mod 317847191
ll n,m,l,r,k;
ll a[N];
ll tree[N*4];//线段树
ll s,ans,p,q;
char ch[2];
bool ok[N];
void build(int k,int l,int r){//建树
	if(l==r){
		tree[k]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	tree[k]=tree[k<<1]*tree[k<<1|1]%mod;
}
//区间求积
ll query(int k,int l,int r,int x,int y){
	if(l>r) return 1;
	if(l>y||r<x) return 1;
	if(x<=l&r<=y) return tree[k]%mod;
	ll s=1;
	int mid=l+r>>1;
	s*=query(k<<1,l,mid,x,y)*query(k<<1|1,mid+1,r,x,y);
	s%=mod;
	return s;
}
//单点修改
void change(int k,int l,int r,int x){
	if(l>r) return;
	if(l>x||r<x) return;
	if(l==r&&l==x){
		tree[k]=1;
		return;
	}
	int mid=l+r>>1;
	change(k<<1,l,mid,x);
	change(k<<1|1,mid+1,r,x);
	tree[k]=tree[k<<1]*tree[k<<1|1]%mod;	
}
//快速幂
ll pow(ll x,ll n){
	ll y=1;
	while(n){
		if(n&1){
			y*=x;y%=mod;
		}
		x*=x;
		n>>=1;
	}
	return y;
}
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++){
		read(a[i]);
	}
	sort(a+1,a+n+1);//先排序
	build(1,1,n);
	l=1;r=n;//双指针
	while(m--){
		scanf("%s",ch+1);
		if(ch[1]=='D'){
			read(k);
			if(a[l]==k){
				l++;continue;
			}
			if(a[r]==k){
				r--;continue;
			}
			p=lower_bound(a+1,a+n+1,k)-a;
        //找到要删除的位置变成一
			change(1,1,n,p);
		}
		if(ch[1]=='B'){
			printf("%lld\n",a[r]);
		}
		if(ch[1]=='S'){
			printf("%lld\n",a[l]);
		}
		if(ch[1]=='M'){
			p=a[l];q=a[r];
			printf("%lld\n",pow(q,p));
		}
		if(ch[1]=='T'){
			printf("%lld\n",query(1,1,n,l,r));
		}
	}
	return 0;
}
2020/8/21 13:58
加载中...