NOI 项链工厂

来源:互联网 发布:制作图纸软件 编辑:程序博客网 时间:2024/05/16 14:59

原题:NOI 项链工厂

方法:线断树


program necklace;const    maxn=500000;var    ls,rs,s,cl,cr,z:array[1..maxn shl 2]of longint; sto,col,cur:longint; rev:boolean;procedure update(const x:longint);begin    cl[x]:=cl[ls[x]]; cr[x]:=cr[rs[x]];    s[x]:=s[ls[x]]+s[rs[x]]-ord(cr[ls[x]]=cl[rs[x]]);end;procedure build(var x:longint;const l,r:longint);var mid:longint;begin    inc(sto); x:=sto; mid:=(l+r)>>1;    if l=r then begin read(cl[x]); cr[x]:=cl[x]; s[x]:=1; exit; end;    build(ls[x],l,mid);build(rs[x],mid+1,r); update(x);end;procedure put(const x,cc:longint);begin    cl[x]:=cc; cr[x]:=cc; z[x]:=cc; s[x]:=1;end;procedure modify(const x,cc:longint);begin    if cc=0 then exit;    if ls[x]<>0 then put(ls[x],cc);    if rs[x]<>0 then put(rs[x],cc); z[x]:=0;end;function get_c(const x,l,r,k:longint):longint;var mid:longint;begin    if z[x]<>0 then exit(z[x]); mid:=(l+r)>>1;    if k=l then exit(cl[x]);if k=r then exit(cr[x]);    if k<=mid then exit(get_c(ls[x],l,mid,k));    exit(get_c(rs[x],mid+1,r,k));end;function get(const x,l,r,ll,rr:longint):longint;var mid:longint;begin    modify(x,z[x]); mid:=(l+r)>>1;    if (ll=l)and(rr=r) then exit(s[x]);    if rr<=mid then exit(get(ls[x],l,mid,ll,rr)) else    if ll>mid then exit(get(rs[x],mid+1,r,ll,rr)) else    get:=get(ls[x],l,mid,ll,mid)+get(rs[x],mid+1,r,mid+1,rr)-ord(cr[ls[x]]=cl[rs[x]]);end;procedure change(const x,l,r,k:longint);var mid:longint;begin    modify(x,z[x]);mid:=(l+r)>>1;    if (l=r) then begin cl[x]:=col; cr[x]:=col; exit; end;    if k<=mid then change(ls[x],l,mid,k) else change(rs[x],mid+1,r,k);    update(x);end;procedure change(const x,l,r,ll,rr:longint);var mid:longint;begin    modify(x,z[x]);mid:=(l+r)>>1;    if (l=ll)and(r=rr) then begin put(x,col); exit; end;    if rr<=mid then change(ls[x],l,mid,ll,rr) else    if ll>mid then change(rs[x],mid+1,r,ll,rr) else beginchange(ls[x],l,mid,ll,mid);change(rs[x],mid+1,r,mid+1,rr);    end;update(x);end;var n,m,x,y,i,j:longint;ch:char; tmp_tot:integer;function g(const x:longint):longint;begin    g:=cur; if not rev then inc(g,x-1) else inc(g,n-x+1);    if g>n then dec(g,n);end;Begin    assign(input,'input.txt');reset(input);assign(output,'output.txt');rewrite(output);    readln(n,m); build(x,1,n); readln(m); rev:=false;cur:=1;    for m:=1 to m do beginrepeat read(ch); until ch in ['R','F','P','C','S'];if ch='C' then begin        if eoln then writeln(s[1]-ord(cl[1]=cr[1])+ord(s[1]=1)) else begin    read(ch);read(i,j);i:=g(i);j:=g(j);    if (not rev)then if (i<=j) then writeln(get(1,1,n,i,j)) else    writeln(get(1,1,n,1,j)+get(1,1,n,i,n)-ord(cl[1]=cr[1])) else    if (j<=i) then writeln(get(1,1,n,j,i)) else    writeln(get(1,1,n,1,i)+get(1,1,n,j,n)-ord(cl[1]=cr[1]));end; end else if ch='R' then begin read(x);    if rev then inc(cur,x) else inc(cur,n-x); if cur>n then dec(cur,n);end else if ch='F' then rev:=not revelse if ch='S' then begin    readln(i,j);i:=g(i);j:=g(j);    x:=get_c(1,1,n,i);y:=get_c(1,1,n,j);    if x=y then continue;    col:=y;change(1,1,n,i);col:=x;change(1,1,n,j);end else if ch='P' then begin    read(i,j,col);i:=g(i);j:=g(j);    if (not rev)then if(i<=j) then change(1,1,n,i,j) else begin    change(1,1,n,1,j);change(1,1,n,i,n);end else    if (j<=i) then change(1,1,n,j,i) else begin    change(1,1,n,1,i);change(1,1,n,j,n);end;end;    end;    close(input);close(output);end.


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 职业打假师把我起诉法院怎么办 被职业打假举报了怎么办 车档杆拉不动显示不在p档怎么办 宜人贷还不起了怎么办 买高跟鞋一只脚合适一只脚挤怎么办 脚瘦穿高跟鞋撑不起来怎么办 银川市阅海幼儿园进不去怎么办 考编专业不对口怎么办 北京55中国际部怎么办 初中数学没学好高中怎么办 靴子大了一码怎么办 靴子买大了一码怎么办 马丁靴大了一码怎么办 社保掌上通登录密码忘记怎么办 录微课时忘词怎么办 微课掌上通看不到信息怎么办 五年级学生上课很吵新老师怎么办 跟财务老师吵起来怎么办 qq把微信冻结了怎么办 微信给封号了怎么办 微信久了没登录冻结了怎么办 换手机号了微店怎么办 ai文件置入后都是字怎么办 excel加载项被禁用了怎么办 被期刊网骗了怎么办 发表的文章不想被收录怎么办? 农村长说的眼睛害了怎么办 普通党员不认同领导的决定怎么办 大学读不下去了怎么办 教师因病长期不能上班怎么办 长按win键黑屏了怎么办 巡视组巡视出问题后续怎么办 货运资格证两次没继续教育怎么办 电子注册备案表学信网查不到怎么办 学信网学籍档案没照片怎么办 信访局不给答复怎么办 发票跳了一个号怎么办 报税用的ca证书怎么办 报税u盘丢了怎么办 地税ca证书丢了怎么办 深圳ca证书丢了怎么办