NOI 项链工厂

2024-01-06 21:32
文章标签 工厂 noi 项链

本文主要是介绍NOI 项链工厂,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题:NOI 项链工厂

方法:线断树


program necklace;
constmaxn=500000;
varls,rs,s,cl,cr,z:array[1..maxn shl 2]of longint; sto,col,cur:longint; rev:boolean;
procedure update(const x:longint);
begincl[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;
begininc(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);
begincl[x]:=cc; cr[x]:=cc; z[x]:=cc; s[x]:=1;
end;
procedure modify(const x,cc:longint);
beginif 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;
beginif 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;
beginmodify(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)) elseif ll>mid then exit(get(rs[x],mid+1,r,ll,rr)) elseget:=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;
beginmodify(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;
beginmodify(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) elseif 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;
beging:=cur; if not rev then inc(g,x-1) else inc(g,n-x+1);if g>n then dec(g,n);
end;
Beginassign(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 beginif eoln then writeln(s[1]-ord(cl[1]=cr[1])+ord(s[1]=1)) else beginread(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)) elsewriteln(get(1,1,n,1,j)+get(1,1,n,i,n)-ord(cl[1]=cr[1])) elseif (j<=i) then writeln(get(1,1,n,j,i)) elsewriteln(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 beginreadln(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 beginread(i,j,col);i:=g(i);j:=g(j);if (not rev)then if(i<=j) then change(1,1,n,i,j) else beginchange(1,1,n,1,j);change(1,1,n,i,n);end elseif (j<=i) then change(1,1,n,j,i) else beginchange(1,1,n,1,i);change(1,1,n,j,n);end;end;end;close(input);close(output);
end.


这篇关于NOI 项链工厂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577684

相关文章

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

工厂方法模式和抽象工厂模式的区别

区别  工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类可以创建多个具体产品类的实例。    区别: 工厂方法模式只有一个抽象产品类

c++11工厂子类实现自注册的两种方法

文章目录 一、产品类构建1. 猫基类与各品种猫子类2.狗基类与各品种狗子类 二、工厂类构建三、客户端使用switch-case实现调用不同工厂子类四、自注册方法一:公开注册函数显式注册五、自注册方法二:构造函数隐形注册总结 一、产品类构建 1. 猫基类与各品种猫子类 class Cat {public:virtual void Printer() = 0;};class

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

设计模式(1)-- 工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决:主要解决接口选择的问

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

变压器制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

变压器制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型。作为传统制造业的重要组成部分,变压器制造行业也不例外地踏上了数字化转型的快车道。而变压器制造5G智能工厂物联数字孪生平台的出现,更是为这一进程注入了强大的动力,不仅极大地提升了生产效率,还推动了整个行业的智能化、精细化发展。 5G智能工厂,是基于5G通信技术和物联网(IoT)的深度融合而构建的智能制造体系。它利用5G网络的高速度、

发动机制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

发动机制造作为高端制造业的核心领域之一,正积极探索并引领这一变革。其中,发动机制造5G智能工厂物联数字孪生平台的兴起,不仅为发动机制造业注入了新的活力,也为整个制造业的数字化转型树立了新的标杆。发动机制造5G智能工厂物联数字孪生平台,是基于5G通信技术、物联网(IoT)、大数据、人工智能(AI)及数字孪生技术等多领域深度融合的产物。 工业物联网技术将发动机制造工厂内的各类设备、传感器等物体互联互

“设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)都是常见的设计模式,但它们解决的问题和应用场景不同。下面是它们的区别: 1. 目的不同: 工厂模式(Factory Pattern): 工厂模式的主要目的是创建对象。它通过定义一个创建对象的接口,让子类决定实例化哪一个具体类,从而将对象创建的逻辑与使用的代码分离。 工厂模式可以分为简单工厂、工厂方法和抽象