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. WPF 模仿前端大佬写一个Hover效果

    先看一下效果吧: 原博主的地址:[动画进阶]神奇的卡片 Hover 效果与 Blur 的特性探究 - ChokCoco - 博客园 (cnblogs.com) 原效果是一个css效果,我们采用WPF的 ...

  2. DDD是软件工程的第一性原理?

    本文书接上回<DDD建模后写代码的正确姿势>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视 ...

  3. 关于安装李沐深度学习d2l包报错的解决办法(保姆教程)

    目录 目录:d2l包安装失败的解决过程 前言 一.李沐提供的安装方式 1. 创建一个新的环境 2. 激活 d2l 环境 3. 安装深度学习框架和d2l软件包 3.1 安装PyTorch的CPU或GPU ...

  4. vim命令之多行注释

    vim常用命令之多行注释和多行删除 vim中多行注释和多行删除命令,这些命令也是经常用到的一些小技巧,可以大大提高工作效率. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v, ...

  5. springboot 集成 onlyoffice 实现文档预览、编辑、pdf转化、缩略图生成

    开源地址 https://gitee.com/lboot/lucy-onlyoffice 介绍 lucy-onlyoffice是依赖于onlyoffice的springboot文档预览编辑集成解决方案 ...

  6. VS2022 17.12.0 Preview2版本对Copilot的功能增强

    前提条件,使用最新版的17.12.0 Preview2,并且有有效的Copilot AI订阅,那么可以体验这个新鲜好用的功能 增强了Copilot AI对IEnumerable Visualizer的 ...

  7. 小tips:微信小程序登录后返回登录前的页面继续操作(保留参数)

    在app.js中添加如下两个方法即可: // 设置需要回调的地址 setCallbackUrl: function(mode) { return new Promise((resolve,reject ...

  8. .NET 的 Native AOT 现在是什么样的?

    今天要写的这篇文章源自昨天在朋友圈发的文章<UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化>[1],一位小伙伴的对话让我想全面梳理下Native AO ...

  9. Nuxt Kit 组件管理:注册与自动导入

    title: Nuxt Kit 组件管理:注册与自动导入 date: 2024/9/15 updated: 2024/9/15 author: cmdragon excerpt: Nuxt Kit 为 ...

  10. ChatGPT转发工具-springboot

    背景 国内服务器无法访问openAI接口,我想过有两种实现方式 代理工具类似 tinyproxy.nginx 开发一个转发客户端(java.python都可以实现),提供一个api接口 源码 gith ...