题目描述

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. 《SQL与数据库基础》21. 分库分表(一)

    目录 分库分表(一) 拆分策略 垂直拆分 垂直分库 垂直分表 水平拆分 水平分库 水平分表 技术实现 MyCat概述 概念介绍 环境准备 目录介绍 MyCat入门 配置 分片配置(schema.xml ...

  2. 聊一聊使用Spring事物时不生效的场景

    前言 今天介绍一下Spring事物不生效的场景,事物是我们在项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最 ...

  3. C++算法之旅、06 基础篇 | 第三章 图论

    常用代码模板3--搜索与图论 - AcWing DFS 尽可能往深处搜,遇到叶子节点(无路可走)回溯,恢复现场继续走 数据结构:stack 空间:需要记住路径上的点,\(O(h)\). BFS使用空间 ...

  4. Python从0到1丨详解图像锐化的Sobel、Laplacian算子

    本文分享自华为云社区<[Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel.Laplacian算子实现边缘检测>,作者: eastmount . 一.Sobel算子 So ...

  5. windows下flutter的环境安装

    Flutter是谷歌出品的移动应用SDK,性能卓越.体验精美.跨平台.HotReload等等这些特点. Dart是谷歌推出的编程语言.支持即时编译JIT(Just In Time).HotReload ...

  6. KRPano插件解密大师更新支持最新版KRPano的XML/JS解密

    KRPano插件解密大师是一款专业的全景解密工具,它可以帮助你轻松解密KRPano的XML/JS插件,还能分析下载静态和动态网站的资源.你无需任何编程知识,只需一键点击,就能快速完成解密,学习全景开发 ...

  7. Linux/Unix-CPU-SuperPI-Unixbench性能测试

    测试服务器CPU单核及多核SuperPI圆周率测试real和user值,SuperPI是利用CPU的浮点运算能力来计算出π(圆周率),测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间:及Un ...

  8. oracle的根容器下新建pdb容器及本地用户

    在Oracle12C根容器下,新建pdb,要求根据种子pdb建目的pdb:db_test,配置监听:在目的pdb下建本地用户 首先根据种子pdb新建目的pdb 1.管理员身份登录 C:\WINDOWS ...

  9. mooc第四单元《管理团队》单元测试

    第四单元<管理团队>单元测试 返回 本次得分为:6.00/10.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 判断(2分 ...

  10. 我试图扯掉这条 SQL 的底裤。

    你好呀,我是歪歪. 这次带大家盘一个我觉得有点意思的东西,也是之前写<一个烂分页,踩了三个坑!>这篇文章时,遇到的一个神奇的现象,但是当时忙着做文章搞定这个主线任务,就没有去深究这个支线任 ...