个人感受:自己水平是真的差劲,和他们不是一个档次的,第二题,如果不是陈载元暴力过了,我也不会那么早去A了第二题,第一题真的是无语,以前做到过,还想到了每个对应值a[i]-i,但是没想出来,真的是

可惜,这套题的话前两题都比提高组的要水,但这样下去,别说省选,TG一等都难拿。

  改造二叉树

时间限制: 1 Sec  内存限制: 256 MB
提交: 365  解决:
95
[提交][状态][讨论版]

题目描述

小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。

什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch];若其存在右孩子rch,则key[p]<key[rch];注意,本题中的二叉搜索树应满足对于所有结点,其左子树中的key小于当前结点的key,其右子树中的key大于当前结点的key。

小Y与他人讨论的内容则是,现在给定一棵二叉树,可以任意修改结点的数值。修改一个结点的数值算作一次修改,且这个结点不能再被修改。若要将其变成一棵二叉搜索树,且任意时刻结点的数值必须是整数(可以是负整数或0),所要的最少修改次数。

相信这一定难不倒你!请帮助小Y解决这个问题吧。

输入

第一行一个正整数n表示二叉树结点数。结点从1~n进行编号。

第二行n个正整数用空格分隔开,第i个数ai表示结点i的原始数值。

此后n - 1行每行两个非负整数fa, ch,第i + 2行描述结点i + 1的父亲编号fa,以及父子关系ch,(ch = 0 表示i + 1为左儿子,ch = 1表示i + 1为右儿子)。

结点1一定是二叉树的根。

输出

仅一行包含一个整数,表示最少的修改次数。

样例输入

3
2 2 2
1 0
1 1

样例输出

2

提示

【数据范围】

20 % :n <= 10 , ai <= 100.

40 % :n <= 100 , ai <= 200

60 % :n <= 2000 .

100 % :n <= 10 ^ 5 ,  ai < 2 ^ 31.

这道题做完后我发现自己是真的菜,推了10多分钟已经推出了二叉树的中序遍历,然后真的就讲问题转化为了将一个序列改变最小的数,使其满足各个数不同且单调递增,这个思维想下去就联想到了LIS

然后想了许久,到了13:50,陈载元A了第二题,说是什么暴力,然后我也去打了一个,花了半小时左右就A了,然后第三题去打了个暴力,这时14:45左右,然后又开始打第一题,真的恶心,想了,暴力,

DP,二分,妈的一个都套不进去,绝望了,最后半小时,。。。。。

最后题解就是先顺着我的思路下去,然后就是求一遍a[i]-i后求一次LIS(这个我还真想到了,但是我求的是最长上升序列,不是最长不下降序列),无语了。

 #include<cstdio>
 #include<cmath>
 #include<iostream>
 #include<algorithm>
 #include<cstring>
 using namespace std; 

 ; 

 int n,cnt;
 int a[NN],vis[NN],pre[NN];
 struct node
 {
     int left,right;
     ;}
 }tree[NN];
 void dfs(int num)
 {
     ) dfs(tree[num].left);
     vis[++cnt]=a[num];
     ) dfs(tree[num].right);
 }
 void mid_find(int x)
 {
     ,r=cnt;
     while (l<r)
     {
         mid=(l+r)/;
         ;
         else r=mid;
     }
     if (pre[l]>x) pre[l]=x;
     else pre[++cnt]=x;
 }
 int main()
 {
     scanf("%d",&n);
     ;i<=n;i++)
     {
         scanf("%d",&a[i]);
         tree[i].init();
     }
     int x,y;
     ;i<=n;i++)
     {
         scanf("%d%d",&x,&y);
         ) tree[x].left=i;
         else tree[x].right=i;
     }
     cnt=;
     memset(vis,,sizeof(vis));
     memset(pre,,sizeof(pre));
     dfs();
     ;i<=n;i++)
         vis[i]-=i;
     cnt=,pre[cnt]=vis[];
     ;i<=n;i++)
         mid_find(vis[i]);
     cout<<n-cnt<<endl;
 } 

问题 B: 数字对

时间限制: 2 Sec  内存限制: 256 MB
提交: 307  解决:
101
[提交][状态][讨论版]

