제출 #37132

#제출 시각아이디문제언어결과실행 시간메모리
37132Weak123456금 캐기 (IZhO14_divide)C++14
100 / 100
189 ms20976 KiB
#include <bits/stdc++.h>
#define ii pair <int, int>
#define x first
#define y second
#define db(x) cerr << #x << " = " << x << endl;
#define _ << ", " << 

using namespace std;

inline void read(int &x){register int c = getchar();x = 0; int neg = 0;for (;((c<48 || c>57) && c != '-') ;c = getchar());if(c=='-') {neg=1;c=getchar();}for(;c>47 && c<58;c = getchar()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
inline void read(long long &x){register int c = getchar();x = 0; int neg = 0;for (;((c<48 || c>57) && c != '-') ;c = getchar());if(c=='-') {neg=1;c=getchar();}for(;c>47 && c<58;c = getchar()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
inline void writeln(long long x){char buffor[21];register int i=0;int neg=0; if (x<0) {neg=1; x= -x;}do{buffor[i++]=(x%10)+'0';x/=10;} while(x);i--;if (neg) putchar('-');while(i>=0) putchar(buffor[i--]);putchar('\n');}
inline void write(long long x){char buffor[21];register int i=0;int neg=0; if (x<0) {neg=1; x= -x;}do{buffor[i++]=(x%10)+'0';x/=10;} while(x);i--;if (neg) putchar('-');while(i>=0) putchar(buffor[i--]);putchar(' ');}

const int N = 1e5 + 7;
const long long oo = 1e18 + 7;

int n, g;
long long e[N], gg[N];
map <long long, int> mp;
vector <long long> v;

struct mine{
	int x, gold, energy;
}a[N];

struct BIT{
	long long tree[2 * N];

	inline void Init(){
		for (int i = 1; i < 2 * N; i++)
			tree[i] = oo;
	}

	void Update(int x, long long val){
		for (; x <= g; x += (x & (-x)))
			tree[x] = min(tree[x], val);
	}

	long long Query(int x){
		long long res = oo;
		for (; x > 0; x -= (x & (-x)))
			res = min(res, tree[x]);
		return res;
	}
}BIT;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	// freopen("divide.in", "r", stdin);
	// freopen("divide.out", "w", stdout);
	read(n);
	for (int i = 1; i <= n; i++){
		read(a[i].x); read(a[i].gold); read(a[i].energy);
		e[i] = e[i - 1] + a[i].energy;
		gg[i] = gg[i - 1] + a[i].gold;
		v.push_back(e[i - 1] - a[i].x);
		v.push_back(e[i] - a[i].x);
	}
	v.push_back(0);
	sort(v.begin(), v.end());
	mp[v[0]] = g = 1;
	for (int i = 1; i < v.size(); i++)
		if (v[i] != v[i - 1])
			mp[v[i]] = ++g;
	BIT.Init();
	long long res = 0;
	for (int i = 1; i <= n; i++)
		res = max(res, (long long)a[i].gold);
	for (int i = 1; i <= n; i++){
		// cout << e[i] - a[i].x << ' ' << e[i - 1] - a[i].x << endl;
		int x = mp[e[i] - a[i].x];
		int pos = mp[e[i - 1] - a[i].x];
		long long cur = BIT.Query(x);
		// db(x _ pos _ cur _ gg[i]);
		res = max(res, gg[i] - cur);
		BIT.Update(pos, gg[i - 1]);
	}
	writeln(res);
}

컴파일 시 표준 에러 (stderr) 메시지

divide.cpp: In function 'int main()':
divide.cpp:64:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 1; i < v.size(); i++)
                    ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...