제출 #1040480

#제출 시각아이디문제언어결과실행 시간메모리
1040480prabhu_2020Arranging Tickets (JOI17_arranging_tickets)C++14
0 / 100
2 ms6492 KiB
/*	WHY NOT ?	*/
// #pragma GCC target("popcnt")
#include <bits/stdc++.h> 
using namespace std; 
using namespace std::chrono;
#define endl '\n'
#define mn first
#define mnc second

#define int long long

const int inf = -1e18;
const int N = 200005;
int arr[N]; /* 1 - based indexing  */
int seg[4*N],lazy[4*N];
void build(int node,int ss,int se){
	if(ss == se){
		seg[node] = arr[ss];
		return;
	}
	int mid = (ss + se) / 2;
	build(2 * node,ss,mid);
	build(2 * node + 1,mid + 1,se);
	seg[node] = max(seg[2*node],seg[2*node + 1]);
}
void update(int node,int ss,int se,int l,int r,int val){
	if(lazy[node] != 0){
		int dx = lazy[node];
		lazy[node] = 0;
		seg[node] +=  dx;
		if(se != ss){
			lazy[2*node] += dx;
			lazy[2*node + 1] += dx;
		}
	}
	if(ss > r || se < l){
		return;
	}
	if(ss >= l && se <= r){
		seg[node] += val;
		if(ss != se){
			lazy[2*node] += val;
			lazy[2*node + 1] += val;
		}
		return;
	}
	int mid = (ss + se) / 2;
	update(2*node,ss,mid,l,r,val);
	update(2*node+1,mid+1,se,l,r,val);
	seg[node] = max(seg[2*node],seg[2*node + 1]); 
}
int query_max(int node,int ss,int se,int l,int r){
	
	if(lazy[node] != 0){
		int dx = lazy[node];
		lazy[node] = 0;
		seg[node] += dx;
		if(se != ss){
			lazy[2*node] += dx;
			lazy[2*node + 1] += dx;
		}
	}
	if(ss > r || se < l)	return inf;
	if(ss >= l && se <= r)	return seg[node];
	int mid = (ss + se) / 2;
	int lft = query_max(2*node,ss,mid,l,r);
	int rgt = query_max(2*node + 1,mid+1,se,l,r);
	return max(lft, rgt);
}

void solve(){
	int n,m;
	cin>>n>>m;
	build(1,1,N);
	vector<pair<int,int>> p(m);
	vector<int> c(m,0);
	for(int i=0;i<m;i++){
		cin>>p[i].first>>p[i].second;
		cin>>c[i];
		update(1,1,N,p[i].first,p[i].second-1,c[i]);
	}
	vector<vector<int>> start(n + 1),end(n + 1);
	for(int i=0;i<m;i++){
		start[p[i].first].push_back(i);
		end[p[i].second].push_back(i);
	}
	int ans = query_max(1,1,N,1,N);
	for(int i=0;i<n;i++){
		for(auto j : start[i]){
			update(1,1,N,p[j].first,p[j].second-1,-c[j]);
			update(1,1,N,0,p[j].first - 1,c[j]);
			update(1,1,N,p[j].second,n-1,c[j]);
		}
		for(auto j:end[i]){
			update(1,1,N,p[j].first,p[j].second-1,c[j]);
			update(1,1,N,0,p[j].first-1,-c[j]);
			update(1,1,N,p[j].second,n-1,-c[j]);
		}
		ans = max(ans,query_max(1,1,N,1,N));
	}
	cout<<ans<<endl;
}
signed main(){
	auto begin = std::chrono::high_resolution_clock::now();
    ios_base::sync_with_stdio(0);
    cin.tie(0);
	int t = 1; 
	// cin >> t;
	while(t--){
		solve();
	}
	auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    cerr << "Time measured: " << elapsed.count() * 1e-6 << " miliseconds.\n"; 
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...