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. ES7.5.2索引生命周期管理(附操作示例)

    一.前言 es可以用来存储日志,一般日志存储只是短期保存,超过一定时间日志要是能自动删除最好,这样保证索引文档不会过多,查询时效性也能得到保证.本文参考的官网地址是:https://www.elast ...

  2. 推荐2款实用的持续集成与部署(CI&CD)自动化工具

    前言 最近DotNetGuide技术社区交流群有不少同学在咨询:持续集成与部署(CI&CD)自动化工具有什么好用的推荐?今天大姚给大家推荐2款实用且免费的持续集成与部署(CI&CD)自 ...

  3. springjdbc处理nvarchar

    当我们使用spring-jdbc来做持久化时(注意不是spring-data-jbc),有时候一些特殊字符存入数据库时会用到nvarchar.nvarchar2这种类型(比如存放化学式,如CO₂等), ...

  4. Go语言中的交互式CLI开发:survey库简介

    在构建命令行工具时,良好的用户交互体验至关重要.尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙.github.com/AlecAivazis/survey/v2 是一个为 ...

  5. sicp每日一题[1.43]

    Exercise 1.43 If f is a numerical function and n is a positive integer, then we can form the nth rep ...

  6. DOM – Web Animation API

    前言 以前写过相关的文章 angular2 学习笔记 ( animation 动画 ).但在项目种很少用到 Web Animation. 体会不到它的精髓,目前的感觉是,它对比 CSS Animati ...

  7. QT硬件通讯基础

    QT硬件通讯基础 使用AI技术辅助生成 1 QT与硬件通讯概述 1.1 QT硬件通讯的基本概念 1.1.1 QT硬件通讯的基本概念 QT硬件通讯的基本概念 QT硬件通讯的基本概念 QT作为一种跨平台的 ...

  8. iManager for K8S 配置https证书流程步骤

    针对10.1及之前版本,需要手动去配置证书,未来版本会考虑进行界面化配置. 一.提前准备 1. 证书需要准备三个文件 *.key *.crt private.pem 2. 如果没有修改iManager ...

  9. Resource Acquisition Is Initialization

    在 C++ 中,资源获取即初始化(RAII, Resource Acquisition Is Initialization)是一种管理资源的编程惯用法.其核心思想是将资源的获取和释放绑定到对象的生命周 ...

  10. VB.NET 在 Windows下通过WIn32API获取CPU和内存的使用率

    .net 要获取CPU和内存的使用率,一般是通过 PerformanceCounter 或者 WMI 查询得到,但是如果操作系统经常不正常断电或者别的什么原因,让系统的性能计数器抽风了,可能就会造成初 ...