题目描述

LuoTianyi gives you an array $ a $ of $ n $ integers and the index begins from $ 1 $ .

Define $ g(i,j) $ as follows:

  • $ g(i,j) $ is the largest integer $ x $ that satisfies $ {a_p:i\le p\le j}\subseteq{a_q:x\le q\le j} $ while $ i \le j $ ;
  • and $ g(i,j)=0 $ while $ i>j $ .

There are $ q $ queries. For each query you are given four integers $ l,r,x,y $ , you need to calculate $ \sum\limits_{i=l}^{r} \sum\limits_{j=x}^{y} g(i,j) $ .

$ 1\le n,q\le 10^6,1\le a_i\le n, 1\le l\le r\le n, 1\le x\le y\le n $

考虑把答案差分后,扫描线,然后用历史版本和维护答案。

我们现在要尝试在线段树中维护出 \(g(i,r)\),当 \(r->r+1\) 时维护出 \(g\) 的变换,但是这个不好做。

换个方向,从后往前扫,维护 \(g\),此时将 \(g(l,i)\) 转到 \(g(l-1,i)\) 时,设 \(a_{l-1}\) 下一次出现的地方为 \(j\),那么 \([l-1,j]\) 这段区间内的 \(g\) 要覆盖成 \(l-1\)。然后用历史版本和维护答案即可。

题目卡常,要将多个 tag 分别加入。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+5;
int n,T,l[N],r[N],x[N],y[N],nx[N],a[N];
LL ans[N];
vector<pair<int,int> >g[N];
inline int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
s=s*10+ch-48,ch=getchar();
return s;
}
struct node{
int c,tg;
LL s,hs,htg;
}tr[N<<2];
void merge(int o,int l,int r,node z)
{
int c=tr[o].c+z.c,tg=tr[o].tg;
LL s=tr[o].s,hs=tr[o].hs+z.c*tr[o].s+z.htg*(r-l+1),htg=tr[o].htg+z.htg;
if(z.tg)
{
s=z.tg*(r-l+1LL);
tg=z.tg;
}
if(tr[o].tg)
{
htg+=1LL*z.c*tr[o].tg;
c-=z.c;
}
tr[o]=(node){c,tg,s,hs,htg};
}
void addc(int o,int l,int r,int c)
{
if(tr[o].tg)
tr[o].htg+=1LL*c*tr[o].tg;
else
tr[o].c+=c;
tr[o].hs+=c*tr[o].s;
}
void addtg(int o,int l,int r,int tg)
{
tr[o].s=tg*(r-l+1LL);
tr[o].tg=tg;
}
void pushdown(int o,int l,int r)
{
int md=l+r>>1;
if(tr[o].c)
{
addc(o<<1,l,md,tr[o].c);
addc(o<<1|1,md+1,r,tr[o].c);
tr[o].c=0;
}
if(tr[o].tg)
{
addtg(o<<1,l,md,tr[o].tg);
addtg(o<<1|1,md+1,r,tr[o].tg);
tr[o].tg=0;
}
if(tr[o].htg)
{
tr[o<<1].htg+=tr[o].htg;
tr[o<<1].hs+=(md-l+1LL)*tr[o].htg;
tr[o<<1|1].htg+=tr[o].htg;
tr[o<<1|1].hs+=1LL*(r-md)*tr[o].htg;
tr[o].htg=0;
}
}
void update(int o,int l,int r,int x,int y,int tg)
{
if(x<=l&&r<=y)
{
addtg(o,l,r,tg);
return;
}
pushdown(o,l,r);
int md=l+r>>1;
if(md>=x)
update(o<<1,l,md,x,y,tg);
if(md<y)
update(o<<1|1,md+1,r,x,y,tg);
tr[o].s=tr[o<<1].s+tr[o<<1|1].s;
tr[o].hs=tr[o<<1].hs+tr[o<<1|1].hs;
}
LL query(int o,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
return tr[o].hs;
pushdown(o,l,r);
int md=l+r>>1;
LL ret=0;
if(md>=x)
ret+=query(o<<1,l,md,x,y);
if(md<y)
ret+=query(o<<1|1,md+1,r,x,y);
return ret;
}
int main()
{
n=read(),T=read();
for(int i=1;i<=n;i++)
a[i]=read(),nx[i]=n+1;
for(int i=1;i<=T;i++)
{
l[i]=read(),r[i]=read(),x[i]=read(),y[i]=read();
g[l[i]].push_back(make_pair(i,1));
if(r[i]^n)
g[r[i]+1].push_back(make_pair(i,-1));
}
for(int i=n;i>=1;i--)
{
update(1,1,n,i,nx[a[i]]-1,i);
nx[a[i]]=i;
addc(1,1,n,1);
for(int j=0;j<g[i].size();j++)
ans[g[i][j].first]+=g[i][j].second*query(1,1,n,x[g[i][j].first],y[g[i][j].first]);
}
for(int i=1;i<=T;i++)
printf("%lld\n",ans[i]);
}

