답안 #674796

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
674796 2022-12-26T08:32:29 Z faribourz Fancy Fence (CEOI20_fancyfence) C++14
43 / 100
38 ms 5792 KB
// Only GOD
// believe in yourself
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

#define F first
#define S second
#define pb push_back
#define all(x) x.begin(), x.end()
#define bit(x, y) ((x >> y)&1)
#define sz(x) (int)x.size()
#define kill(x) return cout << x << '\n', void()
#define KILL(x) return cout << x << '\n', 0
#define int ll 
const int N = 1e5+10;
const int INF = 1e9+10;
const int MOD = 1e9+7;
int mul(int a, int b){
	a %= MOD;
	b %= MOD;
	return (a*b)%MOD;
}
int add(int a, int b){
	return (a+b+MOD)%MOD;
}
int dp[N], h[N], w[N], ps[N], psw[N];
int inv;
int f(int n){
	return mul(mul(n, n+1)%MOD, inv)%MOD;
}
int pw(int a, int b){
	int res = 1;
	while(b){
		if(b & 1)
			res = mul(a, res);
		a = mul(a, a);
		b >>= 1;
	}
	return res;
}
int node[N << 1];
void upd(int x, int p){
	p += N;
	node[p] = x;
	p >>= 1;
	for(; p; p >>= 1)
		node[p] = min(node[p*2], node[p*2+1]); 
}
int get(int l, int r){
	int mn = INF;
	l += N, r += N;
	while(l < r){
		if(l&1)
			mn = min(node[l++], mn);
		if(r & 1)
			mn = min(node[--r], mn);
		l >>= 1;
		r >>= 1;
	}
	return mn;
}
int get2(int l, int r, int val){
	if(get(l, r) >= val)
		return -1;
	while(r - l > 1){
		int mid = (l+r)>>1;
		if(get(mid, r) < val)
			l = mid;
		else
			r = mid;
	}
	return l;
}
int32_t main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	for(int i = 0; i < 2*N; i++)
		node[i] = INF;
	int n;
	cin >> n;
	inv = pw(2, MOD-2);
	for(int i = 1; i <= n; i++){
		cin >> h[i];
		upd(h[i], i);
	}
	for(int i = 1; i <= n;i++){
		cin >> w[i];
		psw[i] = psw[i-1]+w[i];
	}
	int ans=0;
	for(int i = 1; i <= n; i++){
		dp[i] = mul(w[i], f(h[i]));
		dp[i] = add(dp[i], mul(f(w[i]-1), f(h[i])));
		if(h[i] < h[i-1]){
			int j = get2(1, i, h[i]);
			if(j==-1){
				ps[i-1] = mul(psw[i-1], f(h[i]));
			}
			else{
				ps[i-1] = add(ps[j], mul(psw[i-1] - psw[j-1], f(h[i])));
			}
		}
		ps[i] = add(mul(w[i], f(h[i])),ps[i-1]);
		int res =0;
		res = ps[i-1];
		dp[i] = add(dp[i], mul(res, w[i]));
		ans = add(ans, dp[i]);
	}
	KILL(ans);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1876 KB Output is correct
2 Incorrect 1 ms 1876 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 1876 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1876 KB Output is correct
2 Correct 2 ms 1876 KB Output is correct
3 Correct 14 ms 3816 KB Output is correct
4 Correct 25 ms 5704 KB Output is correct
5 Correct 26 ms 5792 KB Output is correct
6 Correct 23 ms 5784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1876 KB Output is correct
2 Correct 4 ms 2260 KB Output is correct
3 Correct 14 ms 3852 KB Output is correct
4 Correct 27 ms 5780 KB Output is correct
5 Correct 38 ms 5696 KB Output is correct
6 Correct 1 ms 1876 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1876 KB Output is correct
2 Correct 1 ms 1876 KB Output is correct
3 Correct 4 ms 2260 KB Output is correct
4 Correct 16 ms 3816 KB Output is correct
5 Correct 27 ms 5728 KB Output is correct
6 Correct 29 ms 5676 KB Output is correct
7 Correct 1 ms 1876 KB Output is correct
8 Correct 4 ms 2260 KB Output is correct
9 Correct 15 ms 3796 KB Output is correct
10 Correct 26 ms 5732 KB Output is correct
11 Correct 27 ms 5772 KB Output is correct
12 Correct 1 ms 1876 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1876 KB Output is correct
2 Incorrect 1 ms 1876 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1876 KB Output is correct
2 Incorrect 1 ms 1876 KB Output isn't correct
3 Halted 0 ms 0 KB -