P5524 Ynoi2012 NOIP2015 充满了希望

数组开大见祖宗。

思路

不难发现只有询问才会产生贡献,而询问的值来自于距离它最近的且能覆盖这个询问的点的覆盖操作。

可以每个询问操作保存一个 \(pre\) 指向能给这个查询位置赋值的最近的一次覆盖操作的编号。

只有 \(pre\) 在我们的操作序列中,这个位置的查询才可以有贡献(贡献就是覆盖操作赋的值)。

我们把操作离线,按左端点从大到小排序,每次在位置 \(i\) 加入大于当前左端点的 \(pre_i\) 的贡献。

然后区间查询 \([l,r]\) 中贡献的和。

\(pre\) 可以用线段树维护,区间和可以用树状数组维护,总复杂度 \(O(n\log n)\)。

CODE

#include<bits/stdc++.h>
using namespace std; #define lch(p) p*2
#define rch(p) p*2+1
#define ll long long
#define se second
#define fi first const int maxn=1e6+5; inline int read()
{
int a;
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-')
w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0';
ch = getchar();
}
a = s * w;
return a;
}
namespace linetree
{
struct treenode{int lazy,num,l,r;}tr[maxn*4];
inline void push_down(int p)
{
if(tr[p].l==tr[p].r&&tr[p].lazy!=-1) tr[p].num=tr[p].lazy,tr[p].lazy=-1;
else if(tr[p].lazy!=-1)
{
tr[lch(p)].lazy=tr[lch(p)].num=tr[p].lazy;
tr[rch(p)].lazy=tr[rch(p)].num=tr[p].lazy;
tr[p].lazy=-1;
}
}
inline void build(int p,int l,int r)
{
tr[p].l=l,tr[p].r=r;
tr[p].lazy=-1;
if(l==r) return ;
int mid=(l+r)>>1;
build(lch(p),l,mid),build(rch(p),mid+1,r);
}
inline void change(int p,int l,int r,int lx,int rx,int num)
{
if(l>rx||r<lx) return ;
push_down(p);
if(lx<=l&&r<=rx){tr[p].lazy=num;return ;}
int mid=(l+r)>>1;
change(lch(p),l,mid,lx,rx,num);change(rch(p),mid+1,r,lx,rx,num);
}
inline int qry(int p,int l,int r,int pos)
{
push_down(p);
if(l==r) return tr[p].num;
int mid=(l+r)>>1;
if(pos<=mid) return qry(lch(p),l,mid,pos);
else return qry(rch(p),mid+1,r,pos);
}
}
struct treearray
{
#define N 1e6
ll ts[maxn];
inline int lowbit(int x){return x&(-x);}
inline void updata(int x,int y){for(;x<=N;x+=lowbit(x)) ts[x]+=y;}
inline ll getsum(int x){ll sum=0;for(;x;x-=lowbit(x)) sum+=ts[x];return sum;}
}T; int n,m,q;
int pre[maxn],val[maxn]; ll ans[maxn]; struct node{int l,r,id;}qr[maxn]; priority_queue< pair<int,pair<int,int>> >que; inline bool cmp(node a,node b){return a.l>b.l;} signed main()
{
n=read(),m=read(),q=read();
linetree::build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,l,r,x;
op=read();
if(op==1)
{
l=read(),r=read();
int pl=linetree::qry(1,1,n,l),pr=linetree::qry(1,1,n,r);
linetree::change(1,1,n,l,l,pr);
linetree::change(1,1,n,r,r,pl);
}
else if(op==2)
{
l=read(),r=read(),x=read();
linetree::change(1,1,n,l,r,i);
val[i]=x;
}
else
{
// scanf("%d",&x);
x=read();
pre[i]=linetree::qry(1,1,n,x);
val[i]=val[pre[i]];
que.push({pre[i],{i,val[i]}});
}
// for(int j=1;j<=n;j++) cout<<linetree::qry(1,1,n,j)<<" ";
// cout<<"\n";
}
for(int i=1;i<=q;i++)
{
qr[i].l=read(),qr[i].r=read();
qr[i].id=i;
}
sort(qr+1,qr+q+1,cmp);
for(int i=1;i<=q;i++)
{
while(!que.empty())
{
if(que.top().fi>=qr[i].l) T.updata(que.top().se.fi,que.top().se.se),que.pop();
else break;
}
ans[qr[i].id]=T.getsum(qr[i].r)-T.getsum(qr[i].l-1);
}
for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
}

微卡常,须快读。

