BZOJ 1058 報表統計 splay set

2021-09-07 23:10:50 字數 1336 閱讀 8282

題意:給出乙個數列,初始時有n個數字。三種操作:(1)在第i個之後插入數字k,(1<=i<=n),注意這裡的插入,這個n就是一開始的n,不是當前數列的長度。比如若在第i個之後插入數字x,又再第i個數字之後插入y,那麼y要插在x的後面;(2)詢問數列中相鄰兩項差值的最小值;(3)詢問整個數列所有數中差值的最小值。

思路:(1)首先,第二種詢問比較容易解決,只要將所有數字插入到set中,每次找與當前數字最近的兩個比較即可;並且顯然這個值只會遞減不會增加;

(2)對於第一種查詢我使用splay實現,節點儲存當前節點的val以及以當前節點為根的子樹的區間的兩個端點的值lval和rval,以及相鄰數字的最小值min。每次更新即可。

struct node

;node a[n],*nullnode,*root,*x1,*x2;

int cnt;

node *newnode(i64 val,node *p)

void pushup(node *p)

else p->lval=p->val;

if(p->c[1]!=x1&&p->c[1]!=x2&&p->c[1]!=nullnode)

else p->rval=p->val;

}void init()

void zig(node *x)

x->p=q;

pushup(p);

pushup(x);

if(root==p) root=x;

}void zag(node *x)

x->p=q;

pushup(p);

pushup(x);

if(root==p) root=x;

}void splay(node *x,node *goal)

else

}else}}

void select(int k,node *goal)

}splay(x,goal);

}i64 ans1,ans2;

sets;

void insert(int k,i64 val)

if(it!=s.begin())

s.insert(val);

}int n,m;

int s[n];

void add(int x)

}int get(int x)

return ans;

}int main()

char op[20];

int pos;

i64 val;

while(m--)

else if(op[4]=='g') pr(ans1);

else pr(ans2);

}return 0;

}

ZJOI2007報表統計 BZOJ1058

傳送門 time limit 15 sec memory limit 162 mb 小q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。經過仔細觀察,小q發現 統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。在最...

bzoj1058 ZJOI2007 報表統計

小q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。經過仔細觀察,小q發現統計一張報表實際上是維護乙個可能為負數的整數數列,並且進行一些查詢操作。在最開始的時候,有乙個長度為n的整數序列,並且有以下三種操作 insert i k...

bzoj1058 ZJOI2007 報表統計

傳送門 題解 這個insert操作好py啊是不是用set就能搞搞啊。什麼?你跟我講t了?讀入優化?還是t?卡了卡常,發現乙個東西用priority queue就夠了。然後12s過了。include include include include include include include usi...