您的位置:首页 > Web前端 > JavaScript

【JZOJ3864】【JSOI2014】歌剧表演

2017-01-17 22:45 176 查看

Description



Data Constraint



Solution

我们想想一个人在什么情况下会被发现:我们给每个数标上一个识别号,相同的识别号代表这两个数性质相同无法识别,而当一个数拥有一个唯一的识别号时,该数就可以被识别。为了不让识别号混乱,又要让区间的数的识别号的相对位置不变,我们每次取1~n中的最大值t,每次区间中若遇到一个新出现的识别号,我们就用t+1给它新标号,且t++,这样就保证了区间以外的数不会拥有和区间内的数一样的识别号。

那么,怎样判断一个点在什么时候被识别呢?

我们可两边以打个模拟链表(c++选手可以打set),识别号相同的点连成一条链。当一个点的左右分别为0,n+1时这个点即可被识别。(注意:这个被识别的点可以再区间中的也可在区间外)

Code

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll maxn=100005;
ll a[maxn],n,m,i,t,j,k,z,num,bz[maxn],b[maxn],c[maxn],l[maxn],r[maxn],h[maxn][2],x,d[maxn],f[maxn],y;
int main(){
//  freopen("data.in","r",stdin);//freopen("data.out","w",stdout);
scanf("%lld%lld",&n,&m);
for (i=1;i<=n;i++) l[i]=i-1,r[i]=i+1;
for (i=1;i<=m;i++){
scanf("%lld",&num);z=1e18;
for (j=1;j<=num;j++)
scanf("%lld",&a[j]),f[a[j]]=i;
sort(a+1,a+num+1);
for (j=1;j<=num;j++){
x=a[j];b[x]=c[x];
if (h[b[x]][0]!=i)h[b[x]][1]=++t;c[x]=h[b[x]][1];
h[b[x]][0]=i;
r[l[x]]=r[x],l[r[x]]=l[x];
if (r[l[x]]==n+1 && !l[l[x]] && !bz[l[x]] && f[l[x]]!=i) bz[l[x]]=i;
if (r[r[x]]==n+1 && !l[r[x]] && !bz[r[x]] && f[r[x]]!=i) bz[r[x]]=i;
r[d[c[x]]]=x,l[x]=d[c[x]],r[x]=n+1;d[c[x]]=x;
k=max(k,c[x]);
}
for (j=1;j<=num;j++){
x=a[j];
if (!l[x] && r[x]==n+1 && !bz[x]) bz[x]=i;
}
}
for (i=1;i<=n;i++)
printf("%lld ",bz[i]);printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: