虽然这道题的题目标签有颜色段均摊和并查集,但是这道题的做法与这两个算法并无关系。

考虑从询问的右往左扫描数组。设\(g_i\)表示以第\(i\)个询问为左端点,最大的\(g_i\)令\(sol(1,n)=sol(i,g_i)\),则\(f_i=m-g_i+1\)。设\(b\)表示执行完编号为\(1\to m\)操作的数组

设\(a_j\)表示扫到\(i\),最大的\(a_j\)使得执行完\(i\to a_j\)的所有操作后\(a_j=b_j\),则答案等于\(\max(a_{1...n})\)。

考虑在左添加一个第\(i\)个操作如何更新\(a_j\)。显然添加一个操作的结果是把\(x_i=b_i\)且\(l_i\leq i\leq r_i\)的所有\(a_i\)都对\(i\)取\(\min\)

考虑把所有数按照\(b_i\)的值分组,并且把每个组内的元素按照在原数组的下标从小到大编号为\(0,1,2,3...\),那么问题转化成:每次对某组的某个区间对\(i\)取\(\min\)(这个区间可以二分求),并且求出所有组的数的最大值。

由于所有组的数的最大值等于所有组的所有数取\(\max\),所以可以设\(h_i\)表示第\(i\)组的最大值,可以在线段树上区间修改求出\(h\)。

\(a_i\)显然随着\(i\)的降低而降低,所以答案随着\(i\)的减小单调递减。且\(x_i\leq 10^6\),所以可以用桶维护\(x_i\)。

然而这道题的空间只有128MB,所以不能用vector存储线段树,而应该用指针和new分配内存,不然会被卡。

#include<bits/stdc++.h>
using namespace std;
#define N 1000010
int n,m,mn[N*4],l[N],r[N],x[N],va[N],ct[N],*g[N],*h[N];
vector<int>v[N];
void mp(int o,int l,int r,int x,int y,int z){
if(r<x||y<l)
return;
if(x<=l&&r<=y){
mn[o]=max(mn[o],z);
return;
}
int md=(l+r)/2;
mp(o*2,l,md,x,y,z);
mp(o*2+1,md+1,r,x,y,z);
}
void pd(int o,int l,int r,int x){
x=max(x,mn[o]);
if(l==r){
va[l]=x;
return;
}
int md=(l+r)/2;
pd(o*2,l,md,x);
pd(o*2+1,md+1,r,x);
}
void pd(int p,int o){
h[p][o*2]=min(h[p][o*2],h[p][o]);
h[p][o*2+1]=min(h[p][o*2+1],h[p][o]);
g[p][o*2]=min(g[p][o*2],h[p][o]);
g[p][o*2+1]=min(g[p][o*2+1],h[p][o]);
}
void mo(int o,int l,int r,int x,int y,int z,int p){
if(r<x||y<l)
return;
if(x<=l&&r<=y){
h[p][o]=z;
g[p][o]=min(g[p][o],z);
return;
}
pd(p,o);
int md=(l+r)/2;
mo(o*2,l,md,x,y,z,p);
mo(o*2+1,md+1,r,x,y,z,p);
g[p][o]=max(g[p][o*2],g[p][o*2+1]);
}
int fd(int o,int l,int r){
if(l==r)
return o;
int md=(l+r)/2;
return max(fd(o*2,l,md),fd(o*2+1,md+1,r));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&l[i],&r[i],&x[i]);
mp(1,1,n,l[i],r[i],x[i]);
}
pd(1,1,n,0);
for(int i=1;i<=n;i++)
v[va[i]].push_back(i);
for(int i=1;i<=m;i++){
l[i]=lower_bound(v[x[i]].begin(),v[x[i]].end(),l[i])-v[x[i]].begin();
r[i]=lower_bound(v[x[i]].begin(),v[x[i]].end(),r[i]+1)-v[x[i]].begin()-1;
}
for(int i=1;i<=1e6;i++)
if(v[i].size()){
int sz=fd(1,0,v[i].size()-1);
g[i]=new int[sz+1];
h[i]=new int[sz+1];
for(int j=0;j<=sz;j++)
g[i][j]=h[i][j]=m+1;
ct[m+1]++;
}
int mx=m+1,lf=0,f;
unsigned int a1=0,a2=0,a3=0;
for(int i=m;i;i--){
if(l[i]>r[i]||!v[x[i]].size())
f=lf;
else{
int sz=v[x[i]].size()-1;
ct[g[x[i]][1]]--;
mo(1,0,sz,l[i],r[i],i,x[i]);
ct[g[x[i]][1]]++;
while(!ct[mx]&&mx)
mx--;
f=m-mx+1;
}
a1^=f*i;
a2+=f*i;
a3+=f;
lf=f;
}
printf("%u %u %u",a3,a1,a2);
}

lg8936题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. js 中常用函数汇总(含示例)

    〇.前言 js 在日常开发中还是比较常用的,本文将常用的 js 方法简单汇总一下,希望对你我有一点帮助. 一.重复 / 延迟操作 1.设置固定时间间隔,重复执行(setInterval(funcRef ...

  2. 使用jquery—Canvas实现html5小游戏——《坦克大战》

    目录 1.项目背景 2.项目展示 3.设计思路 3.1.坦克移动 3.2.坦克开火 3.3.击中坦克 4.实现代码 5.总结 1.项目背景 2021年春节期间在家无聊,正好又学过一些前端的知识,因此就 ...

  3. MongoDB从入门到实战之MongoDB工作常用操作命令

    前言: 上一章节我们快速的在Docker容器中安装了MongoDB,并且通过Navicat MongoDB可视化管理工具快速的连接.创建数据库.集合以及添加了文档数据源.这一章节我们主要是了解一下在日 ...

  4. Linux安装&卸载mysql5.7

    Linux系统下卸载mysql 停止mysql服务 systemctl stop mysqld.service 查看安装的mysql服务 rpm -qa|grep -i mysql 删除安装的mysq ...

  5. 如何指定多个项目的 InternalsVisibleTo

    InternalsVisibleTo 属性允许你指定一个或多个程序集,这些程序集可以访问当前程序集中的内部类型.经常在进行单元测试时使用,例如,你可以在一个项目中定义一个内部类型,然后在另一个项目中进 ...

  6. python之路40 前端之 CSS 标签查询

    表单标签的补充说明 基于form表单发送数据 1.用于获取用户数据的标签至少应该含有name属性 name属性相当于字典的键 用户输入的数据会被保存到标签的value属性中 value属性相当于字典的 ...

  7. P5683 [CSP-J2019 江西] 道路拆除

    简要题意 给你一个 \(m\) 条边 \(n\) 个点的无向图.你需要去掉一些边,使得 \(1 \to s_1,1 \to s_2\) 连通,且 \(1 \to s_1\) 的最短路径长度小于 \(t ...

  8. 【学习笔记】C/C++ 设计模式 - 工厂模式(上)

    介绍说明 在年初七的时候,学习了工厂模式,今天在复习的时候发现漏了几个知识点,因此重写这篇文章,以循环渐进的描述方式来对比不同的使用技巧. 工厂设计模式属于 "创建型设计模式",在 ...

  9. 单细胞转录组实战01: CellRanger7定量

    安装CellRanger cd ~/APP wget -O cellranger-7.1.0.tar.xz "https://cf.10xgenomics.com/releases/cell ...

  10. Solon2 开发之容器,八、动态代理的本质

    在 Java 里动态代理,主要分:接口动态代理 和 类动态代理.因为它的代理类都是动态创建的,所以名字里会带上"动态". 官网的有些地方叫"代理",也有些地方叫 ...