QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#592392 | #9222. Price Combo | Displace_ | RE | 0ms | 0kb | C++14 | 6.9kb | 2024-09-26 22:14:06 | 2024-09-26 22:14:07 |
Judging History
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