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 }
嗯就这样= =