有乙個大小為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 注意,兩個方案當且僅當它們某一次彈出的數不同時視為不同。題解 首先我們要推出個有用的結論來轉化題意,在這裡,我們的重點是每次...