题意:

思路:

预处理出b[i]代表i位置之前比a[i]小的数的个数

以每个数为结尾的组数是线段树中(1,a[i]-1)

对于a[i]换到最后,相当于线段树中(a[i]+1,n)--

交换后b[i]又变成了a[i]-1因为换到最后不需要考虑位置只需要考虑大小关系

 var t:array[..]of record
a,s,l:int64;
end;
a,b:array[..]of longint;
n,m,i:longint;
ans,s:int64; procedure pushdown(p:longint);
var l,r:longint;
tmp:int64;
begin
l:=p<<; r:=l+;
tmp:=t[p].a;
if tmp= then exit;
t[l].a:=t[l].a+tmp;
t[r].a:=t[r].a+tmp;
t[l].s:=t[l].s+t[l].l*tmp;
t[r].s:=t[r].s+t[r].l*tmp;
t[p].a:=;
end; procedure pushup(p:longint);
begin
t[p].s:=t[p<<].s+t[p<<+].s;
end; function query(l,r,x,y,p:longint):int64;
var mid:longint;
begin
if x>y then exit();
if (l>=x)and(r<=y) then exit(t[p].s);
pushdown(p);
mid:=(l+r)>>;
query:=;
if x<=mid then query:=query+query(l,mid,x,y,p<<);
if y>mid then query:=query+query(mid+,r,x,y,p<<+);
pushup(p);
end; procedure update(l,r,x,y,v,p:longint);
var mid:longint;
begin
if x>y then exit;
if (l>=x)and(r<=y) then
begin
t[p].s:=t[p].s+t[p].l*v;
t[p].a:=t[p].a+v;
exit;
end;
pushdown(p);
mid:=(l+r)>>;
if x<=mid then update(l,mid,x,y,v,p<<);
if y>mid then update(mid+,r,x,y,v,p<<+);
pushup(p);
end; procedure build(l,r,p:longint);
var mid:longint;
begin
t[p].l:=r-l+;
if l=r then
begin
t[p].s:=b[l];
exit;
end;
mid:=(l+r)>>;
build(l,mid,p<<);
build(mid+,r,p<<+);
pushup(p);
end; procedure change(l,r,x,v,p:longint);
var mid:longint;
begin
if l=r then
begin
t[p].a:=; t[p].s:=v;
exit;
end;
pushdown(p);
mid:=(l+r)>>;
if x<=mid then change(l,mid,x,v,p<<)
else change(mid+,r,x,v,p<<+);
pushup(p);
end; begin
assign(input,'counter.in'); reset(input);
assign(output,'counter.out'); rewrite(output);
readln(n);
build(,n,);
for i:= to n do
begin
read(a[i]);
b[a[i]]:=query(,n,,a[i]-,);
update(,n,a[i],a[i],,);
end;
fillchar(t,sizeof(t),);
build(,n,);
for i:= to n do
begin
s:=query(,n,,a[i]-,);
ans:=ans+s;
update(,n,a[i]+,n,-,);
s:=a[i]-;
change(,n,a[i],s,);
end;
writeln(ans); close(input);
close(output);
end.

【ZJOI2017 Round1练习】D2T3 counter(线段树)的更多相关文章

  1. 「ZJOI2017」树状数组(二维线段树)

    「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...

  2. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

  3. 【BZOJ4785】[Zjoi2017]树状数组 树套树(二维线段树)

    [BZOJ4785][Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一 ...

  4. ZJOI2017线段树

    ZJOI2017线段树 题意: ​ 给你一颗广义线段树,太长了,自己去看. 题解: ​ 直接上zkw那一套,把闭区间换成开区间,就是把取\([l,r]\),变成取\([l-1,l-1],[r+1,r+ ...

  5. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  6. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  7. 【UOJ295】【ZJOI2017】线段树 倍增

    题目大意 http://uoj.ac/problem/295 题解 考虑像 zkw 线段树一样,从 \([l-1,l-1],[r+1,r+1]\) 这两个区间开始往上跳,直到两个指针碰到一起为止. 先 ...

  8. BZOJ4785 ZJOI2017树状数组(概率+二维线段树)

    可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...

  9. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  10. 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)

    题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...

随机推荐

  1. 定时器、线程queue、进程池和线程池

    1.定时器 指定n秒后,执行任务 from threading import Timer,current_thread import os def hello(): print("%s he ...

  2. VS2015调用低版本lib库出现“无法解析的外部符号 __snprintf ”问题的解决

    VS2015在调用低版本lib库出现有时会出现“无法解析的外部符号 __snprintf ”的问题,解决方法是加入lib库“legacy_stdio_definitions.lib”到工程.

  3. 通过HTML 取得页面、屏幕、浏览器的高度宽度

    一.介绍 1. 容器 一个页面的展示,从外到内的容器为:屏幕.浏览器以及页面本身. HTML元素展现在页面内,页面展现在浏览器内,而浏览器展现在屏幕内. 通过Js的一些对象可以获取这些容器的高度.宽度 ...

  4. TigerGraph REST++API

    简介 - 什么是REST ++? TigerGraph TM 系统使用着名的REpresentational State Transfer(REST)架构来管理与TigerGraph核心组件,图形处理 ...

  5. 秦晓波著的编写高质量代码-改善Java程序的151个建议一书中的线程解释错误.

    位置: 建议127: Lock与synchronized是不一样的 首先在概念上纠正这一篇内容: 援引Java源码中关于ReentrantLock的开篇说明: * A reentrant mutual ...

  6. SQLite -附加数据库

    SQLite -附加数据库 考虑情况下当你有多个数据库可用,您希望使用其中任何一个.SQLite附加DTABASE语句用于选择一个特定的数据库,这个命令之后,所有SQLite语句将执行以下附加数据库. ...

  7. HTML基础(一)

    什么是HTMLHTML Hypertext Markup Language:即超文本标记语言 HTML特点 1.HTML不需要编译,直接由浏览器执行 2.HTML文件是一个文本文件 3.HTML文件必 ...

  8. DI:Defect Index(缺陷率)

    DI:Defect Index(缺陷率) 定义:DI值是衡量软件质量的高低的指标之一. 公式:DI= 致命级别的问题个数*10+严重级别的问题个数*3+一般级别的问题个数*1+提示级别的问题个数*0. ...

  9. Openjudge-4132-四则运算表达式求值

    这一题我们可以通过递归求解,首先我们可以把一个表达式分为三部分,分别是: (1)表达式 :项.加减 (2)项:因子.乘除 (3)因子:数.()表达式 这三项构成了递归的关系,我们可以看到,要求一个表达 ...

  10. 深搜DFS

    POJ-1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...