社区讨论
求优化常数
P3991[BJOI2017] 喷式水战改参与者 40已保存回复 41
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 41 条
- 当前快照
- 1 份
- 快照标识符
- @mkmtp152
- 此快照首次捕获于
- 2026/01/21 00:43 4 周前
- 此快照最后确认于
- 2026/02/11 02:44 上周
我这边最慢的点快要跑的 1.8s 了,差一点就 T 了(要不是我半夜交可能就真 T 了)。
有没有佬看看哪里常数大了(1e5,单 log,跑这么慢是何意味)。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=(int)4e18+10;
const int N=1e5+10;
struct mt{
int n,m;
int s[4][4];
};
const mt ps={1,4,{0,0,0,0}};
const mt bs={4,4,{
{0,-inf,-inf,-inf},
{-inf,0,-inf,-inf},
{-inf,-inf,0,-inf},
{-inf,-inf,-inf,0},
}};
mt operator*(const mt &a,const mt &b){
mt res=mt();
memset(res.s,-0x3f,sizeof(res.s));
int n=a.n;
int k=a.m;
int m=b.m;
res.n=n;
res.m=m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
for(int l=0;l<k;l++){
res.s[i][j]=max(res.s[i][j],a.s[i][l]+b.s[l][j]);
}
}
}
return res;
}
mt qp(mt x,int y){
mt res=bs;
while(y){
if(y&1) res=res*x;
x=x*x;
y>>=1;
}
return res;
}
struct treap{
struct ms{
int ls,rs,pr;
int val,sum;
mt r,t,s;
}f[N*3];
int rt,cnt;
int nw(mt a,int val){
int u=++cnt;
f[u].pr=rand();
f[u].val=f[u].sum=val;
f[u].r=a;
f[u].t=f[u].s=qp(a,val);
return u;
}
void push_up(int u){
int ls=f[u].ls,rs=f[u].rs;
f[u].sum=f[ls].sum+f[u].val+f[rs].sum;
f[u].s=(ls?f[ls].s:bs)*(f[u].t)*(rs?f[rs].s:bs);
}
tuple<int,int,int> sp(int u,int k){
if(!u) return {0,0,0};
if(k<=f[f[u].ls].sum){
auto [x,y,z]=sp(f[u].ls,k);
f[u].ls=z;
push_up(u);
return {x,y,u};
}
else if(k<f[f[u].ls].sum+f[u].val){
int ls=f[u].ls,rs=f[u].rs;
f[u].ls=f[u].rs=0;
push_up(u);
return {ls,u,rs};
}
else{
auto [x,y,z]=sp(f[u].rs,k-f[f[u].ls].sum-f[u].val);
f[u].rs=x;
push_up(u);
return {u,y,z};
}
}
int mer(int x,int y){
if(!x) return y;
if(!y) return x;
if(f[x].pr<f[y].pr){
f[y].ls=mer(x,f[y].ls);
push_up(y);
return y;
}
else{
f[x].rs=mer(f[x].rs,y);
push_up(x);
return x;
}
}
void ins(int pos,mt a,int val){
auto [x,y,z]=sp(rt,pos);
int m=nw(a,val);
if(!y){
rt=mer(x,mer(m,z));
return;
}
mt rec=f[y].r;
int c=pos-f[x].sum;
int p1=nw(rec,c);
int p2=nw(rec,f[y].val-c);
rt=mer(x,mer(p1,mer(m,mer(p2,z))));
}
int que(){
mt res=ps*f[rt].s;
int ans=0;
for(int i=0;i<4;i++){
ans=max(ans,res.s[0][i]);
}
return ans;
}
}t;
int n;
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n;
int las=0;
for(int i=1;i<=n;i++){
int p,a,b,c,x;
cin>>p>>a>>b>>c>>x;
mt w={4,4,{
{a,b,c,a},
{-inf,b,c,a},
{-inf,-inf,c,a},
{-inf,-inf,-inf,a},
}};
t.ins(p,w,x);
int res=t.que();
cout<<res-las<<"\n";
las=res;
}
}
回复
共 41 条回复,欢迎继续交流。
正在加载回复...