Submission #25160

#TimeUsernameProblemLanguageResultExecution timeMemory
25160suhgyuho_williamPalembang Bridges (APIO15_bridge)C++14
63 / 100
983 ms12728 KiB
#include <bits/stdc++.h>

#define lld long long
#define pp pair<int,int>
#define pb push_back
#define MOD 10007
#define left lleft
#define right rright
#define INF 2000000000
#define LINF 1000000000000000000LL
#define next nnext

using namespace std;

int N,K,rear,nn;
int tx,ty,tx2,ty2,btx2,bty2,t1,t2;
lld memo,ans,sum,bsum;
lld cnt1,cnt2,cnt3,cnt4;
vector<lld> X;
struct IN{
	int x,y;
}in[100002];
struct data{
	int x,num;
}a[100002],b[100002];
vector<int> Value;
struct SEG{
	lld sum,cnt;
}seg[300002];

void process1(){
	for(int i=1; i<=N; i++){
		sum += (a[i].x+b[i].x-X[0]-X[0]);
		if(a[i].x > X[0]) cnt2++;
	}
	ans = min(ans,sum);
	while(1){
		if(tx == N || a[tx+1].x > X[0]) break;
		tx++;
	}
	for(int i=1; i<X.size(); i++){
		sum += (2*cnt1*(X[i]-X[i-1])); sum -= (2*cnt2*(X[i]-X[i-1]));
		while(1){
			if(tx == N || a[tx+1].x > X[i]) break;
			tx++;
			cnt2--;
		}
		while(1){
			if(ty == N || b[ty+1].x > X[i-1]) break;
			ty++;
			cnt1++; sum += (X[i]-X[i-1])*2;
		}
		ans = min(ans,sum);
	}
}
int change(int x){
	return lower_bound(Value.begin(),Value.end(),x)-Value.begin()+1;
}
SEG getseg(int node,int l,int r,int s,int e){
	if(r < s || e < l || s > e) return {0,0};
	if(s <= l && r <= e) return seg[node];
	int mid = (l+r)/2;
	SEG tmp1,tmp2;
	tmp1 = getseg(node*2,l,mid,s,e);
	tmp2 = getseg(node*2+1,mid+1,r,s,e);
	tmp1.sum += tmp2.sum; tmp1.cnt += tmp2.cnt;
	return tmp1;
}
SEG get2(lld s,lld e){
	int it1,it2;
	it1 = change(s); it2 = change(e+1);
	if(it2 == 1) return {0,0};
	it2--;
	return getseg(1,1,nn,it1,it2);
}
lld get(){
	int mid = X[t1]+X[t2];
	SEG tmp1,tmp2;
	tmp1 = get2((X[t1]+1)*2,mid);
	tmp2 = get2(mid+1,((X[t2]-1)*2));
	lld tsum = 0;
	tsum += (tmp1.sum-tmp1.cnt*2*X[t1]);
	tsum += (tmp2.cnt*2*X[t2]-tmp2.sum);
	return tsum;
}
void update(int x,int add){
	int value = Value[x-1];
	x += (nn-1);
	while(x){
		seg[x].sum += value*add;
		seg[x].cnt += add;
		x /= 2;
	}
}
void addt2(){
	t2++;
    sum -= (2*cnt2*(X[t2]-X[t2-1]));
	btx2 = tx2; bty2 = ty2;
	while(1){
		if(tx2 == N || a[tx2+1].x > X[t2]) break;
		tx2++;
		cnt2--;
	}
	while(1){
		if(ty2 == N || b[ty2+1].x > X[t2-1]) break;
		ty2++;
		if(in[b[ty2].num].x <= X[t1]) continue;
		//segupdate
		update(change(in[b[ty2].num].x+in[b[ty2].num].y),1);
		int x,y;
		x = in[b[ty2].num].x; y = in[b[ty2].num].y;
		sum -= (y-x);
	}
}
void undo(){
	for(int i=bty2+1; i<=ty2; i++){
		if(in[b[i].num].x <= X[t1]) continue;
		//segupdate
		update(change(in[b[i].num].x+in[b[i].num].y),-1);
		int x,y;
		x = in[b[i].num].x; y = in[b[i].num].y;
		sum += (y-x);
	}
	cnt2 += (tx2-btx2);
	tx2 = btx2; ty2 = bty2;
	sum += (2*cnt2*(X[t2]-X[t2-1]));
	t2--;
}