题目描述

小H是个善于思考的学生,现在她又在思考一个有关序列的问题。

她的面前浮现出一个长度为n的序列{ai},她想找出一段区间[L, R](1 <= L <= R <= n)。

这个特殊区间满足,存在一个k(L <= k <= R),并且对于任意的i(L <= i <= R),ai都能被ak整除。这样的一个特殊区间 [L, R]价值为R - L。

小H想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢?这些区间又分别是哪些呢?你能帮助她吧。

输入

第一行,一个整数n.

第二行,n个整数,代表ai.

输出

第一行两个整数,num和val,表示价值最大的特殊区间的个数以及最大价值。

第二行num个整数,按升序输出每个价值最大的特殊区间的L.

样例输入

5
4 6 9 3 6

样例输出

1 3
2

提示

【样例输入2】

5

2 3 5 7 11

【样例输出2】

5 0

1 2 3 4 5

【数据范围】

30%: 1 <= n <= 30 , 1 <= ai <= 32.

60%: 1 <= n <= 3000 , 1 <= ai <= 1024.

80%: 1 <= n <= 300000 , 1 <= ai <= 1048576.

100%: 1 <= n <= 500000 , 1 <= ai < 2 ^ 31.

这题思维主要来自于陈载元,他说暴力过了,然后我就打了个n^2,但我仔细想过,绝对不会到N^2的,因为枚举每个点,从前往后扫和从后往前扫时如果不是最小的数怕几个就扫完了,而且还要考虑能否整除的关系,所以还是可以行的通的。

 #include<cstdio>
 #include<cmath>
 #include<cstring>
 #include<algorithm>
 #include<iostream>
 using namespace std; 

 ; 

 int n;
 int a[NN]; 

 bool cmp(int x,int y)
 {
     return x<y;
 }
 int main()
 {
     scanf("%d",&n);
     ;i<=n;i++)
         scanf("%d",&a[i]);
     int maxlen=-NN;
     ,b[NN];
     c[]=-;
     ;i<=n;i++)
     {
         ,k=i+;
         ) {) break;j--;}
         ) break;k++;}
         j++,k--;
         k=k-j;
         if (k>maxlen)
         {
             cnt=;
             maxlen=k;
             c[++cnt]=j;
         }
         else if (k==maxlen) c[++cnt]=j;
     }
     sort(c+,c+cnt+,cmp);
     ;
     ;i<=cnt;i++)
         ]) b[++num]=c[i];
     cout<<num<<' '<<maxlen<<endl;
     ;i<num;i++)
         cout<<b[i]<<' ';
     cout<<b[num]<<endl;
 } 

交换

时间限制: 1 Sec  内存限制: 256 MB
提交: 167  解决: 47
[提交][状态][讨论版]

题目描述

给定一个{0, 1, 2, 3, … , n - 1}的排列 p。一个{0, 1, 2 , … , n - 2}的排列q被认为是优美的排列,当且仅当q满足下列条件:

对排列s = {0, 1, 2, 3, ..., n - 1}进行n – 1次交换。

<!--[if
!supportLists]-->1.      
<!--[endif]-->交换s[q0],s[q0 + 1]

<!--[if
!supportLists]-->2.      
<!--[endif]-->交换s[q1],s[q1 + 1]

最后能使得排列s = p.

问有多少个优美的排列,答案对10^9+7取模。

输入

第一行一个正整数n.

第二行n个整数代表排列p.

输出

仅一行表示答案。

样例输入

3
1 2 0

样例输出

1

提示

【样例解释】

q = {0,1} {0,1,2} ->{1,0,2} -> {1, 2, 0}

q = {1,0} {0,1,2} ->{0,2,1} -> {2, 0, 1}

【数据范围】

30%:  n <= 10

100%:  n <= 50

这道题考试的时候没怎么去想,因为****的第一题关系,然后第三题随便 暴力了一下,还编译错误。听力班长wsj大神的讲解后,算是大概理解了,实现了一下,也是一次AC

题意就是给你一个序列,问有多少种完美序列可以从原序列(0,1,2,n-1)推过来,完美序列是什么还和它的次序,有关,,自己理解为主。

