戳這裡
通過手玩樣例 , 我們可以發現以下幾條性質:
乙個合法的操作序列,各個操作其實是互不影響的,也就是說,只要我們發現了一組合法的操作序列,那麼它的全排列是都可以的
對於一種排列,有且僅有一種合法的操作集合,因為任意一類操作是無法通過別的其他操作等價替換的
那麼我們將問題轉化成了列舉操作集合,判斷是否可行
然後我們發現從小到大進行每個操作,進行第 \(i\) 種操作後,情況合法當且僅當每 \(2^\) 個數都是單調遞增的
對於樣例而言:
進行第一次操作後的合法情況應該是 :\(7,8,5 ,6,1,2,3,4\)
對於第 \(i\) 種操作,分情況討論:
若沒有需要操作的區間,跳過
若有乙個需要操作的區間,直接修改
若有兩個操作的區間,分 4 種情況進行修改
若有兩個以上的區間不合法,則無解
#includeusing namespace std;
namespace zzc
while (isdigit(ch))
return x*f; }
const int maxn = 4100;
long long n,ans;
long long a[maxn],pw[maxn],fac[maxn];
bool check(int x,int l)
int tmp1=0,tmp2=0;
for(int i=1;i<=pw[n];i+=pw[k])
}if(!tmp1&&!tmp2) dfs(k+1,num);
else if(tmp1&&!tmp2)
else
}} }
void work() }
int main()
洛谷P3322 SDOI2015 排序
小a有乙個1 2n的排列a 1.2n 他希望將a陣列從小到大排序,小a可以執行的操作有n種,每種操作最多可以執行一次,對於所有的 i 1 i n 第i中操作為將序列從左到右劃分為2段,每段恰好包括2個數,然後整體交換其中兩段.小a想知道可以將陣列a從小到 大排序的不同的操作序列有多少個,小a認為兩個...
P1347 排序(拓撲排序)
題目傳送門 這題雖然是一道藍題,但他的資料很小,所以,我們可以每輸入乙個關係就拓撲一次 我們可以把結果分為三種情況 這裡我們可以用拓撲把度清零,記錄每個字母都出現過 並且判斷最長的鏈是多少就行了 即f a i to max f a i to f p h 1 找最長鏈 s max s,f a i to...
洛谷P1347 排序
這個題看到很多人寫topo排序,其實這道題第一眼看更像是乙個差分約束的裸題qwq.令dis x 表示x的相對大小 1是最小,n是最大 顯然,對於乙個關係a 而我們最後要求的就是dis x 的最小值,為了使它們的值都落在1 n之間,我們新建乙個虛擬的點0,並令dis 0 0且dis x dis 0 這...