题解 P3972 【[TJOI2014]电影评分】
在网上听人说这题暴力可过,本着no zuo no die的心态试了一发...
结果不仅过了,还跑得比香港记者还快,我甚至还没开氧气优化!
我将发动同学写此题,此题将成为一道省选红题
正解好像是平衡树?
upd:加点完全不必要的说明
id/fid记录每部电影存在数组里的编号/R操作给出的编号
Q:直接把所有电影存进数组排序即可
R:直接按题意模拟即可
C:fid转换编号直接按题意修改即可
直接暴力搞就好了
上代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double ddf;
const int N=100000+10;
int id[N],fid[N],ac[N],tot,n;
ddf s[N];
struct node{
ddf x;
int y;
}a[N];
bool cmp(node a,node b){
return a.x==b.x?a.y<b.y:a.x>b.x;
}
char b[16];
int main(){
int x,y,z;
ddf xp,yp,zp;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",b);
if(b[0]=='Q'){
scanf("%d",&x);
for(int i=1;i<=tot;i++)a[i]=(node){s[i],i};
sort(a+1,a+1+tot,cmp);
printf("%d\n",id[a[x].y]);
}
else if(b[0]=='R'){
int mx=0;
scanf("%d%d",&x,&y);
id[++tot]=x;
fid[x]=tot;
for(int i=1;i<=y;i++){
scanf("%d",&z);
mx=max(mx,ac[z]);
ac[z]=tot;
}
s[tot]=s[mx];
}
else {
scanf("%d%lf",&x,&xp);
x=fid[x];
s[x]=(s[x]+xp)/2;
}
}
return 0;
}
/*
10
R 1 1 1
R 2 2 1 2
C 2 2
R 3 1 2
Q 1
C 3 2
C 1 5
Q 1
Q 2
Q 3
*/