답안 #487275

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
487275 2021-11-15T02:32:33 Z kym Fancy Fence (CEOI20_fancyfence) C++14
25 / 100
38 ms 17496 KB
#include <bits/stdc++.h>
using namespace std;
#define int ll 
#define FOR(i,s,e) for(ll i = s; i <= (ll)e; ++i)
#define DEC(i,s,e) for(ll i = s; i >= (ll)e; --i)
#define IAMSPEED ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef LOCAL
#define db(x) cerr << #x << "=" << x << "\n"
#define db2(x, y) cerr << #x << "=" << x << " , " << #y << "=" << y << "\n"
#define db3(a,b,c) cerr<<#a<<"="<<a<<","<<#b<<"="<<b<<","<<#c<<"="<<c<<"\n"
#define dbv(v) cerr << #v << ":"; for (auto ite : v) cerr << ite << ' '; cerr <<"\n"
#define dbvp(v) cerr << #v << ":"; for (auto ite : v) cerr << "{"  << ite.f << ',' << ite.s << "} "; cerr << "\n"
#define dba(a,ss,ee) cerr << #a << ":"; FOR(ite,ss,ee) cerr << a[ite] << ' '; cerr << "\n"
#define reach cerr << "LINE: " << __LINE__ << "\n";
#else
#define db(x)
#define db2(x,y)
#define db3(a,b,c)
#define dbv(v)
#define dbvp(v)
#define dba(a,ss,ee)
#define reach 
#endif
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ll long long 
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define f first
#define s second
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define g3(x) get<3>(x)
typedef pair <ll, ll> pi;
typedef tuple<ll,ll,ll> ti3;
typedef tuple<ll,ll,ll,ll> ti4;
ll rand(ll a, ll b) { return a + rng() % (b-a+1); }
const int MOD = 1e9 + 7;
const int inf = (int)1e9 + 500;
const long long oo = (ll)1e18 + 500;
template <typename T> void chmax(T& a, const T b) { a=max(a,b); }
template <typename T> void chmin(T& a, const T b) { a=min(a,b); }
const int MAXN = 100005;
int ans;
int H[MAXN], W[MAXN];
int sum[MAXN];
int n;

int rsq(int x, int y) { return (MOD+sum[y] - sum[x-1])%MOD; } 
struct SparseTable {
    vector<vector<int> > ST;
    int N, K;
    SparseTable(int _N, vector<int> a): N(_N) {
        K = MSB(N);
        ST.resize(K);
        ST[0] = a;
        for (int k = 1; k < K; ++k) 
            for (int i = 0; i+(1<<k) <= N; ++i) 
                ST[k].push_back( min(ST[k-1][i], ST[k-1][i+(1<<(k-1))]) ); //min
    }
    
    /* returns most significant bit of an integer */
    inline int MSB(unsigned int x) { return 32-__builtin_clz(x); }
    
    /* Min of range (x, x + 2^k-1) and (y-2^k+1, y) */
    int query(int x, int y) {
		--x;--y;
        int k = MSB(y-x+1) - 1;
        return min(ST[k][x], ST[k][y-(1<<k)+1]);
    }
    
};

int getseq(int st, int en) {
	db2(st,en);
	return (st+en)*(en-st+1)/2;
}

int32_t main() 
{
	IAMSPEED
	vector<int> v;
	cin >> n;
	FOR(i,1,n) cin >> H[i];
	FOR(i,1,n) v.pb(H[i]);
	SparseTable ST=SparseTable(n,v);
	FOR(i,1,n) cin >> W[i];
	FOR(i,1,n) sum[i]=sum[i-1]+W[i], sum[i]%=MOD;
	priority_queue<int> pq;
	set<int> in;
	H[n+1]=0;
	FOR(i,1,n+1) {
		if(in.find(H[i]) != in.end());
		else {
			pq.push(H[i]);
			in.insert(H[i]);
		}
		while(pq.size() && pq.top()>H[i]) {
			int x=pq.top();
			in.erase(pq.top());
			pq.pop();
			//in.erase(pq.top());
			int lo=0,hi=i;
			while(lo<hi-1) {
				int mid=(lo+hi)/2;
				if(ST.query(mid,i-1)>=x) {
					hi=mid;
				} else {
					lo=mid;
				}
			}
			db(hi);
			int sz=rsq(hi,i-1);
			sz%=MOD;
			sz=sz*(sz+1)/2;
			db(sz);
			sz%=MOD;
			int dif=x;
			if(pq.size())dif=x-pq.top();
			db(sz);
			sz*=getseq(x-dif+1,x);
			db(getseq(x-dif+1,x));
			sz%=MOD;
			ans+=sz;
			ans%=MOD;
			db(ans);
		}
	
		db(pq.size());
	}
	cout << ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 18 ms 8512 KB Output is correct
4 Correct 36 ms 17460 KB Output is correct
5 Correct 38 ms 17368 KB Output is correct
6 Correct 34 ms 17496 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 1 ms 460 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct