QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#592392#9222. Price ComboDisplace_RE 0ms0kbC++146.9kb2024-09-26 22:14:062024-09-26 22:14:07

Judging History

This is the latest submission verdict.

  • [2024-09-26 22:14:07]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2024-09-26 22:14:06]
  • Submitted

answer

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double dou;
typedef pair<int,int> pii;
#define fi first
#define se second
#define mapa make_pair
typedef long double ld;
typedef unsigned long long ull;
template <typename T>inline void read(T &x){
	x=0;char c=getchar();bool f=0;
	for(;c<'0'||c>'9';c=getchar()) f|=(c=='-');
	for(;c>='0'&&c<='9';c=getchar())
	x=(x<<1)+(x<<3)+(c^48);
	x=(f?-x:x);
}
const int N=2e5+5;
const ll inf=1e18;
int n;
int a[N], b[N];
int rka[N], rkb[N], px[N], py[N];
inline bool cmp1(int x, int y){return a[x]<a[y];}
inline bool cmp2(int x, int y){return b[x]<b[y];}
struct mat{
	ll a[4][4];
	mat(){
		for(int i=0; i<4; ++i) for(int j=0; j<4; ++j) a[i][j]=inf;
	}
	inline friend mat operator *(mat x, mat y) {
		mat ret;ret.a[0][0]=min(ret.a[0][0], x.a[0][0]+y.a[0][0]);
		ret.a[0][0]=min(ret.a[0][0], x.a[0][1]+y.a[1][0]);
		ret.a[0][0]=min(ret.a[0][0], x.a[0][2]+y.a[2][0]);
		ret.a[0][0]=min(ret.a[0][0], x.a[0][3]+y.a[3][0]);
		ret.a[0][1]=min(ret.a[0][1], x.a[0][0]+y.a[0][1]);
		ret.a[0][1]=min(ret.a[0][1], x.a[0][1]+y.a[1][1]);
		ret.a[0][1]=min(ret.a[0][1], x.a[0][2]+y.a[2][1]);
		ret.a[0][1]=min(ret.a[0][1], x.a[0][3]+y.a[3][1]);
		ret.a[0][2]=min(ret.a[0][2], x.a[0][0]+y.a[0][2]);
		ret.a[0][2]=min(ret.a[0][2], x.a[0][1]+y.a[1][2]);
		ret.a[0][2]=min(ret.a[0][2], x.a[0][2]+y.a[2][2]);
		ret.a[0][2]=min(ret.a[0][2], x.a[0][3]+y.a[3][2]);
		ret.a[0][3]=min(ret.a[0][3], x.a[0][0]+y.a[0][3]);
		ret.a[0][3]=min(ret.a[0][3], x.a[0][1]+y.a[1][3]);
		ret.a[0][3]=min(ret.a[0][3], x.a[0][2]+y.a[2][3]);
		ret.a[0][3]=min(ret.a[0][3], x.a[0][3]+y.a[3][3]);
		ret.a[1][0]=min(ret.a[1][0], x.a[1][0]+y.a[0][0]);
		ret.a[1][0]=min(ret.a[1][0], x.a[1][1]+y.a[1][0]);
		ret.a[1][0]=min(ret.a[1][0], x.a[1][2]+y.a[2][0]);
		ret.a[1][0]=min(ret.a[1][0], x.a[1][3]+y.a[3][0]);
		ret.a[1][1]=min(ret.a[1][1], x.a[1][0]+y.a[0][1]);
		ret.a[1][1]=min(ret.a[1][1], x.a[1][1]+y.a[1][1]);
		ret.a[1][1]=min(ret.a[1][1], x.a[1][2]+y.a[2][1]);
		ret.a[1][1]=min(ret.a[1][1], x.a[1][3]+y.a[3][1]);
		ret.a[1][2]=min(ret.a[1][2], x.a[1][0]+y.a[0][2]);
		ret.a[1][2]=min(ret.a[1][2], x.a[1][1]+y.a[1][2]);
		ret.a[1][2]=min(ret.a[1][2], x.a[1][2]+y.a[2][2]);
		ret.a[1][2]=min(ret.a[1][2], x.a[1][3]+y.a[3][2]);
		ret.a[1][3]=min(ret.a[1][3], x.a[1][0]+y.a[0][3]);
		ret.a[1][3]=min(ret.a[1][3], x.a[1][1]+y.a[1][3]);
		ret.a[1][3]=min(ret.a[1][3], x.a[1][2]+y.a[2][3]);
		ret.a[1][3]=min(ret.a[1][3], x.a[1][3]+y.a[3][3]);
		ret.a[2][0]=min(ret.a[2][0], x.a[2][0]+y.a[0][0]);
		ret.a[2][0]=min(ret.a[2][0], x.a[2][1]+y.a[1][0]);
		ret.a[2][0]=min(ret.a[2][0], x.a[2][2]+y.a[2][0]);
		ret.a[2][0]=min(ret.a[2][0], x.a[2][3]+y.a[3][0]);
		ret.a[2][1]=min(ret.a[2][1], x.a[2][0]+y.a[0][1]);
		ret.a[2][1]=min(ret.a[2][1], x.a[2][1]+y.a[1][1]);
		ret.a[2][1]=min(ret.a[2][1], x.a[2][2]+y.a[2][1]);
		ret.a[2][1]=min(ret.a[2][1], x.a[2][3]+y.a[3][1]);
		ret.a[2][2]=min(ret.a[2][2], x.a[2][0]+y.a[0][2]);
		ret.a[2][2]=min(ret.a[2][2], x.a[2][1]+y.a[1][2]);
		ret.a[2][2]=min(ret.a[2][2], x.a[2][2]+y.a[2][2]);
		ret.a[2][2]=min(ret.a[2][2], x.a[2][3]+y.a[3][2]);
		ret.a[2][3]=min(ret.a[2][3], x.a[2][0]+y.a[0][3]);
		ret.a[2][3]=min(ret.a[2][3], x.a[2][1]+y.a[1][3]);
		ret.a[2][3]=min(ret.a[2][3], x.a[2][2]+y.a[2][3]);
		ret.a[2][3]=min(ret.a[2][3], x.a[2][3]+y.a[3][3]);
		ret.a[3][0]=min(ret.a[3][0], x.a[3][0]+y.a[0][0]);
		ret.a[3][0]=min(ret.a[3][0], x.a[3][1]+y.a[1][0]);
		ret.a[3][0]=min(ret.a[3][0], x.a[3][2]+y.a[2][0]);
		ret.a[3][0]=min(ret.a[3][0], x.a[3][3]+y.a[3][0]);
		ret.a[3][1]=min(ret.a[3][1], x.a[3][0]+y.a[0][1]);
		ret.a[3][1]=min(ret.a[3][1], x.a[3][1]+y.a[1][1]);
		ret.a[3][1]=min(ret.a[3][1], x.a[3][2]+y.a[2][1]);
		ret.a[3][1]=min(ret.a[3][1], x.a[3][3]+y.a[3][1]);
		ret.a[3][2]=min(ret.a[3][2], x.a[3][0]+y.a[0][2]);
		ret.a[3][2]=min(ret.a[3][2], x.a[3][1]+y.a[1][2]);
		ret.a[3][2]=min(ret.a[3][2], x.a[3][2]+y.a[2][2]);
		ret.a[3][2]=min(ret.a[3][2], x.a[3][3]+y.a[3][2]);
		ret.a[3][3]=min(ret.a[3][3], x.a[3][0]+y.a[0][3]);
		ret.a[3][3]=min(ret.a[3][3], x.a[3][1]+y.a[1][3]);
		ret.a[3][3]=min(ret.a[3][3], x.a[3][2]+y.a[2][3]);
		ret.a[3][3]=min(ret.a[3][3], x.a[3][3]+y.a[3][3]);
		return ret;
	}
	inline friend mat operator +(mat x, mat y){
		mat ret;
		for(int i=0; i<4; ++i) for(int j=0; j<4; ++j) ret.a[i][j]=min(x.a[i][j], y.a[i][j]);
		return ret;
	}
	inline friend bool operator !=(mat x, mat y){
		for(int i=0; i<4; ++i) for(int j=0; j<4; ++j) if(x.a[i][j]!=y.a[i][j]) return true;
		return false;
	}
}tr[N<<2], tt[N<<2], tag[N<<2], I, tem, bs;
int idx;
inline void push_up(int p){
	tt[p]=tt[p<<1|1]*tt[p<<1];
	tr[p]=(tr[p<<1|1]*tt[p<<1])+tr[p<<1];
}
inline void build(int p, int l, int r){
	tag[p]=I; tt[p]=I;
	if(l==r){
		if(l==n+1){
			tr[p].a[0][0]=0;
		}
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1, l, mid); build(p<<1|1, mid+1, r);
	push_up(p);
}
inline void push_down(int p){
	if(tag[p]!=I){
		tr[p<<1]=tr[p<<1]*tag[p]; tag[p<<1]=tag[p<<1]*tag[p];
		tr[p<<1|1]=tr[p<<1|1]*tag[p]; tag[p<<1|1]=tag[p<<1|1]*tag[p];
		tag[p]=I;
	}
}
inline void qry(int p, int l, int r, int L, int R){
	if(L<=l&&r<=R) {
		tem=(tem*tt[p])+tr[p];
		return ;
	}
	int mid=(l+r)>>1;
	push_down(p);
	if(R>mid) qry(p<<1|1, mid+1, r, L, R);
	if(L<=mid) qry(p<<1, l, mid, L, R);
}
inline void mdf(int p, int l, int r, int L, int R){
	if(L>R) return ;
	if(L<=l&&r<=R){
		tr[p]=tr[p]*tem; tag[p]=tag[p]*tem;
		return ;
	}
	int mid=(l+r)>>1;
	push_down(p);
	if(L<=mid) mdf(p<<1, l, mid, L, R);
	if(R>mid) mdf(p<<1|1, mid+1, r, L, R);
	push_up(p);
}
inline void mdf2(int p, int l, int r, int x){
	if(l==r){
		tt[p]=tem;
		return ;
	}
	int mid=(l+r)>>1;
	push_down(p);
	if(x<=mid) mdf2(p<<1, l, mid, x);
	else mdf2(p<<1|1, mid+1, r, x);
	push_up(p);
}
inline void st(int p, int l, int r, int x){
	if(l==r){
		tr[p]=tem;
		return ;
	}
	int mid=(l+r)>>1;
	push_down(p);
	if(x<=mid) st(p<<1, l, mid, x);
	else st(p<<1|1, mid+1, r, x);
	push_up(p);
}
int main(){
	freopen("D:\\nya\\acm\\C\\test.in","r",stdin);
	freopen("D:\\nya\\acm\\C\\test.out","w",stdout);
	for(int i=0; i<4; ++i) I.a[i][i]=0;
	read(n);
	for(int i=1; i<=n; ++i) read(a[i]);
	for(int i=1; i<=n; ++i) read(b[i]);
	for(int i=1; i<=n; ++i) rka[i]=rkb[i]=i;
	sort(rka+1, rka+n+1, cmp1);
	sort(rkb+1, rkb+n+1, cmp2);
	for(int i=1; i<=n; ++i) px[rka[i]]=i, py[rkb[i]]=i;
	build(1, 0, n+1);
	for(int _=n; _>=0; --_){
		int i=rka[_];
		tem=bs;
		qry(1, 0, n+1, py[i]+1, n+1);
		st(1, 0, n+1, py[i]);
		mat v1=bs;
		v1.a[1][0]=v1.a[3][2]=0;
		v1.a[0][1]=v1.a[2][3]=b[rkb[py[i]]];
		tem=v1;
		mdf2(1, 0, n+1, py[i]);
		mat v2=bs;
		v2.a[2][0]=v2.a[3][1]=0;
		v2.a[0][2]=v2.a[1][3]=a[i];
		tem=v2;
		mdf(1, 0, n+1, 0, py[i]);
	}
	tem=bs;
	qry(1, 0, n+1, 0, n+1);
	ll ans=inf;
	for(int i=0; i<4; ++i) ans=min(ans, tem.a[0][i]);
	printf("%lld\n", ans);
	return 0;
}

詳細信息

Test #1:

score: 0
Dangerous Syscalls

input:

7
10 12 19 99 10 8 49
9 14 15 199 11 7 19

output:


result: