小a的排列//首先,乙個區間[?,?]是連續區間當且僅當???v,w−???v,w=?−? 我們維護出每個數出現的位置,即???;表示數x的位置,考慮每次迭帶更新答案。 維護四個變數?,?,??,??分別表示當前區間的左右端點,最大最小值 首先找到[???;,???中的每個數字置的最大最小值來找到下一輪的?,? 接下來不斷擴充當前的?,?,擴充的同時更新??,??,再不斷用新的??,??更新?,?,直到找到一段連 續區間 當找到第乙個滿足條件的區間即為長度最小的區間,實際上長度最小的區間的左右端點只有一種方案, 因為兩段相交的連續區間的交集也是連續區間時間限制: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個整數表示序列內的元素,保證輸入為乙個排列
輸出兩個整數,表示長度最小"萌"區間的左右端點示例15 2 35 2 1 3 4
2 4區間[2,4]=[2,4]=包含了2,32,3且為「萌」區間,可以證明沒有比這更優的方案示例28 3 56 7 1 8 5 2 4 3
5 8保證2⩽n⩽105,1⩽x,y⩽n
#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輸出 按特定順序輸出所有組合。特定順序 每乙個組合中的值從小到大排...