0
点赞
收藏
分享

微信扫一扫

【TJOI2014】[JZOJ3744] 电影评分


Description

【TJOI2014】[JZOJ3744] 电影评分_ios


【TJOI2014】[JZOJ3744] 电影评分_splay_02


【TJOI2014】[JZOJ3744] 电影评分_TJOI_03

Solution

辣鸡TJOI出题人,毁我青春

这题很明显可以用Splay做,双关键字维护,直接按照给的操作做就行了。
据说有高级离线做法?我比较蠢不会。

然而因为暴力修改和插入都是O(1),询问O(NlogN),辣鸡数据范围给暴力直接过掉了。。。。

Code

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
using namespace std;
int m,n,a[N],act[N],rt,sn[N][2],num[N];
struct node
{
int k,p,f,fn,nu;
double s;
}t[N],cp;
void up(int k)
{
if(k==0) return;
t[k].k=t[sn[k][0]].k+t[sn[k][1]].k+1;
if(t[k].f==0) rt=k;
}
void link(int x,int y,int p)
{
if(x==y) return;
if(x!=0) sn[x][p]=y;
if(y!=0) t[y].fn=p,t[y].f=x;
up(y),up(x);
}
bool cmp(node x,node y)
{
return(y.s<x.s||(y.s==x.s&&y.p>x.p));
}
int fd(int k,double s,int v)
{
if(k==0) return 0;
cp.s=s,cp.p=v;
int p=cmp(t[k],cp);
if(sn[k][p]==0) return k;
else return fd(sn[k][p],s,v);
}
void rot(int k)
{
int f=t[k].f,p=t[k].fn;
link(t[f].f,k,t[f].fn);
link(f,sn[k][1-p],p);
link(k,f,1-p);
up(f),up(k),up(f);
}
void splay(int k,int x)
{
if(k==0) return;
while(t[k].f!=x)
{
if(t[t[k].f].f==x) rot(k);
else
{
if(t[k].fn==t[t[k].f].fn) rot(t[k].f),rot(k);
else rot(k),rot(k);
}
}
if(x==0) rt=k;
}
void put(int p)
{
if(p==0) return;
int q=fd(rt,t[p].s,t[p].p);
splay(q,0);
if(cmp(t[q],t[p])) link(p,sn[q][1],1),link(q,p,1);
else link(p,sn[q][0],0),link(q,p,0);
up(p),up(t[p].f);
}
int get(int k,int v)
{
if(t[sn[k][0]].k==v-1) return k;
if(t[sn[k][0]].k<v-1) return get(sn[k][1],v-t[sn[k][0]].k-1);
else return get(sn[k][0],v);
}
int main()
{
freopen("movie.in","r",stdin);
freopen("movie.out","w",stdout);
cin>>m;
fo(i,1,m)
{
char ch;
scanf("\n");
scanf("%c",&ch);
if(ch=='Q')
{
int x;
scanf("%d",&x);
printf("%d\n",t[get(rt,x)].nu);
}
if(ch=='R')
{
t[++n].p=i;
int v=0,x,y;
scanf("%d",&x);
t[n].nu=x;
num[x]=n;
scanf("%d",&x);
fo(j,1,x)
{
scanf("%d",&y);
if(t[num[act[y]]].p>t[num[v]].p) v=act[y];
act[y]=t[n].nu;
}
t[n].s=(!v)?0:t[num[v]].s;
t[n].k=1;
put(n);
}
if(ch=='C')
{
int x,y;
scanf("%d%d",&x,&y);
x=num[x];
splay(x,0);
int p=fd(sn[x][0],-1,1000000);
splay(p,rt);
t[p].f=0;
link(p,sn[x][1],1);
t[x].s=(t[x].s+y)/2;
sn[x][0]=sn[x][1]=0;
put(x);
}
}
}


举报

相关推荐

0 条评论