王学长的LCT标程

善良的王学长竟然亲自打了一遍QAQ好感动QAQ

  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 using namespace std;
 10 const int maxn=100000+10;
 11 inline int read(){
 12     int x=0,sig=1;char ch=getchar();
 13     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
 14     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
 15     return x*=sig;
 16 }
 17 inline void write(int x){
 18     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
 19     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
 20     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
 21 }
 22 struct node {
 23     node *ch[2],*fa;
 24     bool rev;
 25     int x,sum,siz,mul,add;
 26     inline void add_rev_tag(){
 27         swap(ch[0],ch[1]);rev^=1;return;
 28     }
 29     inline void add_plus_tag(int a){
 30         sum+=siz*a;x+=a;add+=a;return;
 31     }
 32     inline void add_mul_tag(int m){
 33         sum*=m;x*=m;mul*=m;add*=add*m;return;
 34     }
 35     inline void down(){
 36         if(rev){
 37             if(ch[0]) ch[0]->add_rev_tag();
 38             if(ch[1]) ch[1]->add_rev_tag();
 39             rev=0;
 40         }
 41         if(add){
 42             if(ch[0]) ch[0]->add_plus_tag(add);
 43             if(ch[1]) ch[1]->add_plus_tag(add);
 44             add=0;
 45         }
 46         if(mul>1){
 47             if(ch[0]) ch[0]->add_mul_tag(mul);
 48             if(ch[1]) ch[1]->add_mul_tag(mul);
 49             mul=1;
 50         } return;
 51     }
 52     inline void update(){
 53         sum=x;siz=1;
 54         if(ch[0]) sum+=ch[0]->sum,siz+=ch[0]->siz;
 55         if(ch[1]) sum+=ch[1]->sum,siz+=ch[1]->siz;
 56         return;
 57     }
 58 }lct[maxn];
 59 inline int get_parent(node *x,node *&fa){return (fa=x->fa)?fa->ch[0]==x?0:fa->ch[1]==x?1:-1:-1;}
 60 inline void rotate(node *x){
 61     int t1,t2;
 62     node *fa,*gfa;
 63     t1=get_parent(x,fa);
 64     t2=get_parent(fa,gfa);
 65     if ((fa->ch[t1]=x->ch[t1^1])) fa->ch[t1]->fa=fa;
 66     x->ch[t1^1]=fa;fa->fa=x;x->fa=gfa;
 67     if (t2!=-1) gfa->ch[t2]=x;
 68     fa->update();return;
 69 }
 70 inline void pushdown(node *x){
 71     static node *stack[maxn];
 72     int cnt=0;
 73     while(1){
 74         stack[cnt++]=x;
 75         node *fa=x->fa;
 76         if (!fa || (fa->ch[0]!=x && fa->ch[1]!=x)) break;
 77         x=fa;
 78     }
 79     while(cnt--) stack[cnt]->down();
 80     return;
 81 }
 82 inline node * splay(node *x){
 83     pushdown(x);
 84     while(1){
 85         int t1,t2;
 86         node *fa,*gfa;
 87         t1=get_parent(x,fa);
 88         if(t1==-1) break;
 89         t2=get_parent(fa,gfa);
 90         if(t2==-1){
 91             rotate(x);break;
 92         } else if (t1==t2){
 93             rotate(fa);rotate(x);
 94         } else{
 95             rotate(x);rotate(x);
 96         }
 97     }
 98     x->update();
 99     return x;
100 }
101 inline node * access(node *x){
102     node *ret=NULL;
103     while (x) splay(x)->ch[1]=ret,(ret=x)->update(),x=x->fa;
104     return ret;
105 }
106 inline void makeroot(int x){access(lct+x)->add_rev_tag();}
107 inline void link(int u,int v){
108     makeroot(u);splay(lct+u)->fa=lct+v;return;
109 }
110 inline void cut(int u,int v){
111     makeroot(u);
112     node *p=(access(lct+v),splay(lct+v));
113     p->ch[0]->fa=NULL;
114     p->ch[0]=NULL;
115     p->update();
116 }
117 int n,q;
118 int main(){
119     n=read();q=read();
120     int i;
121     for(i=1;i<=n;i++) {
122         lct[i].x=lct[i].sum=1;
123         lct[i].siz=1;
124         lct[i].mul=1;
125     }
126     for(i=1;i<n;i++){
127         int u,v;
128         u=read();v=read();
129         link(u,v);
130     }
131     while(q--){
132         char ch=getchar();
133         while(ch<=32) ch=getchar();
134         int u,v,x,y,c;
135         if(ch==‘+‘){
136             u=read();v=read();c=read();
137             makeroot(u);
138             access(lct+v)->add_plus_tag(c);
139         }else if(ch==‘-‘){
140             u=read();v=read();x=read();y=read();
141             cut(u,v);link(x,y);
142         }else if(ch==‘*‘){
143             u=read();v=read();c=read();
144             makeroot(u);
145             access(lct+v)->add_mul_tag(c);
146         }else if(ch==‘/‘){
147             u=read();v=read();
148             makeroot(u);
149             printf("%u\n",access(lct+v)->sum);
150         }
151     }
152     return 0;
153 }