[CF1824D] LuoTianyi and the Function的更多相关文章

  1. 通过百度echarts实现数据图表展示功能

    现在我们在工作中,在开发中都会或多或少的用到图表统计数据显示给用户.通过图表可以很直观的,直接的将数据呈现出来.这里我就介绍说一下利用百度开源的echarts图表技术实现的具体功能. 1.对于不太理解 ...

  2. jsp中出现onclick函数提示Cannot return from outside a function or method

    在使用Myeclipse10部署完项目后,原先不出错的项目,会有红色的叉叉,JSP页面会提示onclick函数错误 Cannot return from outside a function or m ...

  3. JavaScript function函数种类

    本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...

  4. 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()

    1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...

  5. jquery中的$(document).ready(function() {});

    当文档载入时执行function函数里的代码, 这部分代码主要声明,页面加载后 "监听事件" 的方法.例如: $(document).ready( $("a") ...

  6. Function.prototype.toString 的使用技巧

    Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...

  7. 转:ORA-15186: ASMLIB error function = [asm_open], error = [1], 2009-05-24 13:57:38

    转:ORA-15186: ASMLIB error function = [asm_open], error = [1], 2009-05-24 13:57:38http://space.itpub. ...

  8. [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)

    今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...

  9. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  10. javascript中的Function和Object

    写的很好,理解了很多,特此转发记录 转自:http://blog.csdn.net/tom_221x/archive/2010/02/22/5316675.aspx 在JavaScript中所有的对象 ...

随机推荐

  1. linux 查找目录中的大文件

    find是Linux系统中常用的文件查找命令.它可以在文件系统中查找指定条件的文件,并执行相应的操作.语法格式如下: find [pathname] [options] pathname: 指定查找的 ...

  2. EXE一机一码加密大师1.3.0更新

    EXE一机一码打包加密大师可以打包加密保护EXE文件,同时给EXE文件添加上一机一码认证,或者静态密码,不同的电脑打开加密后的文件需要输入不同的激活码才能正常使用,保护文件安全,方便向用户收费. 1. ...

  3. KRPANO太阳光插件

    KRPano太阳光插件可以在全景项目中添加太阳光特效,如下图所示: 同时,该插件支持可视化编辑 使用说明 1.下载插件,把插件放入skin文件夹里面 2.在tour.xml文件中,添加下面的插件引用 ...

  4. ps--提升字体排版的美感四个有效方法

    一,文字的摆放位置 (字体的选择不要超过三种,分散注意力)

  5. proto转java类时相关option配置

    转载请注明出处: option java_multiple_files = true; 作用和意义:此选项指示生成的 Java 代码将被分割成多个文件而不是一个文件.每个消息类型都会生成一个单独的 J ...

  6. 【稳定性】关于缩短MTTR的探索

    一.什么是 MTTR ? 当系统出现系统故障时,我们需要通过一些指标来衡量故障的严重程度和影响范围.其中MTTR(Mean Time To Repair 名为_平均修复时间_)是一个非常重要的指标,它 ...

  7. [知识管理] Obsidian + Remotely Save插件 + 第三方存储/OSS(七牛云)的同步方案

    0 序言 在几经选择.对比之后,我选择:Obsidian + Remotely Save插件 + 第三方存储/OSS(七牛云) 的方案来搭建自己的[知识管理系统]. 对比分析知识管理工具的过程,详情参 ...

  8. oracle数据库性能监控常用sql

    因执行时间较长建议使用plsql等第三方工具执行 --1.监控sga内存分配信息select * from v$sgainfo;--2.监控每个用户的磁盘io及io命中率select v$sess_i ...

  9. Go 复合类型之切片类型介绍

    Go 复合类型之切片类型 目录 Go 复合类型之切片类型 一.引入 二.切片(Slice)概述 2.1 基本介绍 2.2 特点 2.3 切片与数组的区别 三. 切片声明与初始化 3.1 方式一:使用切 ...

  10. C#堆排序算法

    前言 堆排序是一种高效的排序算法,基于二叉堆数据结构实现.它具有稳定性.时间复杂度为O(nlogn)和空间复杂度为O(1)的特点. 堆排序实现原理 构建最大堆:将待排序数组构建成一个最大堆,即满足父节 ...