TLE on #8 求助
查看原帖
TLE on #8 求助
546904
pig_16楼主2024/8/24 10:04

按照第一篇题解打的

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define rg register
typedef pair<int,int> PII;
inline int read();
const int mod = 1000000,inf=214748364;

struct node{
	int s[2],v;
	int p;
	int sz;
	void init(int _v,int _p){
		v = _v;p=_p;
        s[1] = s[0] = 0;
	}
}tr[200010];
int root;
inline void rotate(rg int x){
	int y = tr[x].p;
	int z =tr[y].p;
	int k = (tr[y].s[1] == x);
	tr[z].s[y==tr[z].s[1]] = x; tr[x].p = z;
	tr[y].s[k]=tr[x].s[k ^ 1];tr[tr[x].s[k ^ 1]].p = y;
	tr[x].s[k ^ 1] = y;tr[y].p=x;
	//pushup(y);pushup(x);
	
}
inline void splay(rg int x,int k){
	while(tr[x].p != k){
		int y = tr[x].p;
		int z = tr[y].p;
		if(z != k){
			if((tr[y].s[1] == x) ^ (tr[z].s[1] == y)){
				rotate(y);
			}
			else rotate(x);
		}
		rotate(x);
	}
	if(!k) root = x;
}
int idx;
inline void insert(rg int x){
	int u = root;
	int p = 0;
	while(u){
		p=u;u=tr[u].s[x > tr[u].v];
	}
	u=++idx;
	if(p){
		tr[p].s[x > tr[p].v] = u;
	}
	tr[u].init(x,p);
	splay(u,0);
}
//void insert(int x){
//	int u = root;
//	int p = 0;
//	while(u){
//		p=u;u=tr[u].s[x > tr[u].v];
//	}
//	u=++idx;
//	if(p){
//		tr[p].s[x > tr[p].v] = u;
//	}
//	tr[u].init(x,p);
//	splay(u,0);
//}
inline void find_val(rg int x)
{
    int u=root;
    if(!u)return;
    while(tr[u].s[x>tr[u].v]&& x!=tr[u].v)
        u=tr[u].s[x>tr[u].v];
    splay(u,0);
}
inline int lower_nxt(rg int x,rg int f)
{
    find_val(x);
    int u=root;
    if(tr[u].v>=x&&f)return u;
    if(tr[u].v<=x&&!f)return u;
    u=tr[u].s[f];
    while(tr[u].s[f^1])u=tr[u].s[f^1];
    return u;
}
inline int upper_nxt(rg int x,rg int f){//1 da 0 xiao
    find_val(x);
    int u=root;
    if(tr[u].v>x&&f)return u;
    if(tr[u].v<x&&!f)return u;
    u=tr[u].s[f];
    while(tr[u].s[f^1])u=tr[u].s[f^1];
    return u;
}
inline void del(rg int x){
	int l = upper_nxt(x,0);
	int r =upper_nxt(x,1);
	splay(l,0);splay(r,l);
	tr[r].s[0] = 0;
}
signed main(){
//	freopen("pet.txt","r",stdin);
//	freopen("ans.out","w",stdout);
	int sum =0;//宠-人 
	int n = read();
	int ans =0;
insert(-214748364),insert(2147483607);
	int op,x;

	for(rg int i=1;i<=n;i++){
		op=read();
		x = read();

		//cout<<op<<" "<<x<<endl;
		if(sum == 0){
			insert(x);
			
		}
		
		if(sum > 0){
			if(op == 0){
				insert(x);
				
			}
			else{
				
				int xiao = tr[lower_nxt(x,0)].v;
				int da = tr[lower_nxt(x,1)].v;
				if(abs(xiao - x) <= abs(da - x)){
					ans= (ans + abs(xiao-x)) % mod;
					
					
					del(xiao);
				}
				else{
					ans= (ans+abs(da -x))%mod;
					
					del(da);
				}
			}
		}
		if(sum < 0){
			if(op == 1){
				insert(x);
				
			}
			else{
				
				int xiao = tr[lower_nxt(x,0)].v;
				int da = tr[lower_nxt(x,1)].v;
				if(abs(xiao - x) <= abs(da - x)){
					ans=(ans+abs(xiao-x)) % mod;
					
					del(xiao);
				}
				else{
					ans= (ans + abs(da -x)) % mod;
					
					del(da);
				}
			}
		}
		if(op == 0) sum++;
		else sum--;
			
		
	}
	cout<<ans % mod;
	return 0;

}
inline int read() {
  int res = 0;
  char ch;
  while (!isdigit(ch = getchar())) continue;
  do {
    res = res * 10 + ch - '0';
  } while (isdigit(ch = getchar()));
  return res;
}
2024/8/24 10:04
加载中...