51nod 1934 受限制的排列

2022-05-08 03:57:11 字數 1514 閱讀 8851

這題還要判無解真是難受……

我們發現我們肯定能確定1的位置,1左右的兩個區間是同理的可以確定出最小值的位置

我們把區間最小值看成給乙個區間+1,構建出笛卡爾樹,就求出了每一次取最小值和最小值左右的區間大小

然後就相當於左右子樹的排列方式,乘上把左右子樹那麼多個元素選出左子樹個數和右子樹個數那麼多的方案數,是個普通的組合數

判無解從根開始,要求根的區間是[1,n],左右區間是[1,rt-1][rt + 1,r]遞迴判下去就好

複雜度\(o(n)\)

但是跑得奇慢無比= =,我腦子一抽把陣列改成兩倍居然過了。。。卡著時限過的。。。不想寫fread(懶.jpg)

#include #include #include #include #define enter putchar('\n')

#define space putchar(' ')

#define maxn 2000005

//#define ivorysi

using namespace std;

typedef long long int64;

templatevoid read(t &res)

while(c >= '0' && c <= '9')

res *= f;

}templatevoid out(t x)

if(x >= 10)

putchar('0' + x % 10);

}const int mod = 1000000007;

int n;

int l[maxn],r[maxn],s[maxn],fac[maxn],inv[maxn],invfac[maxn],lc[maxn],rc[maxn],rt;

int sta[maxn],top;

int inc(int a,int b)

int mul(int a,int b)

int c(int n,int m)

bool check(int u,int fa,int l,int r)

else return false;

}int dfs(int u,int l,int r)

void init()

for(int i = 1 ; i <= n ; ++i)

top = 0;int k;

for(int i = 1 ; i <= n ; ++i)

k = top;

while(k >= 1 && s[sta[k]] > s[i]) --k;

if(k + 1 <= top) lc[i] = sta[k + 1];

if(k) rc[sta[k]] = i;

top = k;

sta[++top] = i; }}

void solve()

out(dfs(rt,1,n));enter;

}int main()

}

不能再頹了!還有34天就noi了!

時間太慢了,但是我又怕它太快了

組策略中 受限制的組

在 windows nt 中,資源域所有者通常對加入他們的域的計算機擁有完全控制權,因為他們自動成為他們域中所有計算機上本地 admins 組的乙個成員。在乙個資源 ou 中,域管理員是所有計算機上的本地管理員。要想把對乙個 ou 中的計算機的完全控制權授予資源 ou 管理員,則要使用 受限制的組 ...

6 1 受限制的直接執行

受限制的直接執行 分成兩部分來進行闡述 直接執行 和 受限制的操作 作業系統 程式在程序列表上建立條目 微程式分配記憶體 將程式載入到記憶體 根據 argc ar 設定程式棧 清除暫存器 執行call main 方法 執行main 從main中執行return 釋放程序的記憶體 將pcb從程序列表移...

長度受限制的字串函式

strncpy是c語言中的乙個函式,它的功能是將字串src中最多n個字元複製到字元陣列dest中。它並不像strcpy一樣只有遇到null才停止複製,而是多了乙個條件停止,就是說如果複製到第n個字元還未遇到null,也一樣停止 返回指向dest的指標。注意 當src串長度 dest串長度時,程式仍會...