区域赛第33天
1、最近感觉自己的时间可以利用好的,但是就是自己的学习效率比较低,主要问题就是一旦放松下来就会放松很长的时间,所以说浪费了很多的时间。。。
2、现在最重要的就是从心底相信自己真的能拿金牌,所以就是现在主要的任务就是恢复信心,所以我不能看题解,晚上的时候可以找个地方好好的看看题解。
3、然后就是最近自己的身体好像不是那么的好,所以不能熬夜。。。
4、组队赛感觉好像不能很好对的进行,因为队友都回家了,所以还是好好的提高的自己的实力还是好的。
5、明天的时候就是不能放松,累的时候就谢谢总结或者看看mooc。
6、明天的任务就是把那次的题全部的补完,然后就是紫书dp写3-7个题,然后就是把总结写完,就是这个样子。
7、明天时候看看自己能真正的学习多长的时间。
8、睡觉,GOGOGOGO
9、左偏树,就是一个可以支持合并的堆,感觉还是很好用的,下面给出模板,题目 HDU 1512
#include<bits/stdc++.h> using namespace std; int pre[100002]; int rear; struct node { int dis,key,l,r; }D[101111]; void inist(int n) { rear=0; D[0].dis=-1; for(int i=1;i<=n;i++) { pre[i]=i; } } int It_new(int key) { rear++; D[rear].l=D[rear].r=0; D[rear].key=key; D[rear].dis=0; return rear; } int It_merge(int r1,int r2) { if(!r1) return r2; if(!r2) return r1; if(D[r1].key<D[r2].key) { swap(r1,r2); } D[r1].r=It_merge(D[r1].r,r2); if(D[D[r1].l].dis<D[D[r1].r].dis) { swap(D[r1].l,D[r1].r); } D[r1].dis=D[D[r1].r].dis+1; return r1; } int It_pop(int &rt) { int ret=D[rt].key; rt=It_merge(D[rt].l,D[rt].r); return ret; } void It_push(int &rt,int key) { rt=It_merge(rt,It_new(key)); } int find(int x) { return x==pre[x]?x:pre[x]=find(pre[x]); } int main() { int n; while(~scanf("%d",&n)) { inist(n); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); It_new(x); } int m; scanf("%d",&m); while(m--) { int x,y; scanf("%d%d",&x,&y); x=find(x); y=find(y); if(x==y) printf("-1\n"); else { int rt=It_merge(x,y); int temp=rt; int ans=It_pop(rt); ans/=2; printf("%d\n",ans); D[temp].l=D[temp].r=0; D[temp].key=ans; D[temp].dis=0; rt=It_merge(rt,temp); pre[x]=rt; pre[y]=rt; pre[rt]=rt; } } } }