P5524 Ynoi2012 NOIP2015 充满了希望的更多相关文章

  1. 题解【[Ynoi2012]NOIP2015洋溢着希望】

    \[ \texttt{Preface} \] 第二道 Ynoi 的题,纪念一下. 这可能是我唯一可以自己做的 Ynoi 题了. \[ \texttt{Description} \] 维护一个长度为 \ ...

  2. TypeSDK总体设计思路和架构

    引言:本文旨在提供读者制作一个自己的聚合SDK的思路,抛砖引玉,让更多的读者对聚合SDK有好的理解. 这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代:这是信仰的时期,这是怀疑的时期:这 ...

  3. ASP.NET Core MVC 在linux上的创建及发布

    前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲 ...

  4. 20155217-杨笛-c与java

    命是弱者的借口,运是强者的谦词 你有什么技能比大多数人(超过90%以上)更好? 针对这个技能的获取你有什么成功的经验? 与老师博客中的学习经验有什么共同之处? 其实我经常会去想自己有什么拿得出手的优点 ...

  5. 学术作为一种志业 马克斯·韦伯Max Weber。

    注:原内容来自优酷自频带:梁文道 一千零一夜 学术作为一种志业马克斯·韦伯Max Weber. 韦伯是社会学的三大创始人之一.另外两个,一个是法国的涂尔干,还有一个就是我们中国人都知道的马克思.在其& ...

  6. Jesse Livermore的21句投机至理名言

    1.优秀的投机家们总是在等待,总是有耐心,等待着市场证实他们的判断.要记住,在市场本身的表现证实你的看法之前,不要完全相信你的判断.        2.要想在投机中赚到钱,就得买卖一开始就表现出利润的 ...

  7. grafana+graphit安装笔记

    OS:MAC 10.11查看测试线运行demo请访问http://10.103.13.101:3000/dashboard/db/graphite-carbon-metrics?editorTab=O ...

  8. 看完 《重来(REWORK)》

    最近看完了<重来>这本书,作者是贾森 弗里德,又是一位创业成功人士. 但是从这本书来看,感觉作者更像是一位布道者,极力推荐这本书 <重来——更为简单有效的商业思维>. 公司不一 ...

  9. MS14-025引起的问题 - 2

    5月,微软在13日发布月度安全更新,其中 有KB2871997和 KB2928120两个知识库文章Knowledgeased(而KB2871997甚至不是Security Bulletin).对于无论 ...

  10. 越狱Season 1-Episode 1: the pilot

    the pilot: 美国电视剧新剧开播都会有一个试播来测试观众对新剧的接受程度,以此来决定是否再继续播下去,也可以说是一个开端,第一集,试播 -Tattoo Artist: That's it. t ...

随机推荐

  1. homeassistant自动化记录ping追踪在家联动设备

    2022年8月29日修改代码块 进入hass的配置文件,docker版从portainer中查看配置情况 文件名configuration.yaml 下述添加到最后 # ping根据ip追踪手机 de ...

  2. Mono 现状与未来:从Wine-mono 到.NET 9

    Mono 官网主页[1]和 Mono GitHub 页面今日发布公告[2],微软宣布将 Mono 项目移交给 WineHQ 组织,也就是 Linux 兼容 Windows 应用框架 Wine 的开发团 ...

  3. 编译器实现之旅——第十六章 代码装载、链接器、全局变量与main函数

    在上一章的旅程中,我们已经实现了函数调用的代码生成器分派函数,但在上一章的末尾,我们留下了三个问题: 我们需要为全局变量压栈 main函数需要在程序启动时被自动调用 我们需要实现一个链接器,以将所有的 ...

  4. drawable xx should not reference itself

    背景: 在Android中新增一个xx.xml,在layer-list 的item中设定引入的drawable后,报这个提示(xx不能引用自身) 原因: 这个错误其实很离谱,但是还是有必要记一下,万一 ...

  5. 探索不同引擎Innodb和Myisam的索引优化方案

    数据库可能存在千万级的数据,必须将这些行数据以一定的结构组织起来做到高效的增删改查. 我们将分别探索innodb和myisam两种引擎的索引方案. 一.InnoDB的索引 1.假设表初始没有记录,只有 ...

  6. Playwright 源码 BrowserType

    playwright-java 的 Browser.BrowserContext.Page 挺好理解的,唯独这厮,就有一丢丢 -- package com.microsoft.playwright; ...

  7. C# .net 6 Log4net 安装、配置 以及相关问题处理

    安装log4net 首先下载相关Nuget包 安装的时候注意项目的.net版本,我这里使用的是.net 6 在根目录下面新建一个配置文件 log4net.config,并且添加下面相关配置项目 < ...

  8. Word字体与像素的对应关系

    英文字体的1磅(pt),相当于1/72 英寸(inch),约等于1/2.8mm.12PT的字打印出来约为4.2mm.网页中12px的字才相当于12像素. 虽然 四号=(14/72)*96=18.6px ...

  9. C++面试题整理 2

    8. C++11新特性又哪些 自动类型推导auto,智能指指针(share_ptr,unique_ptr等),for循环简化,线程相关的(std::thread/std::mutex),空指针null ...

  10. 【赵渝强老师】Kafka的体系架构

    一.什么是Kafka? 数据工程中最具挑战性的部分之一是如何从不同点收集和传输大量数据到分布式系统进行处理和分析.需要通过消息队列正确地分离大量数据,因为如果一部分数据无法传送,则可以在系统恢复时传输 ...