void process2(){
	for(int i=1; i<=N; i++){
		sum += (a[i].x+b[i].x-X[0]-X[0]);
		if(a[i].x > X[0]) cnt2++;
	}
	if(X.size() <= 1){
		ans = sum;
		return;
	}
	while(1){
		if(tx == N || a[tx+1].x > X[0]) break;
		tx++; tx2++;
	}
	while(1){
		if(t2 == X.size()-1) break;
		bsum = sum+get();
		addt2();
		if(sum+get() > bsum){
			undo();
			break;
		}
	}
	ans = min(ans,sum+get());
	while(t1+1 < X.size()-1){
		if(t2 == t1+1) addt2();
		//t1++
		t1++;
		sum += (2*cnt1*(X[t1]-X[t1-1]));
		while(1){
			if(tx == N || a[tx+1].x > X[t1]) break;
			tx++;
			if(in[a[tx].num].y >= X[t2]) continue;
			else{
				//seg update
				update(change(in[a[tx].num].x+in[a[tx].num].y),-1);
				int x,y;
                x = in[a[tx].num].x; y = in[a[tx].num].y;
                sum += (y-x);
			}
		}
		while(1){
			if(ty == N || b[ty+1].x > X[t1-1]) break;
			ty++;
			cnt1++;
			sum += (2*(X[t1]-X[t1-1]));
		}

		while(1){
			if(t2 == X.size()-1) break;
			bsum = sum+get();
			addt2();
			if(sum+get() > bsum){
				undo();
				break;
			}
		}
		ans = min(ans,sum+get());
	}
}

int main(){
    //freopen("input.txt","r",stdin);
	scanf("%d %d",&K,&N);
	for(int i=1; i<=N; i++){
		int x,y;
		char op1,op2;
		scanf("\n%c %d %c %d",&op1,&x,&op2,&y);
		if(x > y) swap(x,y);
		if(op1 == op2) memo += (y-x);
		else{
			rear++;
			a[rear].x = x; a[rear].num = rear;
			b[rear].x = y; b[rear].num = rear;
			X.pb(x); X.pb(y);
			memo++;
			in[rear].x = x; in[rear].y = y;
			Value.pb(x+y);
		}
	}
	N = rear; ans = LINF;
	sort(X.begin(),X.end());
	X.erase(unique(X.begin(),X.end()),X.end());
	sort(Value.begin(),Value.end());
	Value.erase(unique(Value.begin(),Value.end()),Value.end());
	for(nn=1; nn<Value.size(); nn*=2);
	sort(a+1,a+N+1,[&](data &x,data &y){
		return x.x < y.x;
	});
	sort(b+1,b+N+1,[&](data &x,data &y){
		return x.x < y.x;
	});
	if(K == 1) process1();
	else process2();
	ans += memo;
	printf("%lld\n",ans);

	return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'void process1()':
bridge.cpp:41:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1; i<X.size(); i++){
                ^
bridge.cpp: In function 'void process2()':
bridge.cpp:144:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(t2 == X.size()-1) break;
         ^
bridge.cpp:153:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(t1+1 < X.size()-1){
             ^
bridge.cpp:178:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(t2 == X.size()-1) break;
          ^
bridge.cpp: In function 'int main()':
bridge.cpp:214:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(nn=1; nn<Value.size(); nn*=2);
              ^
bridge.cpp:192:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&K,&N);
                      ^
bridge.cpp:196:41: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("\n%c %d %c %d",&op1,&x,&op2,&y);
                                         ^
#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...