首页 > 代码库 > 雅礼集训——day1、day2

雅礼集训——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 }
View Code

    嗯就这样= =

雅礼集训——day1、day2