P8441 旭日东升

维护一个不可重集合的序列 \(a\),长度为 \(n\)。支持以下两种操作:

  • l r x 对于每个 \(l\le i\le r\),将 \(x\) 并入 \(a_i\)。
  • l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合,输出 \(S\) 中所有元素的和。

\(n,m,x\le 10^5,1\le l\le r\le n\)。

\(\color{yellow}{\bigstar\texttt{Trick}}\):连续的不可重集合 \(\rightarrow\) 含有每种颜色的地方以不重叠的区间形式存在,考虑用 ODT 维护区间中是否有这个数。如果我们能在每次操作之后,都将 \([1,n]\) 的区间划分不存在连续的 \(0\) 区间的若干段,那么不含有这个数的区间一定是被完全包含在 \(0\) 区间中

为了实现对区间端点的限制,两位神仙为我们指引了方向!!

\(\texttt{p}\color{red}{\texttt{igstd}}\):这个问题可以转化为矩形加、单点求值,之后想方法实现。

\(\texttt{B}\color{red}{\texttt{uttercake}}\):矩形加、单点求值可以将询问和修改离线按照左端点排序,将操作存储在左端点并用树状数组维护,但常数很小。(update:即将矩形差分后离线处理)

于是你就做完了!!!

此题代码
#define Maxn 100005
int n,m;
ll ans[Maxn];
struct BIT
{ll tree[Maxn];inline void add(int x,ll k){ while(x<=n) tree[x]+=k,x+=x&(-x); }inline ll query(int x){ ll ret=0; while(x) ret+=tree[x],x-=x&(-x); return ret; }
}T;
struct ODT
{int l,r,val;ODT(int L=0,int R=0,int Val=0):l(L),r(R),val(Val){}bool friend operator < (ODT x,ODT y) { return x.l<y.l; }
};
set<ODT> s[Maxn];
struct Operation
{int opt,l,r,val,num;Operation(int Opt=0,int L=0,int R=0,int Val=0,int Num=0):opt(Opt),l(L),r(R),val(Val),num(Num){}bool friend operator < (Operation x,Operation y) { return x.l<y.l; }
};
vector<Operation> op;
inline void add(int l,int r,int val)
{op.emplace_back(0,l,l,val,0);op.emplace_back(0,l,r+1,-val,0);op.emplace_back(0,r+1,l,-val,0);op.emplace_back(0,r+1,r+1,val,0);
}
inline auto split(int opt,int x)
{if(!s[opt].size()) s[opt].emplace(1,n+1,0);auto it=s[opt].lower_bound(ODT(x,0,0));if(it!=s[opt].end() && it->l==x) return it;it--;int l=it->l,r=it->r,val=it->val;if(it->val==0) add(l,r,opt),add(l,x-1,-opt),add(x,r,-opt);s[opt].erase(it);s[opt].emplace(l,x-1,val);return s[opt].emplace(x,r,val).fi;
}
inline void assign(int opt,int l,int r)
{if(!s[opt].size()) s[opt].emplace(1,n+1,0);auto itr=split(opt,r+1),itl=split(opt,l);for(auto it=itl;it!=itr;it++)if(it->val==0) add(it->l,it->r,opt);s[opt].erase(itl,itr);s[opt].emplace(l,r,1);
}
void solve(int ql,int qr)
{if(ql==qr) return;int mid=(ql+qr)>>1;solve(ql,mid),solve(mid+1,qr);int nl=ql;for(int nr=mid+1;nr<=qr;nr++) if(op[nr].opt){while(nl<=mid && op[nl].l<=op[nr].l){ if(op[nl].opt==0) T.add(op[nl].r,op[nl].val); nl++; }ans[op[nr].num]+=T.query(op[nr].r);}for(int i=ql;i<nl;i++) if(op[i].opt==0) T.add(op[i].r,-op[i].val);inplace_merge(op.begin()+ql,op.begin()+mid+1,op.begin()+qr+1);
}
int main()
{n=rd(),m=rd();for(int i=1,opt,l,r,x;i<=m;i++){opt=rd(),l=rd(),r=rd();if(opt==1) x=rd(),assign(x,l,r),ans[i]=-1;else op.emplace_back(1,l,r,0,i),ans[i]=0;}solve(0,op.size()-1);for(int i=1;i<=m;i++) if(ans[i]!=-1) printf("%lld\n",ans[i]);return 0;
}

于是,你已经对二维数点的基本原理有了一定的了解,就让我们来看一看下面这个简单的例子,来吧我们刚刚学到的知识运用到时间中吧。

