답안 #485531

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
485531 2021-11-08T04:31:55 Z Killer2501 3단 점프 (JOI19_jumps) C++14
27 / 100
185 ms 40932 KB
#include<bits/stdc++.h>
#define pll pair<ll, ll>
#define fi first
#define se second
#define pb push_back
#define task "hopscotch"
#define ppl pair<ll, pll>
using namespace std;
using ll = long long;
const int  N = 5e5+55;
const ll mod = 1e15;
const ll base = 350;
const ll inf = 1e12;
ll m, n, t, k, a[N], ans, tong, b[N], c[N], d[N], l[N], r[N], res[N];
vector<pll> adj[N];
vector<ll> kq;
struct BIT
{
    vector<ll> fe;
    ll n;
    BIT(ll _n)
    {
        n = _n;
        fe.resize(n+1, 0);
    }
    void clear()
    {
    	fill(fe.begin(), fe.end(), 0);
    }
    void add(ll id, ll x)
    {
        for(; id <= n; id += id & -id)fe[id] += x;
    }
    void add(ll l, ll r, ll x)
    {
        if(l > r)return;
        add(l, x);
        add(r+1, -x);
    }
    ll get(ll id)
    {
        ll total = 0;
        for(; id; id -= id & -id)total += fe[id];
        return total;
    }
};
struct IT
{
	vector<ll> st, lazy, vi;
	IT(ll _N)
	{
		n = _N;
		st.resize(n*4+4, 0);
		lazy.resize(n*4+4, 0);
		vi.resize(n*4+4, 0);
	}
	void build(ll id, ll l, ll r)
	{
		if(l == r)
		{
			vi[id] = a[l];
			return;
		}
		ll mid = (l+r)/2;
		build(id*2, l, mid);
		build(id*2+1, mid+1, r);
		st[id] = vi[id] = max(vi[id*2], vi[id*2+1]);
	}
	void build()
	{
		build(1, 1, n);
	}
	void down(ll id)
	{
		if(!lazy[id])return;
		st[id*2] = max(st[id*2], vi[id*2] + lazy[id]);
		st[id*2+1] = max(st[id*2+1], vi[id*2+1] + lazy[id]);
		lazy[id*2] = max(lazy[id*2], lazy[id]);
		lazy[id*2+1] = max(lazy[id*2], lazy[id]);
		lazy[id] = 0;
	}
	void update(ll id, ll l, ll r, ll u, ll v, ll x)
	{
		if(u <= l && r <= v)
		{
			st[id] = max(st[id], x+vi[id]);
			lazy[id] = max(lazy[id], x);
			return;
		}
		if(u > r || l > v)return;
		down(id);
		ll mid = (l+r)/2;
		update(id*2, l, mid, u, v, x);
		update(id*2+1, mid+1, r, u, v, x);
		st[id] = max(st[id*2], st[id*2+1]);
	}
	void update(ll l, ll r, ll x)
	{
		if(l > r)return;
		update(1, 1, n, l, r, x);
	}
	ll get(ll id, ll l, ll r, ll u, ll v)
	{
		if(u <= l && r <= v)return st[id];
		if( u > r || l > v)return -inf;
		down(id);
		ll mid = (l+r)/2;
		return max(get(id*2, l, mid, u, v), get(id*2+1, mid+1, r, u, v));
	}
	ll get(ll l, ll r)
	{
		return get(1, 1, n, l, r);
	}
};
vector<pll> v;
struct query
{
	ll l, r, id;
	bool operator < (const query& q)
	{
		return (l > q.l);
	}
}q[N];
void sol()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		while(!kq.empty() && a[kq.back()] < a[i])kq.pop_back();
		if(!kq.empty())v.pb({kq.back(), i});
		kq.pb(i);
	}
	kq.clear();
	for(int i = n; i > 0; i --)
	{
		while(!kq.empty() && a[kq.back()] < a[i])kq.pop_back();
		if(!kq.empty())v.pb({i, kq.back()});
		kq.pb(i);
	}
    cin >> m;
    for(int i = 1; i <= m; i ++)
	{
		cin >> q[i].l >> q[i].r;
		q[i].id = i;
	}
	sort(q+1, q+1+m);
	sort(v.rbegin(), v.rend());
	IT it(n);
	it.build();
	for(int i = 1, j = 0; i <= m; i ++)
	{
		while(j < v.size() && v[j].fi >= q[i].l)
		{
			it.update(v[j].se*2-v[j].fi, n, a[v[j].se]+a[v[j].fi]);
			++j;
		}
		b[q[i].id] = it.get(q[i].l, q[i].r);
	}
	for(int i = 1; i <= m; i ++)cout << b[i] <<'\n';
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if(fopen(task".in", "r"))
    {
        freopen(task".in", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    int ntest = 1;
    //cin >> ntest;
    while(ntest -- > 0)
    sol();
}
/*
5 4
1 2 1
2 3 4
1 4 3
4 3 2
3
1 3 1
1 3 2
1 3 3
*/

Compilation message

jumps.cpp: In function 'void sol()':
jumps.cpp:153:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |   while(j < v.size() && v[j].fi >= q[i].l)
      |         ~~^~~~~~~~~~
jumps.cpp: In function 'int main()':
jumps.cpp:169:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  169 |         freopen(task".in", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:170:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  170 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 11980 KB Output is correct
2 Incorrect 7 ms 12108 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 11980 KB Output is correct
2 Incorrect 7 ms 12108 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 173 ms 40584 KB Output is correct
2 Correct 103 ms 40932 KB Output is correct
3 Correct 92 ms 38992 KB Output is correct
4 Correct 185 ms 40576 KB Output is correct
5 Correct 182 ms 40488 KB Output is correct
6 Correct 177 ms 39968 KB Output is correct
7 Correct 180 ms 39860 KB Output is correct
8 Correct 172 ms 39820 KB Output is correct
9 Correct 183 ms 40152 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 11980 KB Output is correct
2 Incorrect 7 ms 12108 KB Output isn't correct
3 Halted 0 ms 0 KB -