洛谷 P2757 [国家集训队]等差子序列 解题报告
P2757 [国家集训队]等差子序列
题目描述
给一个\(1\)到\(N\)的排列\(\{A_i\}\),询问是否存在
\]
使得\(A_{p_1},A_{p_2},A_{p_3},\cdots,Ap_{Len}\)是一个等差序列。
输入输出格式
输入格式:
输入的第一行包含一个整数\(T\),表示组数。
下接\(T\)组数据,每组第一行一个整数\(N\),每组第二行为一个\(1\)到\(N\)的排列,数字两两之间用空格隔开。
输出格式:
对于每组数据,如果存在一个等差子序列,则输出一行“\(Y\)”,否则输出一行“\(N\)”。
说明
对于\(5\%\)的数据,\(N\le 100\)
对于\(30\%\)的数据,\(N\le 1000\)
对于\(100\%\)的数据,\(N\le 10000,T\le 7\)
思路真不错啊
显然我们只需要考虑\(len=3\)的情况
对于一段连续的位置\([l,r]\),我们定义一端长为\(n\)的\(01\)串表示这个位置上的数的选取集合
比如区间\([l,r]\)的数字分别为\(2351\),而\(n=6\),那么选取集合为\(111010\)
这样是从小到大排列的,我们同样定义一个从大到小排列的。这样刚刚的例子就是\(010111\)了
考虑枚举等差中项,如果当前枚举到的位置为\(i\)
那么如果\(\tt{Ta}\)左边区间的集合从小到大排列的和从大到小排列的相应长度的位置串是相等的,那么它就不可能作为等差中项。
维护\(01\)串相等可以使用\(\tt{bitset}\)可以通过此题。
也可以使用\(Hash+\text{树状数组}\)维护
Code:
#include <cstdio>
#include <cstring>
#define ll long long
const int N=1e4;
const ll mod=1e9+7;
ll po[N+10],s[2][N+10];
int n;
void add(int typ,int x)
{
for(int i=x;i<=n;i+=i&-i)
(s[typ][i]+=po[x])%=mod;
}
ll query(int typ,int x)
{
ll sum=0;
while(x) (sum+=s[typ][x])%=mod,x-=x&-x;
return sum;
}
int main()
{
po[0]=1;int T;
for(int i=1;i<=N;i++) po[i]=po[i-1]*2%mod;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(s,0,sizeof(s));
int flag=0;ll c1,c2;
for(int a,i=1;i<=n;i++)
{
scanf("%d",&a);
int len1=a-1,len2=n-a;
if(len1>len2)//左边多了
{
int d=len1-len2;
c1=query(0,len1)-query(0,d);
(c1+=mod)%=mod;
c2=query(1,len2)*po[d]%mod;
}
else
{
int d=len2-len1;
c1=query(0,len1)*po[d]%mod;
c2=query(1,len2)-query(1,d);
(c2+=mod)%=mod;
}
if(c1!=c2) flag=1;
add(0,a);
add(1,len2+1);
}
if(flag) puts("Y");
else puts("N");
}
return 0;
}
2018.11.7
洛谷 P2757 [国家集训队]等差子序列 解题报告的更多相关文章
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
- 洛谷 P1407 [国家集训队]稳定婚姻 解题报告
P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...
- 洛谷 P1501 [国家集训队]Tree II 解题报告
P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...
- 洛谷 P1527 [国家集训队]矩阵乘法 解题报告
P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...
- 洛谷 P1903 [国家集训队]数颜色 解题报告
P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...
- P2757 [国家集训队]等差子序列
P2757 [国家集训队]等差子序列 题目传送门 推荐一篇好题解 此题要求我们在一个序列中找出一个等差子序列. 显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为 ...
- luogu P2757 [国家集训队]等差子序列
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 洛谷 P1505 [国家集训队]旅游 解题报告
P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游 ...
随机推荐
- dva webpack 利用require.context加载多个model
dva redux数据管理都在models,根据业务不同models可能会有几十甚至上百的 [模块.js], 每次在index.js使用 app.model(require('./models/exa ...
- Android性能测试 | 启动时间篇
[转载]原文地址:http://www.51testing.com/html/93/n-3724593.html 背景介绍 Android用户也许会经常碰到以下的问题: 1)应用后台开着,手机很快没电 ...
- Kotlin的密封(Sealed)类:超强的枚举(KAD 28)
作者:Antonio Leiva 时间:Jun 27, 2017 原文链接:https://antonioleiva.com/sealed-classes-kotlin/ Kotlin的封装类是Jav ...
- Linux命令应用大词典-第12章 程序编译
12.1 gcc:GNU项目的C和C++编译器 12.2 gdberver:为GNU调试的远程服务器 12.3 cmake:跨平台的Makefile生成工具 12.4 indent:更改通过插入或删除 ...
- 前端开发工程师 - 02.JavaScript程序设计 - 第1章.基础篇
第1章--基础篇 JS介绍 html 网页的内容:css 网页的样式:javascript 网页的行为 i.e. hello world <!DOCTYPE html> <html& ...
- (Python爬虫05)完善的爬虫学习大纲
- 167. Add Two Numbers【LintCode by java】
Description You have two numbers represented by a linked list, where each node contains a single dig ...
- LeetCode 104——二叉树中的最大深度
1. 题目 2. 解答 如果根节点为空,直接返回 0.如果根节点非空,递归得到其左右子树的深度,树的深度就为左右子树深度的最大值加 1. /** * Definition for a binary t ...
- [基于NetCore的简单博客系统]-登录
0-项目背景 一个基于.NET CORE RAZOR PAGES的简单博客系统 技术栈全部采用微软官方实现方式,目的是熟悉新技术 项目地址:https://github.com/ganqiyin/BL ...
- iOS开发自定义试图切换
CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transition.timingFu ...