雅礼集训——day1、day2

  day1:

    嗯上午考试拿了100分。第一题40,第二题60。看完题的时候我就觉得第二题的部分分是最好得到的,因为数据范围只有300,而且一眼看上去就是网络流的二分图多重匹配模型?然后就建了个网络流写了些,期望得分是70分,但是第1组数据有点劲,被卡掉了,就拿了60分。正解是map+set的贪心。。。并不会STL

    写完T2去看T1,先用DFS乱搞了一下,结果样例都没过去,我手推了一下样例,得到了一个公式,就是从一个点出发需要加上的边数=这个点通过DFS能够遍历到的点的个数-与这个点直接相连的点的个数。然后就搞了一个DFS+回溯,时间复杂度应该是m^2的。一看数据,哎呀能过4组数据,这就又80分了。结果拿了40,我才发现m的数据范围是10^5。。。正解是bitset优化的DFS,看来过几天要学一下DFS了。

    写T3的时候已经没有多少时间了,但是拿到30分还是很简单的。写法和NOIP2016D2T1的质因数分解的方法是一样的,但是因为写这道题的时候留下的时间不够了,我的程序莫名挂了,没办法只能交2道题了,正解是数位DP。

    其实这次考试我还是有能力拿到140分的。但是T3代码写挂了,T2因为i第一组数据点太多被卡掉了,就只拿了100分。

    下午讲了讲题。因为课件准备的是贪心之类的非常普及的知识点,就没有讲课。

    这次考试我发现自己还是有好多需要学的东西。嗯尽量回旅店的时候学术吧。

  day2:

    光荣爆零。。。

    看T1的时候就觉得不对。卧槽我没学过期望啊。。。看T2完全看不懂的样子QAQ。看到T3的时候我送了一口气。这么水的背包+树归题我还是能A掉的。

    然后。。。。

    没错爆零了。

    背包莫名写挂了,然后我才知道我的方法是不对的,因为在一些特殊情况下会被卡掉,而这些特殊情况有很常见,就很正常的WA了。

    事实证明我还有好多要学的东西。

    下午讲了高级数据结构里面比较基础的几个。第一次接触到的是BST。但其实还是挺简单的。

    BST大概是这样的:一个二叉树,对于任意一个子树来说,它以根节点的左儿子为根的子树上的任意一个数都小于它的根节点,以根节点的右儿子为根的子树上的任意一个数都大于它的根节点。这样的话我们要查找一个数,就可以在O(logn)的时间找到这个数。

    然后我就在现场稍微想了一下代码,下面给出部分实现:

 1 //BST的初始化,插入及查找
 2 //by:hinanawi
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cctype>
 7 #include<algorithm>
 8 using namespace std;
 9 int n,Q,k;
10 struct node{
11     int lc,rc,v;//v代表节点的权值,lc代表左孩子,rc代表右孩子
12 }tree[10000010];
13
14 inline int read(){
15     int x=0,y=1;char ch=getchar();
16     while (!isdigit(ch)){if (ch==‘-‘)y=-1;ch=getchar();}
17     while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
18     return x*y;
19 }
20
21 void build(int pos){//初始化BST,方法类似线段树,复杂度为nlogn
22     if (pos>n)    return;
23     tree[pos].v=0;tree[pos].lc=pos<<1;tree[pos].rc=(pos<<1)+1;//初始化当前节点
24     build(tree[pos].lc);    build(tree[pos].rc);//对左右两棵子树进行初始化
25 }
26
27 void insert(int x){
28     int pos=1;
29     while (tree[pos].v){
30         if (tree[pos].v>x)    pos=tree[pos].lc;//如果要插入的数大于当前节点,前往右子树,否则前往左子树
31         else pos=tree[pos].rc;
32     }
33     tree[pos].v=x;
34 }
35
36 int find(int x){
37     int pos=1;
38     while (tree[pos].v!=x){
39         if (!tree[pos].v)    return -1;//未找到x
40         if (tree[pos].v>x)    pos=tree[pos].lc;//这里的操作同插入操作
41         else pos=tree[pos].rc;
42     }
43     return pos;
44 }
45
46 int main(){
47     n=read();
48     build();
49     while (n--){
50         Q=read();k=read();
51         if (Q==1)insert(k);
52         else if (Q==2) printf("%d\n",find(k));
53     }
54     return 0;
55 }

    嗯就这样= =

时间: 2024-10-20 05:20:44

雅礼集训——day1、day2的相关文章

2017雅礼集训 Day1

