「10.11」chess(DP,组合数学)·array(单调栈)·ants(莫队,并茶几)
菜鸡wwb因为想不出口胡题所以来写题解了
A. chess
昨天晚上考试,有点困
开考先花五分钟扫了一边题,好开始肝$T1$
看了一眼$m$的范围很大,第一反应矩阵快速幂??
$n$很小,那么可以打$n^4$的DP,
$10min$过去了,好像就是一个$DP$啊,随便乘个组合数就好了,
最后距离考试$20min$时,因为瞎取模,把自己的$AC$覆盖了kukukuku
正解的话,首先对于第一列而言,第$1+n$列的放的$C$的个数与他相同
但是因为只知道数目我们乘上组合数就好
$f_{ij}$表示第$i$行,一共放了$j$个棋子的方案数,转移即可
思路积累:
1。快速幂要预处理
2。指数不能取模
3。观察数据范围合理进行递推
B. array
觉得题还是不错的考场想了半个小时想到的
题意:
给出一个序列,每个数有一个权值,求满足$a_{k}\leq a_{j}\leq a_{i}(k\leq j\leq i)$中$k$的最小值
我的做法是维护两个单调栈,一个单调递增,一个单调递减
假设当前单减的栈的只栈顶是$maxtop$,递减的是$mintop$;
对于单减的栈当我们插入$i$后,$st_{maxtop-1}$是左边第一个大于$i$的节点,
所以我们已经满足了第一个条件,
对于第二个条件因为在单增栈中对于任意节点$k$,从它到栈顶的所有值都大于它
因此我们通过$st_{maxtop-1}$直接在单增栈中$upperbound$即可
当然这是考场瞎打水过的,并不是正解。
事实上不用维护第二个栈只需要在每次弹递增栈时记录一个数组$pos_{j}$表示从$j$开始到左侧第一比他大的元素中
权值最小的元素位置,没一段$pos_{j}$都控制一段区域,可以在弹栈中维护。
思路积累:
1.对于区间具有单调性的问题可以考虑单调栈
2.单减的栈保证栈中每个元素到栈首的值都小于等于该元素
单增保证每个元素到栈首的值都大于等于该元素
C. ants
听说是原题,我又没做过......
$50$算法
莫队+线段树,维护区间最长连续区间和
$100$算法
回滚莫队+并查集
第一次接触回滚莫队,莫队大法吼....
简单叙述一下
对于一些问题我们发现对于区间的移动而言加\减的操作很难维护,那么为了比较好的时间复杂度,可以采用回滚莫队
对于该题,他的删数操作我们很难维护区间最大子段和,那么我们开始思考我们令操作中只有加操作即可
那么我们采用分块思想,区间左端点所在块为第一关键字,右端点为第二关键字
bool cmp(no a,no b){return (bel[a.l]==bel[b.l])?(a.r<b.r):(a.l<b.l);}
然后我们选一个块,发现我们先处理出$L-r_{x}$的部分,
也就是说处理出左端点到他所在的块的最右端,然后我们发现对于右端点是单调的
那么我们保持右端点的贡献不清空,每次清空左段点到块的那部分
当然假如两端点在同一块内就直接暴力处理
至于并查集
采用按秩合并思想,然后我们用一个栈记录以前的相连的点,相当与是时间戳一样
然后每次回溯撤销
注意对于右边区间我们要继承上一状态
#include<bits/stdc++.h>
#define int long long
#define MAXN 1100000
using namespace std;
int read(){
char c=getchar();int x=0;
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x;
}
int deep[MAXN],fa[MAXN];int n,m;int a[MAXN];
struct node{
int fa,to;
void insert(int x,int y){fa=x;to=y;}
}T[MAXN];int top=0;
void del(){
while(top){
fa[T[top].to]=T[top].to;
deep[T[top].fa]-=deep[T[top].to];
top--;
}
}
int ans[MAXN];int bel[MAXN];int kuan;int l[MAXN],r[MAXN];
struct no{int l,r,id;}e[MAXN];
int find(int x){
if(fa[x]==0)return 0;
if(fa[x]==x)return x;
return find(fa[x]);
}
bool cmp(no a,no b){return (bel[a.l]==bel[b.l])?(a.r<b.r):(a.l<b.l);}
void init(){
memset(l,0x3f3f3f,sizeof(l));
kuan=sqrt(n);
for(int i=1;i<=n;++i){
int me=(i-1)/kuan+1;
bel[i]=me;
l[me]=min(i,l[me]);
r[me]=max(i,r[me]);
}
}
vector<int>v[MAXN];
int merge(int x,int y,int opt){
if(deep[x]>=deep[y]){
deep[x]+=deep[y];
fa[y]=x;
if(opt)T[++top].insert(x,y);
return deep[x];
}
else{
deep[y]+=deep[x];
fa[x]=y;
if(opt)T[++top].insert(y,x);
return deep[y];
}
}
void work(int x){
int R=r[x];//printf("x=%lld\n",x);
int rs=0;
for(int k=0;k<v[x].size();++k){
int to=v[x][k];
int ll=e[to].l;int rr=e[to].r;
//printf("ll=%lld rr=%lld be=%lld ber=%lld\n",ll,rr,bel[ll],bel[rr]);
if(bel[ll]==bel[rr]){
int maxn=0;
for(int i=ll;i<=rr;++i){
fa[a[i]]=a[i];deep[a[i]]=1;maxn=max(deep[a[i]],maxn);
int fa1=find(a[i]-1);
if(fa1){maxn=max(merge(fa1,a[i],1),maxn);}
int fa2=find(a[i]+1);int me=find(a[i]);
if(fa2){maxn=max(merge(fa2,me,1),maxn);}
}
ans[e[to].id]=maxn;
del();
for(int i=ll;i<=rr;++i)fa[a[i]]=0,deep[a[i]]=0;
}
else{
int maxn=0;
for(int i=R+1;i<=rr;++i){
//printf("work2 a[%lld]=%lld\n",i,a[i]);
fa[a[i]]=a[i];deep[a[i]]=1;maxn=max(deep[a[i]],maxn);
int fa1=find(a[i]-1);
if(fa1){maxn=max(merge(fa1,a[i],0),maxn);rs=max(maxn,rs);}
int fa2=find(a[i]+1);int me=find(a[i]);
if(fa2){maxn=max(merge(fa2,me,0),maxn);rs=max(maxn,rs);}
}
for(int i=ll;i<=r[x];++i){
//printf("work1 a[%lld]=%lld\n",i,a[i]);
fa[a[i]]=a[i];deep[a[i]]=1;maxn=max(deep[a[i]],maxn);
int fa1=find(a[i]-1);
if(fa1){maxn=max(merge(fa1,a[i],1),maxn);}
int fa2=find(a[i]+1);int me=find(a[i]);
if(fa2){maxn=max(merge(fa2,me,1),maxn);}
}
ans[e[to].id]=max(maxn,rs);
del();
R=rr;
for(int i=ll;i<=r[x];++i)fa[a[i]]=0,deep[a[i]]=0;
}
}
for(int i=r[x]+1;i<=R;++i)fa[a[i]]=0,deep[a[i]]=0;
}
signed main(){
//freopen("1.in","r",stdin);
//freopen("w.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;++i){
a[i]=read();
}
init();
for(int i=1;i<=m;++i){
e[i].l=read();e[i].r=read();e[i].id=i;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;++i){int to=e[i].l;v[bel[to]].push_back(i);}
for(int i=1;i<=(n-1)/kuan+1;++i){
if(!v[i].size())continue;
work(i);
}
for(int i=1;i<=m;++i){
printf("%lld\n",ans[i]);
}
}
思路积累
1.回滚莫队处理比较难的区间操作
2.查询区间连续子段长度,可以按秩合并并查集
「10.11」chess(DP,组合数学)·array(单调栈)·ants(莫队,并茶几)的更多相关文章
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- LOJ#3083. 「GXOI / GZOI2019」与或和(单调栈)
题面 传送门 题解 按位考虑贡献,如果\(mp[i][j]\)这一位为\(1\)就设为\(1\)否则设为\(0\),对\(or\)的贡献就是全为\(1\)的子矩阵个数,对\(and\)的贡献就是总矩阵 ...
- 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】
题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...
- 【dp 状态压缩 单调栈】bzoj3591: 最长上升子序列
奇妙的单调栈状压dp Description 给出1~n的一个排列的一个最长上升子序列,求原排列可能的种类数. Input 第一行一个整数n. 第二行一个整数k,表示最长上升子序列的长度. 第三行k个 ...
- 「算法笔记」树形 DP
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...
- BZOJ5125: [Lydsy1712月赛]小Q的书架【决策单调性优化DP】【BIT】【莫队】【分治】
小Q有n本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小Q希望把这一排书分成恰好k段,使得每段至少有一本书,然后把每段按照现在的顺序依次放到k层书架的每一层上去.将所有书都放到 ...
- Powerful array CodeForces - 86D (莫队算法)
An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, a ...
- BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)
题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...
- Educational Codeforces Round 23 D. Imbalanced Array 单调栈
D. Imbalanced Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- 视频格式mkv、mp4、avi、flv、mov、wmv、webm特点和区别
mkv是一种多媒体封装格式,这个封装格式可把多种不同编码的影像及 16 条或以上不同格式的音频和语言不同的字幕封装到一个 Matroska Media 档内. 它也是其中一种开放原始码的多媒体封装格式 ...
- 【odoo】[经验分享]数据迁移注意事项
[odoo14]经典好书学习没有烂尾,主体已完成,可移步了解.https://www.cnblogs.com/xushuotec/p/14428210.html 背景 近期,有朋友打算上odoo系统. ...
- Go的Waitgroup和锁
学 Go 的时候知道 Go 语言支持并发,最简单的方法是通过 go 关键字开启 goroutine 即可.可在工作中,用的是 sync 包的 WaitGroup,然而这样还不够,当多个 gorouti ...
- ZOHO荣登“2020中国ToB行业年度企业影响力”榜单
近日,3WToB行业头条正式揭晓<2020中国ToB行业年度榜单 · 企业影响力榜>. 此次评选,ToB行业头条联合3W集团.50+知名投资机构.60+权威媒体及资深行业人士,进行深度调研 ...
- 使用 CSS perfer-* 规范,提升网站的可访问性与健壮性
文本将介绍 CSS 媒体查询中新增的几个特性功能: prefers-reduced-motion prefers-color-scheme prefers-contrast prefers-reduc ...
- too much recursion
今天在火狐浏览器上调试swagger接口遇到一个浏览器报错: too much recursion 刚开始以为接口出问题了,但是调试之后发现,后台有数据返回,往下一拉,看到了差不多两千多条数据,一下子 ...
- Linux 内存 占用较高问题排查
Linux 内存 占用较高问题排查 niuhao307523005 2019-04-24 14:31:55 11087 收藏 11展开一 查看内存情况#按 k 查看 free #按兆M查看 free ...
- Linux 部署 iSCSI 客户端配置(Windows)
Linux 部署 iSCSI 客户端配置(Windows) 客户端环境 Client :Windows 7 ip :192.168.121.138 一.首先查看客户端本地所有的磁盘 查看路径:邮件计算 ...
- 攻防世界(九)PHP2
攻防世界系列:PHP2 1.打开什么信息也没有. 尝试各种首页index.php index.html 加 [F12]没有结果,最后发现是index.phps .phps文件是什么? phps文件就 ...
- ar是System Activity Reporter(系统活动情况报告)的缩写。这
ar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工具将对系统当前的状态就行取样,然后通过 ...