搜索

复制

时间: 2024-11-11 09:52:30

王学长的LCT标程的相关文章

王学长的AAA树

让我们响应王学长的号召勇敢的分开写splay和lct吧! 分开写大法好!!!!!!!!!!!杜教的ch[4]弱爆了!!!! 1 #include <stdio.h> 2 #include <algorithm> 3 char ch; 4 inline void read(int &x) 5 { 6 x=0;ch=getchar(); 7 while(ch<=32) ch=getchar(); 8 while(ch>32) x=x*10+ch-48,ch=getc

“玲珑杯”算法比赛 Round #14题目与标程

"玲珑杯"算法比赛 Round #14By:wxh010910 Start Time:2017-05-13 16:00:00 End Time:2017-05-13 18:30:00 Refresh Time:2017-05-20 09:51:24 Public p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin:

整数分解的标程

经常用到的一个小技巧,将整数分解成一个个小数如:234分解成2 3 4 因为自己总是忘记,整理成标程,以后可以直接套用 1 int fenjie(int x)//分解整数x后求和 2 { 3 int sum=0; 4 while(x) 5 { 6 sum+=x%10; 7 x/=10; //割掉最后位 8 } 9 return sum; 10 }

西北工业大学2015年计算机学院考研机试 题目+标程(完整版)

A 求最小数(Output the minimum) 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 每次给定3个数(均可用int表示),要求找出3个数里的最小的一个,并输出最小的数.Input three integers and output the minimum 输入 a b c 三个数用空格隔开Input three integers . 输出 a b c中最小的一个数Output the minimum . 输入样例 5 3 98 输出样例 3 1 #inc

【CQ18高一暑假前挑战赛3】标程

[A:LCM] #include<bits/stdc++.h> using namespace std; #define ll long long int main() { ll a,b,g; cin>>a>>b; g=__gcd(a,b); cout<<a/g*b<<endl; return 0; } [B:STL,用set或者queue+map都行] #include<bits/stdc++.h> using namespace

【CQ18高一暑假前挑战赛5】标程

[A:暴力] #include<bits/stdc++.h> using namespace std; const int maxn=100010; int a[maxn],vis[maxn],N,M; int main() { scanf("%d%d",&N,&M); for(int i=1;i<=M;i++){ scanf("%d",&a[i]); vis[a[i]]=1; } for(int i=1;i<=N;i

【学长虐学弟欢乐赛】Round3

第三套题 出题人:faebdc 金牌爷的题这么神竟然还有学长AK了QAQ 题目全都是CF上的 T1 D T2 E T3 D 神犇地址:faebdc学长的blog 试题下载地址 数据下载地址 话说题解的ppt用色果然还是faebdc神犇的常用配色= = 虚化色块喷涂拼接 T1 CF305D Olya ans Graph 原题可以自己去CF找 学长给的是翻译后题面 [问题描述] Olya 有一张 n 个点. m 条边的有向无权图, 所有点从 1 到 n 标号. 现在 Olya 想知道 有多少种添加有

[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  Solved: 136[Submit][Status][Discuss] Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言: “学好数理化,走遍天下都不怕.” 学渣小R被大

【学长虐学弟欢乐赛系列】Round2

第二套题 出题人:Lavender 神犇地址:Lavender学姐的blog 试题下载地址 数据下载地址 T1 matrix **主要题干:**Neo 会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩 和用鼠标乱点之类的事,甚至会一脚踢掉电源--这些事有的会让做 这件事的这段时间内 CPU 使用率增加或减少一个值:有的事还会直 接让 CPU 使用率变为一个值. 当然 Neo 会询问:在之前给出的事件影响下, CPU 在某段时间内, 使用率最高是多少.有时候 Neo 还会好奇地询问,在某段时间