然后就可以发现交换a[i]和a[i+1]后i前面和i后面就断绝联系了,前面的无法到后面,后面的无法到前面,然后就可以进行DP如果可以交换,就进行一次dfs,因为完美序列和次序有关,

然后就是累加,记忆化搜索就可以了,n^4 随便过这里有C数组的预处理,好好学学才行。

 #include<cstdio>
 #include<cmath>
 #include<iostream>
 #include<algorithm>
 #include<cstring>
 using namespace std;

 ,MOD=1e9+;

 int n;
 int p[NN];
 };

 long long dfs(int l,int r)
 {
     ;
     ) return f[l][r];
     ;;}
     f[l][r]=;
     for (int i=l;i<r;i++)
     {
         ];
         int right=p[i];
         for (int j=l;j<i;j++)left=max(p[j],left);
         ;j<=r;j++)right=min(right,p[j]);
         if (left<right)
             {
                 swap(p[i],p[i+]);
                 f[l][r]=(f[l][r]+dfs(l,i)*dfs(i+,r)%MOD*c[r-l-][i-l])%MOD;
                 swap(p[i],p[i+]);
             }
     }
     return f[l][r];
 }
 int main()
 {
     scanf("%d",&n);
     ;i<=n;i++)
         scanf("%d",&p[i]);
     ;i<=n;++i)
     {
         c[i][]=;
         ;j<=i;++j)
             c[i][j]=(c[i-][j-]+c[i-][j])%MOD;
     }
     memset(f,-,sizeof(f));
     ,n);
     printf("%d",ans);
 }

NOIP2017SummerTraining0717的更多相关文章

随机推荐

  1. H5性能测试学习

    工欲善其事,必先利其器,在做H5前端性能测试之前,选择合适的工具能让我们的测试工作事半功倍.本文要提到的工具有两类: 一类是抓包工具,如Fiddler.Charles等.这类工具不仅可以抓包,还可以对 ...

  2. XMind与MindManager哪个好(网易云课堂老师:Array老师讲解稿)

    XMind与MindManager哪个好 作者:网易云课堂老师:Array老师讲解稿 思维导图是一种将放射性思考具体化的方法,可以将人们的创造性思维及时捕捉并呈现,深受商业人士的喜爱.目前,XMind ...

  3. 基于SSM实现的简易员工管理系统(网站上线篇)

    经历无数苦难,好不容易,网站终于上线了.=.=内牛满面ing.chengmingwei.top就是本员工管理系统的主页啦.是的,很简陋,但是毕竟是第一次嘛,所以慢慢来嘛. 如上次所说的(网站简介,见: ...

  4. 程序员也是弱势群体?——从WePhone开发者事件说起

    作为一名不爱凑热闹的人,今天一直在持续关注一个热点事件--WePhone开发者自杀,即使前几天热议的孕妇跳楼新闻我都不太关注,但是这个事件却让我深深的震撼,花了几个小时在微博上搜索了相关的信息,去了解 ...

  5. RMI和socket详解

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp58   一般来说,基于CS(client-server)软件架构的开发技 ...

  6. 【打死树莓派】-树莓派3代jessie+Opencv-解决安装不了libgtk2.0-dev包问题

    按照国际法先贴问题 Some packages could not be installed. This may mean that you have requested an impossible ...

  7. IOS学习【VMware 12 安装 Mac OS X 10.11】-Day1

    1.下载安装VMware 12 pro  (32位不能安装) 虚拟机 VM12密钥 5A02H-AU243-TZJ49-GTC7K-3C61N 2.unlock206 用于VMware 12识别tac ...

  8. Ubuntu linux安装putty

    Step1 安装Putty $ sudo apt-get install putty Step2 使用Putty Client 查找已经安装完的putty客户端 设置Remote Server的IP地 ...

  9. 新CCIE笔记-IP网络基础

    南京捷式泰CCIE重修笔记:更完善更系统的全新笔记 新增内容: 总结.关联知识点.行业小建议 各种认证证书: RHCE VCP OCP MCSEPMP ITIL CCA CCIE CCNP CCNA ...

  10. mac环境下安装mysql

    一,下载mysql 官网"Community " 下会看到"MySQL Community Server"下方有一个"download"点击 ...