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. 组合数取模的几种方法--Exlucas&杨辉三角&组合

    组合数取模的几个方法 求: \[C^{m}_{n} \bmod P \] 1.杨辉三角法 \[C^{m}_{n} = C^{m - 1}_{n - 1} + C^{ m }_{n - 1} \] 时间 ...

  2. hass安装tileboard详细

    首先下载tileboard https://github.com/resoai/TileBoard/releases/download/v2.10.2/TileBoard.zip 下载之后前往hass ...

  3. 增删demo中,React开发中,Vue思维导致的踩坑

    .push等操作,无法监听数据的更新,必须使用setState() state最好写在构造函数中,这是个好习惯 不要什么状态的获取都放在didmount,构造函数里面获取状态也是一个不错的选择

  4. 【LLM训练系列】从零开始训练大模型之Phi2-mini-Chinese项目解读

    一.前言 本文主要是在复现和实践Phi2-mini-Chinese后,简要分析下Phi2-mini-Chinese这个项目,做一个学习实战总结. 原文发布于知乎:https://zhuanlan.zh ...

  5. iOS 屏幕旋转的实践解析

    ​ 摘要:如何更灵活便捷的实现自定义屏幕旋转场景,本文带你揭秘! 文|即构 iOS 应用开发团队 屏幕旋转是在视频直播类 APP 中常见的场景,在即构科技之前发布的 Roomkit SDK 中也有屏幕 ...

  6. Figma 学习笔记 – Component

    参考 Guide to Components in Figma Figma Tutorial: Components - The Basics (Youtube) 定义与用途 Figma 的 Comp ...

  7. SQL Server 中的 NUL 设备/NIL设备

    SQL Server 中的 NUL 设备/NIL设备 在 SQL Server 中,有一个特殊的设备叫做 NUL(注意,不是 NULL),它类似于文件系统中的"黑洞".NUL 设备 ...

  8. 痞子衡嵌入式:JLink命令行以及JFlash对于下载算法的作用地址范围认定

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是JLink命令行以及JFlash对于下载算法的作用地址范围认定. 最近痞子衡在给一个 RT1170 客户定制一个 Infineon Mi ...

  9. APP专项测试之兼容性测试

    1.APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节. APP 兼容性测 ...

  10. 【赵渝强老师】Oracle存储过程中的out参数

    一.什么是存储过程 Oracle存储过程可以说是一个记录集吧,它是由一些PL/SQL语句组成的代码块,这些PL/SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取 ...