小a的排列

2021-09-30 19:47:15 字數 1826 閱讀 6164

小a的排列

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

小a有乙個長度為nn的排列。定義一段區間是"萌"的,當且僅當把區間中各個數排序後相鄰元素的差為11

現在他想知道包含數x,yx,y的長度最小的"萌"區間的左右端點

也就是說,我們需要找到長度最小的區間[l,r][l,r],滿足區間[l,r][l,r]是"萌"的,且同時包含數xx和數yy

如果有多個合法的區間,輸出左端點最靠左的方案。

第一行三個整數n,x,yn,x,y,分別表示序列長度,詢問的兩個數

第二行有nn個整數表示序列內的元素,保證輸入為乙個排列

輸出兩個整數,表示長度最小"萌"區間的左右端點
示例1

5 2 3

5 2 1 3 4

2 4
區間[2,4]=[2,4]=包含了2,32,3且為「萌」區間,可以證明沒有比這更優的方案
示例2

8 3 5

6 7 1 8 5 2 4 3

5 8
保證2⩽n⩽105,1⩽x,y⩽n
//首先,乙個區間[?,?]是連續區間當且僅當???v,w−???v,w=?−? 我們維護出每個數出現的位置,即???;表示數x的位置,考慮每次迭帶更新答案。 維護四個變數?,?,??,??分別表示當前區間的左右端點,最大最小值 首先找到[???;,???中的每個數字置的最大最小值來找到下一輪的?,? 接下來不斷擴充當前的?,?,擴充的同時更新??,??,再不斷用新的??,??更新?,?,直到找到一段連 續區間 當找到第乙個滿足條件的區間即為長度最小的區間,實際上長度最小的區間的左右端點只有一種方案, 因為兩段相交的連續區間的交集也是連續區間 

#include#include#include#include#include#include#include#include #include#include#include#include#include#include#includeusing namespace std;

#define pppp cout<='0'&&ch<='9')

ret = ch - '0';

while((ch=getchar())>='0'&&ch<='9')

ret=ret*10+(ch-'0');

return flag ? -ret : ret;

}const int maxn=100005;

int a[maxn];

int pos[maxn];

int main()

int l=pos[x];

int r=pos[y];

if(l>r)

swap(l,r);

int maxn=-1,minn=int_inf;//儲存最大值,最小值

int l=l,r=r;//儲存範圍

for(int i=l;i<=r;++i)//尋找l,r之間的最大值與最小值

for(int i=minn;i<=maxn;++i)//尋找最大值和最小值包含的數的最左區間和最右區間

while(lwhile(rfor(int i=minnn;i<=minn;++i)//更新包含最小值和最大值的區間範圍

for(int i=maxn;i<=maxnn;++i)//更新包含最小值和最大值的區間範圍

minn=minnn;

maxn=maxnn;

}printf("%d %d\n",l,r);

return 0;

}

小a的排列 模擬,思維

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 小a有乙個長度為nn的排列。定義一段區間是 萌 的,當且僅當把區間中各個數排序後相鄰元素的差為11 現在他想知道包含數x,yx,y的長度最小的 萌 區間的左右端點 也就...

排列問題處理小技巧

乙個例子說明問題 反幻方我國古籍很早就記載著 2 9 4 7 5 3 6 1 8 這是乙個三階幻方。每行每列以及對角線上的數字相加都相等。下面考慮乙個相反的問題。可不可以用 1 9 的數字填入九宮格。使得 每行每列每個對角線上的數字和都互不相等呢?這應該能做到。比如 9 1 2 8 4 3 7 5 ...

D的小L排列組合

時間限制 4000 ms 記憶體限制 65535 kb 難度 2 描述 一天tc的匡匡找acm的小l玩三國殺,但是這會小l忙著哩,不想和匡匡玩但又怕匡匡生氣,這時小l給匡匡出了個題目想難倒匡匡 小l很d吧 輸入 第一行輸入乙個數n 0輸出 按特定順序輸出所有組合。特定順序 每乙個組合中的值從小到大排...