COJ 0979 WZJ的数据结构(负二十一)

WZJ的数据结构(负二十一)
难度级别:C; 运行时间限制:5000ms; 运行空间限制:262144KB; 代码长度限制:2000000B

试题描述

请你实现一个数据结构,完成这样的功能:

给你一个N个点的图,初始状态无边。

每次加入一条双向边(u,v,w),若加入后没有构成一棵生成树,输出“Not Yet”,否则输出当前最小生成树的权值。


输入

第一行两个正整数N,M。表示有N个点M个操作。
接下来M行每行三个正整数u,v,w。

输出

每次加入一条双向边(u,v,w),若加入后没有构成一棵生成树,输出“Not Yet”,否则输出当前最小生成树的权值。

输入示例

4 6
1 2 10
2 3 10
3 4 10
2 2 1
1 3 2
2 4 3

输出示例

Not Yet
Not Yet
30
30
22
15

其他说明

1<=N<=100000
1<=M<=500000
1<=ui,vi<=N
1<=wi<=1000

题解:这才是真正的动态MST呀

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 #define CH for(int d=0;d<=1;d++) if(ch[d])
10 using namespace std;
11 const int maxn=300000+10,maxm=1500000+10,inf=-1u>>1;
12 struct node{
13     node*fa,*ch[2],*mx;int x;bool rev;
14     node(){fa=ch[0]=ch[1]=NULL;mx=this;x=0;rev=false;}
15     void revt(){swap(ch[0],ch[1]);rev^=1;return;}
16     void update(){mx=this;CH{if(mx->x<ch[d]->mx->x)mx=ch[d]->mx;}return;}
17     void down(){if(rev){CH{ch[d]->revt();}rev=false;}return;}
18 }lct[maxn+maxm],*nodecnt;
19 int parent(node*x,node*&y){return (y=x->fa)?y->ch[0]==x?0:y->ch[1]==x?1:-1:-1;}
20 void rotate(node*x){
21     node*y,*z;int d1=parent(x,y),d2=parent(y,z);
22     if(y->ch[d1]=x->ch[d1^1]) y->ch[d1]->fa=y;
23     y->fa=x;x->fa=z;x->ch[d1^1]=y;
24     if(d2!=-1) z->ch[d2]=x;
25     y->update();return;
26 }
27 void pushdown(node*x){
28     static node*s[maxn];int top=0;
29     for(node*y;;x=y){
30         s[top++]=x;y=x->fa;
31         if(!y||(y->ch[0]!=x&&y->ch[1]!=x)) break;
32     } while(top--) s[top]->down();return;
33 }
34 node*splay(node*x){
35     pushdown(x);node*y,*z;int d1,d2;
36     while(true){
37         if((d1=parent(x,y))<0) break;
38         if((d2=parent(y,z))<0){rotate(x);break;}
39         if(d1==d2) rotate(y),rotate(x);
40         else rotate(x),rotate(x);
41     } x->update();return x;
42 }
43 node*access(node*x){
44     node*ret=NULL;
45     for(;x;x=x->fa) splay(x)->ch[1]=ret,(ret=x)->update();
46     return ret;
47 }
48 void makeroot(int x){access(x+lct)->revt();return;}
49 void link(int x,int y){makeroot(x);splay(x+lct)->fa=lct+y;return;}
50 void cut(int x,int y){
51     makeroot(x);node*p=(access(y+lct),splay(y+lct));
52     p->ch[0]=p->ch[0]->fa=NULL;p->update();return;
53 }
54 node*findtop(int x){
55     node*t=(access(x+lct),splay(x+lct));while(t->ch[0]) t->down(),t=t->ch[0];return t;
56 }
57 node*query(int x,int y){
58     makeroot(x);return access(y+lct)->mx;
59 }
60 int n,m;
61 inline int read(){
62     int x=0,sig=1;char ch=getchar();
63     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
64     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
65     return x*=sig;
66 }
67 inline void write(int x){
68     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
69     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
70     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
71 }
72 int s[maxm],t[maxm];
73 void init(){
74     n=read();m=read();int ans=0,cnt=n;nodecnt=lct+n+1;
75     for(int i=1;i<=m;i++){
76         s[i]=read();t[i]=read();
77 node*q=nodecnt++;q->x=read();int k=q-lct;makeroot(k);
78         if(s[i]!=t[i]) {
79         if(findtop(s[i])!=findtop(t[i])){
80             link(s[i],k);link(t[i],k);ans+=q->x;cnt--;
81         }else{
82             node*p=query(s[i],t[i]);if(p->x>q->x) {
83             ans+=q->x-p->x;int id=p-lct-n;
84             cut(s[id],p-lct);cut(t[id],p-lct);
85             link(s[i],k);link(t[i],k);}
86         }
87         }
88         if(cnt==1) write(ans),ENT;
89         else puts("Not Yet");
90     }
91     return;
92 }
93 void work(){
94     return;
95 }
96 void print(){
97     return;
98 }
99 int main(){init();work();print();return 0;}
时间: 2024-10-27 05:30:17

