首页 > 其他分享 >CF777题解

CF777题解

时间:2023-10-27 15:12:00浏览次数:53  
标签:int 题解 最大值 MAXN 端点 区间 CF777 极长

  • 分析

    先对每一列都做 DP 寻找极长单调不降区间,能够得到若干极长单调不降区间,只要询问的区间是这些区间的子区间,那么说明在这个区间内必有一列的这个区间是单调不降的。

    思考如何快速判断子区间。
    用 \(f_{x}\) 表示以 \(x\) 为所有左端点为 \(x\) 的区间的右端点最大值,那么对于询问区间 \([L,R]\),我们只需要判 \(R \leq f_{L}\) 就可以证明合法,反之则不合法。

    思考如何求 \(f_{x}\) 数组。
    首先 \(f_{x}\) 一定等于所有左端点为 \(x\) 的极长区间的右端点最大值,同时对于左端点小于 \(x\) 的所有极长区间,其右端点的最大值也可以传递给 \(x\)。
    那么我们先求一遍 \(f_x\) 表示所有左端点为 \(x\) 的极长区间的右端点最大值,然后再求一遍前缀最大值表示所有左端点为 \(x\) 的区间的右端点最大值。

    值得注意的是,因为这个数组的二维可能有一维过大,所以要先用一维数组存储,然后再按下标对 \(m\) 取模的模数分类存到 vector 里就可以当成二维数组做了。

  • 代码

#include <iostream>
#include <vector>
using namespace std;
constexpr int MAXN(1000007);
vector <int> e[MAXN];
int r[MAXN], a[MAXN];
int n, m, q;
inline void read(int &temp) { cin >> temp; }
int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	read(n), read(m);
	for (int i(1); i <= n * m; ++i)  read(a[i]);
	for (int j(0); j < m; ++j)  e[j].push_back(0);
	for (int i(1); i <= n * m; ++i)  e[i % m].push_back(a[i]);
	for (int j(0); j < m; ++j) {
		int lst(1);
		for (int i(1); i <= n; ++i)  if (e[j][i] < e[j][i - 1])  r[lst] = max(r[lst], i - 1), lst = i;
		r[lst] = max(r[lst], (int)e[j].size() - 1);
	}
	for (int i(1); i <= n; ++i)  r[i] = max(i, max(r[i - 1], r[i]));
	read(q);
	for (int i(1), L, R; i <= q; ++i) {
		read(L), read(R);
		if (R > r[L])  cout << "No" << endl;
		else  cout << "Yes" << endl;
	}
	return 0;
}

标签:int,题解,最大值,MAXN,端点,区间,CF777,极长
From: https://www.cnblogs.com/Kazdale/p/17792406.html

相关文章

  • ThinkPad OneLink+ Dock扩展坞 多屏幕 黑屏 问题解决
    我的机器是ThinkpadnewS2,扩展坞是ThinkPadOneLink+Dock,操作系统是win10原版。由于工作原因,把笔记本当台式机用。接了两台1920*1080的显示器。用了一段时间后,两台显示器中的其中一台显示器,黑屏,在win10的显示界面,应当有三台显示器,但实际只有两台。类似下图出现这个问题,毫无......
  • 'main' attribute cannot be used in a module that contains top-level code 问题解
    核心是@main注解在main.swift文件中,可以重新命名下参考资料https://stackoverflow.com/questions/73431031/swift-cli-app-main-attribute-cannot-be-used-in-a-module-that-contains-top-leve......
  • CF777A题解
    分析发现操作\(6\)次后就会回到初状态,于是将状态打表,将\(n\bmod6\)即可。代码#include<iostream>usingnamespacestd;constexprintMAXN(1000007);inta[6][3]={ {0,1,2}, {1,0,2}, {1,2,0}, {2,1,0}, {2,0,1}, {0,2,1}};intn,k;inli......
  • 在Jupyter notebooke中安装Nbextensions的问题解决办法
    问题1:使用命令行成功下载,但在Jupyternotebooke中不显示插件解决方案:找了很多方法,看到了一个简单有效的,决定一试,发现找不到路径,借助工具搜索匹配的路径,嘿嘿,找到了,但是匹配出来3个,都加上!再次打开Jupyter,终于看到插件。参考网站:jupyternotebook安装nbextension不显示问题_nbexte......
  • CF888G题解
    分析看到异或不难想到01Trie。不难想到,当两个数的值相等的时候,我们可以当这两个点是一个点,因为连边的费用为\(0\)。那么对于一个序列\(n\),若存在\(m\)种不同的权值,那么在Trie树上子节点数为\(2\)的节点就有\(m-1\)个(因为如果一个数新加进来与所有数都不同,那么一定......
  • P8865 [NOIP2022] 种花 题解
    前言去年多测不清空导致即便CCF放过了我的\(O(n^2m)\)的代码但依然挂成了\(0pts\)。当时看清空数组后能过CCF数据就没再管。时隔\(1\)年,重做这道题写了\(O(nm)\)的正解,终于完成了当年的心愿。\(O(n^2m)\)思路想到计算方案的话可以维护两个数组\(c1_{i,j}\)表......
  • SP4082 MBLAST - BLAST 题解
    几万年前做的dp题了,有亿点点水题意简述求一个字符串添加多少个空格距离最小解法求距离最小,可以考虑动规,其实这题的写法和最长公共子序列的写法类似。我们设\(f(i,j)\)表示\(a[1]\sima[i]\)和\(b[1]\simb[j]\)的距离不加空格的时候为\(f(i,j)=f(i-1,j-1)+\le......
  • [AGC061A] Long Shuffle 题解
    题意给定一个满足\(A_i=i\)的排列\(A\),求对其进行一次\(\mathrm{shuffle}(1,N)\)操作后其第\(K\)项的值。其中\(\mathrm{shuffle}(L,R)\)的定义如下:若\(R=L+1\),那么交换\(A_L\)和\(A_R\)的值否则,依次执行\(\mathrm{shuffle}(L,R-1)\),\(\mathrm{shuffle}(......
  • P4678 [BalticOI 2005] Bus Trip 题解
    P4678[BalticOI2005]BusTrip题解(RE:题解再改造!!)贴码#include<bits/stdc++.h>#defineMAXN500010usingnamespacestd;//ifstreamis("trip.in",ios::in);//ofstreamos("trip.out",ios::out);//#definecinis//#definecoutosintn,m,p,t,tote......
  • [HDU 3483] A Very Simple Problem 题解
    题目描述快速求出下面式子的值:\[\left(\sum\limits_{k=1}^{N}k^{x}x^{k}\right)\bmodM\]其中\(1≤N,M≤2\times10^9\),并且\(1≤x≤50\)。题解(solution)对于该类题目,\(N\)很大,而\(x\)很小,考虑矩阵快速幂优化。对于每一个\(N\)的答案,我们用\(f(N)\)来......