1. 程式人生 > >BZOJ 4584: [Apio2016]賽艇

BZOJ 4584: [Apio2016]賽艇

之間 gree detail main max std long NPU nbsp

4584: [Apio2016]賽艇

Time Limit: 70 Sec Memory Limit: 256 MB
[Submit][Status][Discuss]

Description

在首爾城中,漢江橫貫東西。在漢江的北岸,從西向東星星點點地分布著個劃艇學校,編號依次為到。每個學校都 擁有若幹艘劃艇。同一所學校的所有劃艇顏色相同,不同的學校的劃艇顏色互不相同。顏色相同的劃艇被認為是一 樣的。每個學校可以選擇派出一些劃艇參加節日的慶典,也可以選擇不派出任何劃艇參加。如果編號為的學校選擇 派出劃艇參加慶典,那麽,派出的劃艇數量可以在Ai至Bi之間任意選擇(Ai<=Bi)。值得註意的是,編號為i的學 校如果選擇派出劃艇參加慶典,那麽它派出的劃艇數量必須大於任意一所編號小於它的學校派出的劃艇數量。輸入 所有學校的Ai、Bi的值,求出參加慶典的劃艇有多少種可能的情況,必須有至少一艘劃艇參加慶典。兩種情況不同 當且僅當有參加慶典的某種顏色的劃艇數量不同

Input

第一行包括一個整數N,表示學校的數量。接下來N行,每行包括兩個正整數,用來描述一所學校。其中第行包括的

兩個正整數分別表示Ai,Bi(1<=Ai<=Bi<=10^9),N<=500

Output

輸出一行,一個整數,表示所有可能的派出劃艇的方案數除以1,000,000,007得到的余數

Sample Input

2

1 2

2 3

Sample Output

7

HINT

Source

題目鏈接

看dalao博客弄懂的 鏈接

技術分享圖片
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const
long long INF = 1000000007; 6 7 const int MAXN = 510; 8 long long n, p, top, ans; 9 long long inv[MAXN]; 10 long long a[MAXN], b[MAXN], l[MAXN], r[MAXN]; 11 long long h[MAXN + MAXN]; 12 long long C[MAXN], g[MAXN]; 13 map<long long, int> k; 14 15 template <typename tn> void read (tn & a) {
16 tn x = 0, f = 1; char c = getchar(); 17 while (c < 0 || c > 9) { if (c == -) f = -1; c = getchar(); } 18 while (c >= 0 && c <= 9) { x = x * 10 + c - 0; c = getchar(); } 19 a = f == 1 ? x : -x; 20 } 21 22 void get_inv() { 23 inv[1] = 1; 24 for (int i = 2; i <= n; ++i) { 25 inv[i] = - ( inv[INF % i] * (INF / i) ) % INF; 26 while (inv[i] < 0) inv[i] += INF; 27 } 28 } 29 30 int main() { 31 read(n); 32 get_inv(); 33 for (int i = 1; i <= n; ++i) { 34 read(a[i]); 35 read(b[i]); 36 ++b[i]; 37 h[i + i - 1] = a[i]; 38 h[i + i] = b[i]; 39 } 40 sort(h + 1, h + 1 + n + n); 41 top = unique(h + 1, h + n + n + 1) - h - 1; 42 for (int i = 1; i <= top; ++i) { 43 k[h[i]] = i; 44 } 45 for (int i = 1; i <= n; ++i) { 46 l[i] = k[a[i]]; 47 r[i] = k[b[i]]; 48 } 49 // cout << top << "\n"; 50 // for (int i = 1; i <= top; ++i) cout << h[i]<<" "; 51 // for (int i = 1; i <= n; ++i) cout << l[i]<<" "<<r[i]<<"\n"; 52 g[0] = 1; 53 for (int j = 1; j <= top; ++j) { 54 int L = h[j + 1] - h[j]; 55 C[0] = 1; 56 // cerr<<"j = "<<j<<"\n"; 57 for (int i = 1; i <= n; ++i) { 58 C[i] = C[i - 1] * (L + i - 1) % INF * inv[i] % INF; 59 // cerr<<i<<" "<<C[i]<<"\n"; 60 } 61 for (int i = n; i > 0; --i) { 62 if (l[i] <= j && r[i] > j) { 63 long long f = 0, m = 1, c = L; 64 for (int p = i - 1; p >= 0; --p) { 65 f = (f + c * g[p]) % INF; 66 if (l[p] <= j && r[p] >= j + 1) { 67 c = C[++m]; 68 } 69 } 70 g[i] = (g[i] + f) % INF; 71 } 72 } 73 } 74 for (int i = 1; i <= n; ++i) ans = (ans + g[i]) % INF; 75 printf("%lld\n", ans); 76 return 0; 77 }
View Code

BZOJ 4584: [Apio2016]賽艇