NOIP 考前 数据结构复习

BZOJ 1455 左偏树即可

 1 #include <cstdio>
 2 #define LL long long
 3 const LL Maxn=1000100;
 4 struct Info{LL l,r,v,Dis;}Tree[Maxn];
 5 LL Father[Maxn],n,m,Dead[Maxn],u,v;
 6 inline void Swap(LL &x,LL &y){LL t=x;x=y;y=t;}
 7 LL Get(LL x) {return x==Father[x]?x:Father[x]=Get(Father[x]);}
 8 LL Merge(LL u,LL v)
 9 {
10     if (u==0 || v==0) return u+v;
11     if (Tree[u].v>Tree[v].v) Swap(u,v);
12     Tree[u].r=Merge(Tree[u].r,v);
13     if (Tree[Tree[u].l].Dis<Tree[Tree[u].r].Dis)
14         Swap(Tree[u].l,Tree[u].r);
15     Tree[u].Dis=Tree[Tree[u].l].Dis+1;
16     return u;
17 }
18 int main()
19 {
20     scanf("%lld",&n);
21     for (LL i=1;i<=n;i++) scanf("%lld",&Tree[i].v),Tree[i].l=Tree[i].r=0;
22     for (LL i=1;i<=n;i++) Father[i]=i;
23     scanf("%lld",&m);
24     for (LL i=1;i<=m;i++)
25     {
26         char ch=getchar();
27         while (ch!=‘M‘ && ch!=‘K‘) ch=getchar();
28         if (ch==‘M‘)
29         {
30             scanf("%lld%lld",&u,&v);
31             LL fu=Get(u);
32             LL fv=Get(v);
33             if (fu==fv || Dead[u] || Dead[v]) continue;
34             LL Tmp=Merge(fu,fv);
35             Father[fu]=Father[fv]=Tmp;
36         }
37         if (ch==‘K‘)
38         {
39             scanf("%lld",&u);
40             if (Dead[u]) {puts("0"); continue;}
41             LL fu=Get(u); Dead[fu]=true;
42             printf("%lld\n",Tree[fu].v);
43             LL Tmp=Merge(Tree[fu].l,Tree[fu].r);
44             Father[fu]=Tmp;
45             Father[Tmp]=Tmp;
46         }
47     }
48     return 0;
49 }

BZOJ 1455

时间: 2025-01-31 07:04:28

NOIP 考前 数据结构复习的相关文章

NOIP 考前 队列复习

BZOJ 1127 1 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define M 2020 7 using namespace std; 8 int n,k,a[M][M]; 9 long long sum[M][M]; 10 long long Get_Sum(int x1,int y1,int x2,int y2) 1

NOIP 考前 数论复习

POJ 2891 x=r1 (mod a1) x=r2 (mod a2) x=a1*x+r1,x=a2*y+r2; a1*x-a2*y=r2-r1; 用Extend_Gcd求出m1*x+m2*y=d; d=Gcd(x,y); 那么就可以解出原来的x=(x*(r2-r1)/d) 那么代入原式r1=a1*x+r1 新的a1=lcm(a1,a2); 1 #include <cstdio> 2 #define LL long long 3 LL a1,a2,r1,r2,x,y,n; 4 LL Exte

NOIP考纲总结+NOIP考前经验谈

NOIP考纲总结+NOIP考前经验谈 首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精                 (后面c,d考的可能性较小,应该只考a,b) 排序算法 a.选择排序 b.插入排序 c.hash排序 d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要)

数据结构复习之--“插入排序”-JAVA实现

菜鸟中的菜鸟一枚,面临找工作,复习下数据结构,写的插入排序算法记录一下,每天写一点,不断积累吧! import java.util.Scanner; /** * * @author DL * 数据结构复习之插入排序练习程序 * */ public class SortTest { public static void main(String [] args){ Scanner sc = new Scanner(System.in); int totalNums = sc.nextInt();//

数据结构复习之C语言指针与结构体

数据结构指针复习: #include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d\n", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d\n", *a); // 8 // 地址是连续的 printf("%p\n", a+1); printf("%p\n", a+2

数据结构复习笔记--数组

最后还是决定在未来的道路上走向软件开发者这条路,从现在重新复习数据结构和算法. 关于数组有几个比较有意思的特点. 1.对于数组 int List[3],编译器将List[i]解释为指向一个地址为List + i*sizeof(int)的整数的指针. 对于int * List, int *List2[5],两个都是指向int 类型的变量,但是编译器会为后者分配五个整数存储空间. List2实际是上指向List2[0],List2 + i 实际上是&List2[i].在C语言中是不需要加上偏移量的.

数据结构复习之开题篇(必要时持续更新...)

在复习数据结构之前有必要复习一下C语言的指针 1.指针 int* p; 一个指针类型,名为p,代表的是一个整形所存放的地址编号 1.1一个使用的实例 [注]对变量使用&操作符,意为取它所在的地址 1 #include <stdio.h> 2 3 int main() 4 { 5 int var = 20; /* 实际变量的声明 */ 6 int* ip; /* 指针变量的声明 */ 7 8 ip = &var; /* 在指针变量中存储 var 的地址 */ 9 10 print

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

数据结构复习2

1. 一个非空广义表的表尾(只能是子表) 解析:(1)<数据结构>对广义表的表头和表尾是这样定义的:  如果广义表LS=(a1,a2...an)非空,则 a1是LS的表头,其余元素组成的表(a2,a3,..an)是称为LS的表尾.  根据定义,非空广义表的 表头是一个元素,它 可以是原子也可以是一个子表, 而表尾则必定是子表.例如:LS=(a,b),表头为a,表尾是(b)而不是b.另外:LS=(a)的表头为a,表尾为空表(). (2)非空广义表,除表头外,其余元素构成的表称为表尾,所以非空广义