试试看!(bushi

CF848C Goodbye Souvenir

修改一个元素其实就是删除一个元素后增加一个元素,分别考虑他们的贡献是多好:

设当前下标为 \(x\),上一个这种元素为 \(p\),下一个元素为 \(s\),则:

  • 加入一个元素:

    • \(l\in[1,p],r\in[x,s)\) 区间加上 \(x-p\)。
    • \(l\in(p,x],r\in[s,n]\) 区间加上 \(s-x\)。
  • 删除一个元素:将加法的权值倒过来即可。

我们需要查询的是区间和,即变为了一个矩形加、单点查询问题,离线解决即可。

P4690 [Ynoi2016] 镜中的昆虫

维护一个长为 \(n\) 的序列 \(a_i\),有 \(m\) 次操作。

  • 1 l r x 将区间 \([l,r]\) 的值修改为 \(x\)。
  • 2 l r 询问区间 \([l,r]\) 出现了多少种不同的数,也就是说同一个数出现多次只算一个。

\(1\le n,m\le 10^5,1\le a_i\le 10^9\)。

和上一题不能说差不多,只能说十分相似(bushi

用一个 ODT 维护全局颜色端,对每个颜色再分别维护颜色端。

用矩形加、单点查的套路做,分治解决即可。

P8441 旭日东升(二维数点经典套路)相关推荐

  1. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)

    题目链接 题目大意: 给出一棵树,问有多少条路径权值和不大于www,长度不大于lll 解题思路: 首先树上路径问题大概率就是点分治了 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i) ...

  2. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  3. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  4. P3899 [湖南集训]谈笑风生 主席树解决二维数点

    传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...

  5. LG P4899 [IOI2018] werewolf 狼人(kruskal重构树,二维数点)

    LG P4899 [IOI2018] werewolf 狼人 Solution 我们发现010101限制长这样子: ∃x(minids−>x≥L&maxidx−>e≤R)→1\ex ...

  6. P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

    P2163 [SHOI2007]园丁的烦恼 题意: 在一个二维平面内有一些点,给你一个左上角和右下角的点,问这个范围内有多少点 题解: 二维数点模板题 我们设F(a,b)表示以(0,0)为左下角,(a ...

  7. 【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  8. P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)

    P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb​<deepa​:c 在点 a 的子树中,根据乘法原理计算 ...

  9. F. Paper Grading(Trie树+dfs序+二维数点)

    F. Paper Grading 大佬题解 一般关于前缀的问题基本都是Trie树. 首先将所给字符串建立一棵Trie树,Trie能够解决一个字符串在一个字符串集合中出现的次数,而查询前缀次数只需要找到 ...

最新文章

  1. openGL入门3 --- rasterization pipeline
  2. Windows Phone 7“芒果”更新带来浏览器重大升级:IE Mobile 9
  3. ubuntu 18.04 install gitlab-ce
  4. 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
  5. 如何零基础入门FPGA?这篇文章让你吃透!
  6. python时间序列进行线性插值_Python实现线性插值和三次样条插值
  7. vim中跳到第一行和最后一行
  8. HDU 5176 The Experience of Love 带权并查集
  9. 把uliweb项目变成可安装的python包
  10. 计算机在言语康复的应用,实物交互在言语康复训练中的应用.pdf
  11. 学习 SpringCloud 五大组件后的总结 一
  12. js经典试题之数组与函数
  13. python 操作access数据库
  14. 无线通信基础(二):高斯噪声中的检测
  15. UI自动化测试实战--- app订单、web发货(9)
  16. mySQL 2008安装MOF无法连接_SQL Server 2008安装失败,提示MOF编译器无法连接WMI服务器,该如何解决.谢谢!...
  17. LINUX系统开机后出现assuming drive cache:write through* 无法开机
  18. 爪哇国新游记之二十一----快算24
  19. NOIP-模拟试题之--猴子摘桃
  20. awesome-adb

热门文章

  1. 人工智能培训老师讲师叶梓:计算机视觉领域的自监督学习模型——MAE-4
  2. zj-future03. 快递中转站选址
  3. 【北京迅为】《iTOP-3568开发板快速测试手册》第4章 Buildroot系统功能测试
  4. 水下机器人(rov)小知识(2)
  5. SpringBoot整合IBM MQ,多个队列管理器通信
  6. 中兴盒子 B860AV2.1-T 高安版 烧录固件及教程,当贝桌面带root权限
  7. mac 强制停止进程
  8. 尝试cartographer中使用scan和odom来建图,失败(可能实验室的中继机器人odom有问题)总结
  9. 【华为OD机试真题 python】字符串分割
  10. 虹科激光雷达在车队管理中的应用 ——关于出租车自动泊车