COJ 0979 WZJ的数据结构(负二十一)的相关文章

COJ 1002 WZJ的数据结构(二)(splay模板)

我的LCC,LCT,Splay格式终于统一起来了... 另外..这个形式的Splay是标准的Splay(怎么鉴别呢?看Splay函数是否只传了一个变量node就行),刘汝佳小白书的Splay写的真是不想吐槽了,局限性太大,别学... 好了我要去写维修数列了..... 标准Splay模板: 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #inc

COJ 0970 WZJ的数据结构(负三十)树分治

WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为d,那么将y节点的权值加上d*v. 2 x:询问节点x的权值. 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi.第N+1行为一个正整数M.最后

COJ 0981 WZJ的数据结构(负十九)树综合

WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:15000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习模板的同学还要找来找去很不爽,于是WZJ跟小伙伴们一块商量如何将这些题汇拢到一块去: WZJ:为了大家简单,我规定一开始是一棵有根树. LZJ:那我一定得加上换根操作喽. XJR:链信息修改,链信息增加,链信息翻倍,维护链信息的最大,最小,总和肯定很好做. CHX:子树信息修改,子树信息增加,子树

COJ 0995 WZJ的数据结构(负五)区间操作

WZJ的数据结构(负五) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,要求你回答执行M次操作.操作分两种: 操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数. 操作2:每次操作给你l,r,v三个参数,将Al至Ar中每个数的值+v. 输入 第一行为一个正整数N.第二行为N个整数Ai.第三行为一个正整数M.接下来M行每行4个正整数t,l,

COJ 0999 WZJ的数据结构(负一)

WZJ的数据结构(负一) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 输入N个模板串Pi和文本串T,输出每个模板串Pi在T中出现了多少次. 输入 第一行为一个正整数N.接下来N行为Pi.最后一行为T 输出 输出N行,第i行为模板串Pi在T中出现的次数. 输入示例 5aabbaabaaababababa 输出示例 54445 其他说明 1<=sigma(|Pi|)<=10000001<=|T|<=10000

COJ 0967 WZJ的数据结构(负三十三)

WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,要求你回答执行N次操作.操作分两种: 操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数. 操作2:每次操作给你l,r,v三个参数,将Al至Ar所有数的值设为v. 输入 第一行为一个正整数N.第二行为N个整数Ai.接下来N行每行4个正整数t,l,r,v.若t=2表

COJ 0346 WZJ的旅行(二)

WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由于道路翻修,只有N-1条双向道路可以通行,第i条双向道路从ui连接到vi,距离为wi.但这N-1条道路竟然连接了整个国家,每两个城市之间都有一条道路! WZJ知道这里景点很多,所以他想从城市s出发到城市t,旅游所有沿途的城市.WZJ想起到锻炼作用,但又不想太累,所以城市s到城市t的距离必须在L到R之

COJ 1010 WZJ的数据结构(十) 线段树区间操作

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int

COJ 1010 WZJ的数据结构(十) 线段树的地狱

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int