Submission #626097

#TimeUsernameProblemLanguageResultExecution timeMemory
626097errorgornCatfish Farm (IOI22_fish)C++17
100 / 100
757 ms212692 KiB
#include "fish.h"
 
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
#define ii pair<int,int>
#define fi first
#define se second
 
#define puf push_front
#define pof pop_front
#define pub push_back
#define pob pop_back
#define lb lower_bound
#define ub upper_bound
 
#define rep(x,s,e) for (int x=(s)-((s)>(e));x!=(e)-((s)>(e));((s)<(e))?x++:x--)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int) (x).size()
 
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
 
struct node{
	int s,e,m;
	int val=0,lazy=0;
	node *l,*r;
 
	node (int _s,int _e){
		s=_s,e=_e,m=s+e>>1;
 
		if (s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
 
	void propo(){
		if (lazy==0) return;
		val+=lazy;
		if (s!=e){
			l->lazy+=lazy;
			r->lazy+=lazy;
		}
		lazy=0;
	}
 
	void update(int i,int j,int k){
		if (s==i && e==j) lazy+=k;
		else{
			if (j<=m) l->update(i,j,k);
			else if (m<i) r->update(i,j,k);
			else l->update(i,m,k),r->update(m+1,j,k);
 
			l->propo(),r->propo();
			val=max(l->val,r->val);
		}
	}
} *root;
 
int n,m;
vector<ii> arr[100005];
vector<int> pos[100005];
vector<int> w[100005];
 
vector<int> memo[2][2];
 
int max_weights(signed N, signed M, vector<signed> X, vector<signed> Y,
                      vector<signed> W) {
 
 
	n=N,m=M;
	rep(x,0,m) arr[X[x]+1].pub({Y[x],W[x]});
 
	rep(x,0,n+2){
		if (x==0 || x==n+1) arr[x].pub({0,0});
		else arr[x].pub({n+1,0});
		sort(all(arr[x]));
 
		for (auto [a,b]:arr[x]){
			pos[x].pub(a);
			w[x].pub(b);
		}
	}
 
	int a=0,b=1;
	memo[a][0]=memo[a][1]={0};
 
	rep(idx,1,n+2){
		int ss1=sz(pos[idx-1]),ss2=sz(pos[idx]);
		memo[b][0]=vector<int>(ss2,0); //contribution counted
		memo[b][1]=vector<int>(ss2,0); //contribution not counted
 
		rep(i,0,2) rep(j,0,2){
			root=new node(0,ss1-1);
			rep(x,0,ss1) root->update(x,x,memo[a][i][x]);
 
			rep(y,0,sz(pos[idx])) if (j==0){
				int z=ub(all(pos[idx-1]),pos[idx][y])-pos[idx-1].begin();
				if (z<ss1) root->update(z,ss1-1,w[idx][y]);
			}
 
			int z=0;
			rep(y,0,sz(pos[idx])){
				if (i==1){
					while (z<sz(pos[idx-1]) && pos[idx-1][z]<pos[idx][y]){
						root->update(0,z,w[idx-1][z]);
						z++;
					}
				}
 
				root->propo();
				memo[b][j][y]=max(memo[b][j][y],root->val);
 
				if (j==0){
					int z=ub(all(pos[idx-1]),pos[idx][y])-pos[idx-1].begin();
					if (z<ss1) root->update(z,ss1-1,-w[idx][y]);
				}
			}
		}
 
		swap(a,b);
 
		//cout<<"idx: "<<idx<<endl;
		//for (auto it:memo[a][0]) cout<<it<<" "; cout<<endl;
		//for (auto it:memo[a][1]) cout<<it<<" "; cout<<endl;
	}
 
	return memo[a][0][0];
}

Compilation message (stderr)

fish.cpp: In constructor 'node::node(long long int, long long int)':
fish.cpp:30:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |   s=_s,e=_e,m=s+e>>1;
      |               ~^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...