题目描述

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. 《深入理解Java虚拟机》读书笔记:方法调用

      方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作,但前面已经讲过 ...

  2. Jmeter插件PerfMon Metrics Collector安装使用及报错解决

    Jmeter作为一个轻量级的性能测试工具,开源.小巧.灵活的特性使其越来越受到测试人员喜爱.在实际的 项目中,特别是跨地区项目,排除合作方指定要求使用Loadrunner作为性能测试工具外,Jmete ...

  3. 文盘Rust -- 生命周期问题引发的 static hashmap 锁

    2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...

  4. brpc internal

    brpc 内部实现 thread model pthread 1:1atomic cache同步降低性能 fiber n:1 -> nginx 多核难以扩展, 用户不能做阻塞操作. contex ...

  5. 发现了一个可以免费下载jar包的网站,所有jar包都有

    苦苦找不到项目所需要的jar包?发现了一个可以免费下载jar包的网站: https://jar-download.com/ 非常好用. 每个JAR文件都将从官方Maven存储库下载.通过下载所有Mav ...

  6. windows10 jdk下载及环境配置

     一.环境准备 windows10 系统 jdk 各种版本(配置大同小异) 二.下载并安装jdk 下载地址:http://www.oracle.com/technetwork/java/javase/ ...

  7. Ionic3 与Electron制作桌面应用

    Ionic3 与Electron制作桌面应用 原文:https://medium.com/@LohaniDamodar/lets-make-desktop-application-with-ionic ...

  8. MySQL 日志管理、备份与恢复

    MySQL 日志管理.备份与恢复 ---MySQL 日志管理--- MySQL 的日志默认保存位置为 /usr/local/mysql/data vim /etc/my.cnf [mysqld] ## ...

  9. bash: accelerate: command not found

    py AIGC Stable Diffusion文生图Lora模型微调实现虚拟上装详情     实验手册 实验报告   3. 安装Diffusers 进入PAI-DSW开发环境. 登录PAI控制台. ...

  10. Pinely Round 2 (Div. 1 + Div. 2) (CF1863)

    本来开了某场远古 Div 1,然后学了一堆前置知识至今仍然不会 E.换一场写来得及吗? A. Channel 模拟,略. B. Split Sort Description 给你一个长度为 \(n\) ...