紹興一中模擬賽3 13 排列的區間最大值限制

2021-09-12 13:53:27 字數 1987 閱讀 3707

有乙個大小為n(n

≤109

)n(n≤10^9)

n(n≤10

9)的排列和m(m

≤50

)m(m≤50)

m(m≤50

)個限制,每個限制(l,

r,q)

(l,r,q)

(l,r,q

)表示在區間[l,

r]

[l,r]

[l,r

]內的最大值必須是q

qq,問是否存在乙個滿足所有條件的排列

考慮貪心(網路流也可以做,本質是一樣的)

分析「[l,

r]

[l,r]

[l,r

]內的最大值必須是q

qq」這句話,發現①[l

,r

]①[l,r]

①[l,r]

內必須有乙個q

qq,②[l

,r

]②[l,r]

②[l,r]

內所有數必須≤q≤q

≤q1.

1.1.

如果有乙個q

qq對應的所有區間的交集為空,不滿足①

①①(q

qq必須同時在這些區間內)

2.

2.2.

如果在<

q<

q的那些對應區間的並中填1...q−

11...q-1

1...q−

1不能填滿的話,一定有乙個q

qq要填在<

q<

q的某個區間內,不滿足②②②n

nn可以通過離散化解決

複雜度o(t

m2

)o(tm^2)

o(tm2)

(t

tt為資料組數)

#include

using

namespace std;

const

int n=

102;

int len[n]

,mn[n]

,l[n]

,r[n]

,q[n]

,b[n]

,l,r,i,j,k,t,n,m,id[n]

,cnt,tot,c[n]

,las,sum;

bool fl,flag;

bool

cmp(

int x,

int y)

bool

cmp1

(int x,

int y)

intmain()

sort

(b+1

,b+cnt+1)

; cnt=

unique

(b+1

,b+cnt+1)

-b-1

;for

(i=1

;i<=m;i++

)for

(j=1

;j(l[i]-1

<=b[j]

&& b[j+1]

<=r[i]

) mn[j]

=min

(mn[j]

,q[i]);

sort

(id+

1,id+m+

1,cmp)

; flag=1;

for(i=j=

1;i<=m && flag;i=j+1)

if(!flag)

for(i=

1;i) id[i]

=i;sort

(id+

1,id+cnt,cmp1)

;for

(i=1

;i) sum=las=0;

for(i=

1;i<=tot && flag;i++

)puts

(flag?

"possible"

:"impossible");

}}

紹興一中模擬賽3 19 時光流轉

離線以後點分 對於每個點,都用這個點的祖先把這個點的子樹更新一遍,考慮到操作時間早的才能更新晚的和題目中說的 路徑上邊權都大於等於val valva l 那就用樹狀陣列做一下二維偏序就行了 include using namespace std typedef long long ll define...

2020 9 3 NOIP模擬賽 T1 排列

題目鏈結 這是noip良心模擬賽的第一題 求對於任意的 i 滿足 p i i not k 的排列數。n,k le 10 5 首先 k 0 直接錯排數。k 1 考慮容斥。假設我們能算出來 g i 表示欽定 i 個位置不合法的方案數,那麼答案應該是 sum n 1 ig i n i 注意不是二項式反演,...

鐵一中18年8 23模擬賽T1

題意 給你1 n的排列,全部插入雙端佇列,最終佇列必須滿足1的左邊數列遞減,右邊遞增,即乙個v型,再以任意順序全部彈出。問第k個彈出的數為1的方案有多少種 mod 1e9 7 注意,兩個方案當且僅當它們某一次彈出的數不同時視為不同。題解 首先我們要推出個有用的結論來轉化題意,在這裡,我們的重點是每次...