今日得分:60+0(忘记关调试输出)+50 = 110 今日题解: T1:std做法:直接暴力n^2枚举,搜索加最优性剪枝 做法2:O(17n)DP,记录匹配偏移量 T2:求出通项,把不同的幂次拆开计算,单独一项的幂次可以分治FFT 我的做法:分治矩乘,但我不知道矩阵怎么FFT T3:虚树+树链剖分维护,标程400行 感觉还行?明天会做得更好的

「6月雅礼集训 2017 Day2」A

[题目大意] 给出一棵树,求有多少对点(u,v)满足其路径上不存在两个点a,b满足(a,b)=1 n<=10^5 [题解] 考虑找出所有不符合的点对,共有n*ln(n)对,他们要么是祖先->儿子边,要么是不是. 考虑祖先->儿子边,那么一个点在祖先以上,一个点在儿子以下的点对全部无法访问. 考虑另外一种边,就是LCA不是两个端点的,这就比较好统计了,两个点在这两棵子树的点对无法访问. 考虑用DFS序,这样子树就是连续的一段(祖先以上是连续两段) 然后就是一个二维覆盖问题,用扫描线+线段树

雅礼集训 2017 Day2

水箱 loj6032 先分析一波考试时乱搞搞 对于 20% 的数据,n,m≤16: 暴力枚举每个条件是否满足,然后检查,复杂度O(2m) (然而我太菜了,这都能打错) 对于另外 10% 的数据,只存在指明某处有水的条件: 水箱的高度是无限的,所以无论条件给出的y有多大,均能满足,直接输出m 原文地址:https://www.cnblogs.com/XYZinc/p/8603852.html

#6030. 【雅礼集训 2017 Day1】矩阵

#6030. 「雅礼集训 2017 Day1」矩阵 题目描述 有一个 n×n  的矩阵,每个位置 (i,j) 如果是 . 表示为白色,如果是 # 表示为黑色. 初始时,每个位置可以是黑色或白色的,(i,j)  位置的值会作为 ai,j 给你. 现在有一种操作,选择两个整数 i,j∈[1,n],记 (i,1),(i,2),…,(i,n) (i, 1), (i, 2)的颜色为 C1,C2,…Cn ??,将 (1,j),(2,j),…,(n,j)  的颜色赋为 C1,C2,…,Cn ??. 你的任务是

loj6029 「雅礼集训 2017 Day1」市场

传送门:https://loj.ac/problem/6029 [题解] 考虑如果有一些近似连续的段 比如 2 2 2 3 3 3,考虑在除3意义下,变成0 0 0 1 1 1,相当于整体-2 又:区间增加很容易造成这种段,所以我们猜测可以暴力维护 用一棵线段树即可.(好像真的能暴力维护啊 我不知道怎么证明复杂度) # include <stdio.h> # include <string.h> # include <iostream> # include <al

2017雅礼集训 Day2

今日得分:60+100+25 = 185,修改后60+100+100 今日题解: T1:有nlogn对不合法的数对,这些数对在DFS序上的支配范围画在平面上是一个或两个矩形,求矩形面积并即可 T2:递推,考虑新增加的一行一列的状态 1.与前面的一行共同完全占据了两行两列,为避免重复我们规定必须选第i列,那么行有C(i,2)种选法,列有i-1种:f[i-2]*C(i,2)*(i-1) 2.没有与前面一行共同占据两行两列,那么相当于把冲突的其中一个位置换到最后一列去:f[i-1]*C(i,2)*2

矩阵[雅礼集训 2017 Day1]

SOL 奇奇怪怪的贪心(你也不要问我为什么) #include<bits/stdc++.h> #define N 1007 int f[N][N],sum,ans,Ha,bo,n,Ans; #define MARICLE __attribute__((optimize("-O3"))) char ch,mp[N][N]; using namespace std; MARICLE void write(int x) {if (x<10) {putchar('0'+x);

【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之间,每次除的数在 $[2,10^9]$ 之间. 题解 线段树+均摊分析 和 [uoj#228]基础数据结构练习题 类似的均摊分析题. 对于原来的两个数 $a$ 和 $b$ ( $a>b$ ) ,原来的差是 $a-b$ ,都除以 $d$ 后的差是 $\frac{a-b}d$ ,相当于差也除了 $d$

雅礼培训day1 世界线 Worldline

题目大意: 给出一个有向无环图,要求对于图中的u,v,t三点,满足u->v,v->t,u->t,经过观察我们发现就是要将图中每一个点连接所有他可以达到的点,最后输出连接的边的数量. 对此我们可以dfs求出每一个点可以到达其他的点边,最后用求出的边数减去原来已经连接的边,其中用bitset优化. 代码送上: 1 #include <cstdio> 2 #include <bitset> 3 #include <iostream> 4 #define Fo