- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Vijos1448校门外的树(树状数组与线段树)
Vijos 1448校门外的树
校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K=1,读入l,r表示在l~r之间种上的一种树
K=2,读入l,r表示询问l~r之间能见到多少种树
(l,r0)
输入 第一行n,m表示道路总长为n,共有m个操作
接下来m行为m个操作
输出 对于每个k=2输出一个答案
样例输入
5 4
1 1 3
2 2 5
1 2 4
2 3 5
样例输出
1
2
括号序列+树状数组
什么是括号序列 下面简单介绍一下(感谢tiger教会我)
假设有一个长度是20的数轴,现在我们要在2 15之间种上一种树,那么我们可以在2处添加一个‘(’,在15的地方添加一个‘)’,这就是简单的括号序列。
? 如果要统计某个区间树的种类,例如 3 10,我们只需要统计10之前(包括10)有多少个‘(’,统计3之前有多少个‘)’,(不包括3)。
? 这样光说可能很难理解,下面给一个实例。
左括号和右括号表示的是在这些区间内种上了树。(日,感觉有点像在画大便)
假设这时候需要统计的是 5 10之间有多少种树,那么,只要在10之前种的树都是有效的(这时候先不管5的限制),也就是统计左括号的个数,一共是6个,下面加上5个限制,也就是说,在5之前,我们统计一下有多少右括号,也就是能与左括号匹配掉的括号有多少个?换句话说,就是有多少种树被限制了(自己意会下把,实在是用文字说不出来);
? 把程序也拿出来晒晒把(脑残的vijos,用writeln6个点超时,用write过了,还9ms)
?
program vijos;
var c1,c2:array[0..50000]of longint;
??? n,m:longint;
function lowbit(x:longint):longint;
? begin
??? lowbit:=x and (x xor (x-1));
? end;
procedure addl(i:longint);
? begin
??? while i=n do
????? begin
??????? inc(c1[i]);
??????? inc(i,lowbit(i));
????? end;
? end;
procedure addr(i:longint);
? begin
??? while i=n do
????? begin
??????? inc(c2[i]);
??????? inc(i,lowbit(i));
????? end;
? end;
function findl(i:longint):longint;
? begin
??? findl:=0;
??? while i0 do
????? begin
??????? inc(findl,c1[i]);
??????? dec(i,lowbit(i));
????? end;
? end;
function findr(i:longint):longint;
? begin
??? findr:=0;
??? while i0 do
????? begin
??????? inc(findr,c2[i]);
??????? dec(i,lowbit(i));
????? end;
? end;
procedure main;
? var i,j,d,k,r,l:longint;
??? begin
????? readln(n,m);
????? for i:=1 to m do
??????? begin
????????? readln(k,l,r);
????????? if k=1 then
??????????? begin
????????????? addl(l);
????????????? addr(r);
??????????? end
????????? else
??????????? begin
????????????? write(findl(r)-findr(l-1));
????????????? writeln;
??????????? end;
??????? end;
??? end;
begin
? main;
end.
?
暑假还写了个线段树的 可以比较一下 (下面的程序我看都不想看了)
program vijos1448;
type rec=record
???? lcount,rcount,be,en:longint;
???? end;
var tree:array[1..200000]of rec;
??? a:array[1..5000]of lo
您可能关注的文档
最近下载
- 全过程造价咨询投资控制目标承诺及保证措施.pdf VIP
- 牛津深圳版五上Unit 9 Around the city 第二课时课件.pptx
- 信息安全数学基础(第二版)裴定一课后习题答案.pdf
- 光电信息科学与工程专业的职业生涯规划 (修正).pptx VIP
- 2022年11月中日友好医院2022年应届毕业生公开招聘(一)笔试参考题库+答案详解.docx
- 三维激光扫描仪使用手册faro scene lt.pdf
- 名著阅读《西游记》练习试题(含答案).pdf VIP
- 华为H12-891 V1.0 HCIE-Datacom认证考试题库资料大全-下(多选、判断题汇总).pdf
- 医学电子书包考试找答案.pdf
- 物业起诉业主不交物业费官司超完美答辩状.doc
文档评论(0)