2 条题解
-
0昌孝阳 (changxiaoyang) LV 10 @ 2023-10-1 13:50:10
要抄题解的看我
#include <bits/stdc++.h> using namespace std; #define inf 2100000000 #define maxn 100010 int ch[maxn][2],f[maxn],size[maxn],key[maxn],lazy[maxn]; int sz,root; int read() { int ans=0,flag=1; char ch=getchar(); while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar(); if(ch=='-') flag=-1,ch=getchar(); while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar(); return ans*flag; } bool get(int x) {return ch[f[x]][1]==x;} void update(int x) { if(x) { size[x]=1; if(ch[x][0]) size[x]+=size[ch[x][0]]; if(ch[x][1]) size[x]+=size[ch[x][1]]; } return ; } void pushdown(int x) { //push down lazy tag if(x && lazy[x]) { lazy[ch[x][0]]^=1; lazy[ch[x][1]]^=1; swap(ch[x][0],ch[x][1]); lazy[x]=0; } return ; } void rotate(int x) { int old=f[x],oldf=f[old],whichx=get(x); pushdown(old); pushdown(x); ch[old][whichx]=ch[x][whichx^1]; f[ch[old][whichx]]=old; ch[x][whichx^1]=old; f[old]=x; f[x]=oldf; if(oldf) ch[oldf][ch[oldf][1]==old]=x; update(old); update(x); return ; } void splay(int x,int tar) { //rotate x to tar for(int fa;(fa=f[x])!=tar;rotate(x)) if(f[fa]!=tar) rotate(get(x)==get(fa)?fa:x); if(!tar) root=x; return ; } int findx(int x) { //by search the ranking return the treenumber int now=root; while(1) { pushdown(now); if(ch[now][0]&&x<=size[ch[now][0]]) now=ch[now][0]; else { int tmp=(ch[now][0]?size[ch[now][0]]:0)+1; if(x<=tmp) return now; x-=tmp; now=ch[now][1]; } } } void insert(int x) { if(root==0) { sz++; ch[sz][0]=ch[sz][1]=f[sz]=0; root=sz; size[sz]=1; key[sz]=x; return ; } int now=root,fa=0; while(1) { if(x==key[now]) { update(now); update(fa); splay(now,0); break; } fa=now; now=ch[now][key[now]<x]; if(now==0) { sz++; ch[sz][0]=ch[sz][1]=0; f[sz]=fa; size[sz]=1; ch[fa][key[fa]<x]=sz; key[sz]=x; update(fa); splay(sz,0); break; } } return ; } void print(int x) { pushdown(x); if(ch[x][0]) print(ch[x][0]); if(key[x]!=inf && key[x]!=-inf) printf("%d ",key[x]); if(ch[x][1]) print(ch[x][1]); return ; } int main() { int n,m,l,r; n=read(),m=read(); insert(-inf); for(int i=1;i<=n;i++) insert(i); insert(inf); for(int i=1;i<=m;i++) { l=read(),r=read(); l=findx(l); r=findx(r+2); splay(l,0); splay(r,l); lazy[ch[ch[root][1]][0]]^=1; } print(root); return 0; }
-
02021-8-8 0:30:35@
C++ :
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+99; const int INF = 0x3f3f3f3f; struct spalytree { int ch[maxn][2],pre[maxn],sz[maxn],key[maxn],root,tot1; void Rotate(int x,int d) { int y = pre[x]; ch[y][!d] = ch[x][d]; pre[ch[x][d]]=y; if(pre[y])ch[pre[y]][ch[pre[y]][1]==y] = x; pre[x] = pre[y]; ch[x][d] = y; pre[y] = x; } void splay(int r,int goal) { while(pre[r]!=goal) { if(pre[pre[r]] == goal) Rotate(r,ch[pre[r]][0] ==r); else { int y = pre[r]; int d = ch[pre[y]][0] ==y; if(ch[y][d] == r) { Rotate(r,!d); Rotate(r,d); } else { Rotate(y,d); Rotate(r,d); } } } if(goal == 0) root = r; } void newnode(int &r,int fa,int k) { r = ++tot1; sz[r] = 1;//不需要 key[r] = k; pre[r] = fa; ch[r][0] = ch[r][1] = 0; } /**建立排序树*/ int insert(int k)/**插入一个值为k的节点,insert一个一个的写*/ { int r = root; while(1) { if(key[r]==k) { splay(r,0); return 0; } else if(k<key[r]) { if(ch[r][0])r = ch[r][0]; else { newnode(ch[r][0],r,k); splay(ch[r][0],0); return 1; } } else if(k>key[r]) { if(ch[r][1])r=ch[r][1]; else { newnode(ch[r][1],r,k); splay(ch[r][1],0); return 1; } } } } /**找前面出现的最接近这个值的,从比他大的找最小的,从比他小的找最大的,然后去判断这两个值哪个更接近他*/ int get_pre(int x) { int r = ch[x][0]; if(r==0)return INF; while(ch[r][1])r = ch[r][1]; return key[x] - key[r]; } int get_next(int x) { int r = ch[x][1]; if(r==0)return INF; while(ch[r][0])r = ch[r][0]; return key[r]-key[x]; } }st; int main() { int n; while(scanf("%d",&n)==1) { st.root = st.tot1 = 0; int ans = 0; for(int i=1; i<=n; i++) { int num; if(scanf("%d",&num)==EOF)num = 0; if(i==1) { ans+=num; st.newnode(st.root,0,num); continue; } if(st.insert(num)==0)continue; int a = st.get_pre(st.root); int b = st.get_next(st.root); ans += min(a,b); } printf("%d\n",ans); } }
- 1
信息
- ID
- 176
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 8
- 已通过
- 7
- 上传者