This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
using namespace std;
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#define MAXN 505
#define MOD 1000000007
long long qa[MAXN],qb[MAXN],cnt[3 * MAXN],bit[12 * MAXN],dp[MAXN][3 * MAXN];
int N;
void update(int x,int v) {
++x;
while(x <= N) {
bit[x] += v;
if(bit[x] >= MOD) bit[x] -= MOD;
x += x & (-x);
}
}
long long getSum(int x) {
long long res = 0;
++x;
while(x > 0) {
res += bit[x];
if(res >= MOD) res -= MOD;
x -= x & (-x);
}
return res;
}
// long long inv(long long a, long long b){
// return 1 < a ? b - inv(b % a,a) * b / a : 1;
// }
// long long inv(long long a) {
// return inv(a,MOD);
// }
int main() {
cin >> N;
set<int> s;
vector<int> v;
for(int i = 0;i < N;++i) {
cin >> qa[i] >> qb[i];
s.insert(qa[i]);
s.insert(qb[i]);
s.insert(qb[i] + 1);
}
for(auto itr = s.begin();itr != s.end();++itr) {
v.push_back(*(itr));
}
long long ans = 0;
for(int i = 0;i < N;++i) {
for(int j = v.size() - 2;j >= 0;--j) {
int curL = v[j];
int curR = v[j + 1] - 1;
if(curL > qb[i] || curR < qa[i]) continue;
dp[i][j] += (getSum(j - 1) * (curR - curL + 1)) % MOD;
if(dp[i][j] >= MOD) dp[i][j] -= MOD;
dp[i][j] += ((cnt[j] * (curR - curL) % MOD) * 500000004) % MOD;
if(dp[i][j] >= MOD) dp[i][j] -= MOD;
++dp[i][j];
if(dp[i][j] == MOD) dp[i][j] -= MOD;
cnt[j] += dp[i][j];
if(cnt[j] >= MOD) cnt[j] -= MOD;
update(j,dp[i][j]);
ans += dp[i][j];
if(ans >= MOD) ans -= MOD;
}
}
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |