【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"); }
相关文章推荐
- 【JZOJ 3864】【JSOI2014】歌剧表演
- [JZOJ3864]【JSOI2014】歌剧表演
- 【JSOI2014】【JZOJ 3864】歌剧表演
- JZOJ 3864. 【JSOI2014】歌剧表演
- {题解}[jzoj3864]【JSOI2014】歌剧表演
- 【JSOI2014】歌剧表演
- 【JSOI2014】歌剧表演
- [jzoj3865/JSOI2014]士兵部署
- 【JSOI2014】【JZOJ 3861】支线剧情2
- [JZOJ3861]【JSOI2014】支线剧情2
- 【jzoj3861】【JSOI2014】【支线剧情2 】【树形动态规划】
- 【JZOJ3861】【JSOI2014】支线剧情2
- 【JZOJ 3861】【JSOI2014】支线剧情2
- jzoj3865[JSOI2014]士兵部署
- [ZJOI2014][JZOJ3617]力
- JZOJ3632【汕头市选2014】舞伴(perm)
- 【jzoj3599】【CQOI2014】【排序机械臂】【splay】
- jsoi2014前两轮回眸
- BZOJ 3669 . JZOJ 3754. 【NOI2014】魔法森林
- jzoj3555 【GDKOI2014模拟】树的直径 lca+离线