【做题记录】max-min+1=len 区间计数
(来源:XJ高质量原创题)
原题地址
弱化版:CF526F Pudding Monsters
弱化版
题意:\(n\times n\) 的棋盘上有 \(n\) 颗棋子,每行每列都有且仅有一颗棋子,求出有多少个 \(k\times k\) 的子棋盘也满足每行每列只有一颗棋子。
将棋盘的 \(x\) 轴看作上一题中每个点的下标,\(y\) 轴看作这个点的权值。
其实就是树退化为了链,而 \(m=1\) 的情况。
题意
给定一棵树,每一个点有一个权值 \(a_i\) ,\(\{a\}\) 构成一个排列。
询问有多少个点集 \(S={u_1,u_2,\dots,u_k}(1\le j\le n)\) 满足这些点构成联通块不超过 \(m\) 个,且 \(\max_{1\le i\le k}\{a_{u_{i}}\}-\min_{1\le i\le k}\{a_{u_{i}}\}+1=k\) 。
\(n\le 10^5,m\le 7\)
题解
考虑枚举值域的右端点 \(r\),考虑加入这个右端点时,对与 \([1,r-1]\) 中的最短点的联通块个数的变化。
先假设假设这个点与其他无边相连,那么联通块数加 \(1\) 。
对于每一条与点集中的点相连的边 \((num(r),ver)\) ,都会使左端点在 \([1,val(ver)]\) 中的联通块数量 \(-1\) (\(num(x)\) 表示权值为 \(x\) 的点的编号)。
之后我们就将题意简化为:
区间加上一个数
求出整个数列中 \(\le m\) 的数有多少个
保证 \(a[1]=1\)
考虑到 \(m\) 比较小,猜测答案复杂度为 \(O(nm\log n)\) 。
我们将加减操作同普通的线段树操作,主要改变 \(\text{pushup}\) 操作。
在线段树的每一个节点 \([l,r]\) 上维护:
\(minn\) : 表示在 \([l,r]\) 区间上数的最小值。
\(cnt[7]\) : 表示这段区间内值域在 \([minn,minn+6]\) 之间的数分别有多少。
之后根据两个子区间的最小值就可以愉快地转移啦!!
// Author:A weak man named EricQian
// expect : 100 pts
#include<bits/stdc++.h>
using namespace std;
#define infll 0x7f7f7f7f7f7f7f7f
#define inf 0x3f3f3f3f
#define Maxn 500005
#define Maxm 7
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
int n,m,tot;
int val[Maxn],num[Maxn];
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1];
struct TREE { ll minn,laz,cnt[Maxm]; }tree[Maxn<<2];
ll ans;
inline void add(int x,int y){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot; }
inline void pushup(int p)
{int x=p<<1,y=p<<1|1,tmp;if(tree[x].minn>tree[y].minn) swap(x,y);tree[p].minn=tree[x].minn;for(int i=0;i<m;i++) tree[p].cnt[i]=tree[x].cnt[i];tmp=tree[y].minn-tree[x].minn;for(int i=tmp;i<m;i++) tree[p].cnt[i]+=tree[y].cnt[i-tmp];
}
inline void pushdown(int p)
{tree[p<<1].laz+=tree[p].laz,tree[p<<1].minn+=tree[p].laz;tree[p<<1|1].laz+=tree[p].laz,tree[p<<1|1].minn+=tree[p].laz;tree[p].laz=0;
}
void build(int p,int nl,int nr)
{if(nl==nr) { tree[p].minn=tree[p].cnt[0]=1; return; }int mid=(nl+nr)>>1;build(p<<1,nl,mid),build(p<<1|1,mid+1,nr);pushup(p);
}
void add(int p,int nl,int nr,int l,int r,int k)
{if(nl>=l && nr<=r) { tree[p].minn+=k,tree[p].laz+=k; return; }pushdown(p);int mid=(nl+nr)>>1;if(mid>=l) add(p<<1,nl,mid,l,r,k);if(mid<r) add(p<<1|1,mid+1,nr,l,r,k);pushup(p);
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) val[i]=rd(),num[val[i]]=i;for(int i=1,x,y;i<n;i++) x=rd(),y=rd(),add(x,y),add(y,x);build(1,1,n);for(int r=1;r<=n;r++){if(r!=1) add(1,1,n,1,r-1,1);for(int i=hea[num[r]];i;i=nex[i])if(val[ver[i]]<val[num[r]])add(1,1,n,1,val[ver[i]],-1);for(int i=0;i<m;i++) ans+=tree[1].cnt[i];ans-=(n-r);}printf("%lld\n",ans);return 0;
}
【做题记录】max-min+1=len 区间计数相关推荐
- 退役前的做题记录2.0
退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...
- CSDN 第六期编程竞赛做题记录
CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...
- 退役前的做题记录5.0
退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...
- 2020.7月做题记录
转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
- 退役前的做题记录4.0
退役前的做题记录4.0 最近主要在LOJ上写题 536. 「LibreOJ Round #6」花札 比较显然的二分图博弈模型,先手必胜当且仅当起始点一定在最大匹配中.连边可以对每种颜色以及数字建一个点 ...
- 2020.9月做题记录
八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...
- Regional 做题记录 (50/50)
写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...
- 概率期望题(期望 DP)做题记录
概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...
最新文章
- [PyTorch]一个非常好的抢救outofmemory的方法
- ABAP--如何在选择屏幕上输出ALV GRID报表
- SCRUM 敏捷开发 基础及失败成功案例分析
- access 江苏计算机二级_你与计算机二级证书的距离就差这一篇推送了!
- git 裁切_Vue + ccropper.js裁切图片(vue-cropper)
- jsoup html转义处理,jsoup解析网页出现转义符问题
- 渗透测试入门4之内网跨边界应用
- 解决sqlalchemy连接mysql报错ModuleNotFoundError: No module named ‘pymysql‘
- 为什么要用C语言实现面向对象
- 接口设计的一些小总结
- [Java][Android] 多线程同步-主线程等待所有子线程完成案例
- 【Unity游戏开发基础】如何做可以调整音量的UI滚动条组件
- Ubuntu安装JDK6和JDK5
- EmEditor16免安装破解版
- VM虚拟机BT5下对usb无线网卡的配置
- SpringBoot整合MyBatisPlus(十四)
- 2018 qs计算机排名,2018年QS世界大学学科排名公布 强势围观
- Mina中的多项式承诺方案
- 电驴虚拟服务器常用端口选择,为何我的电驴端口映射成功还是Lowid?
- 邻接表(Adjacency List)
热门文章
- java 异步读写_Java异步与AIO
- sm缩写代表什么意思_pe、PE在电气有代表什么意思,你发现没有,电气技术很有意思...
- netty springmvc_springmvc源码架构解析之HandlerMapping
- Numpy中数组创建函数的辨析
- [EDA] 给出一个状态机,请把它的组合进程分为2个,分别命名为COM1和COM2,其中:COM1实现对外的控制信号输出,COM2实现状态译码。
- Template Method(模板方法)--类行为型模式
- datagridview实时更新数据_旭诺云盒|智能办公新趋势进出口数据自动提取,通关状态实时更新...
- 不要666升级版(数位DP,三次方和)
- P1848 [USACO12OPEN]Bookshelf G(线段树优化 DP)
- 生成函数Euler变换学习笔记(无标号有根树计数)