还有3天,今天考试又崩了。状态还没有调整过来。。。

第一题:小L的二叉树

勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利。但是,小L对数据结构的掌握实在十分渣渣。
所以,小L当时卡在了二叉树。 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch];若其存在右孩子rch,则key[p]<key[rch];注意,本题中的二叉搜索树应满足对于所有结点,其左子树中的key小于当前结点的key,其右子树中的key大于当前结点的key。(因为小L十分喜欢装xx,所以这里他十分装xx的给大家介绍了什么是二叉树和二叉搜索树)。 可是善于思考的小L不甘于只学习这些基础的东西。他思考了这样一个问题:现在给定一棵二叉树,可以任意修改结点的数值。修改一个结点的数值算作一次修改,且这个结点不能再被修改。若要将其变成一棵二叉搜索树,且任意时刻结点的数值必须是整数(可以是负整数或0),所要的最少修改次数。

【数据范围】 20 % :n <= 10 , ai <= 100. 40 % :n <= 100 , ai <= 200 60 % :n <= 2000 . 100 % :n <= 10 ^ 5 , ai < 2 ^ 31.


解:

  考试的时候连题都读错了。。是所有子树而不是一个儿子。。

  然后由左--父--右可知是一个中序遍历。而中序遍历的数值应该是递增的。所以原数值按中序排列,找最长上升序列,再用n减去就是答案了。但是会出现如2,1,3,4的LIS应该是3,但是实际上因为2,3之间只差了1,而数值只能是整数,所以a[i]-=i保证之间还有空位。

  接着,LIS要用nlogn的算法。注意,这里因为已经保证有空位了,所以是最长不下降序列。然后就不再是lower_bound而是upper_bound,因为要修改的应该是第一个比它大的,而不是大于等于它的。如下图:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
#define ll long long
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
int n,idx,dp[maxn];
ll ai[maxn],v[maxn];
struct pp{
int lch,rch;
};
pp tree[maxn];
void dfs(int x)
{
if (tree[x].lch) dfs(tree[x].lch);
v[++idx]=x;
if (tree[x].rch) dfs(tree[x].rch);
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
cin>>n;
for (int i=;i<=n;i++)
scanf(AUTO,&ai[i]);
for (int i=;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if (y==) tree[x].lch=i;
else tree[x].rch=i;
}
dfs();
for (int i=;i<=n;i++)
v[i]=ai[v[i]]-i;///*******
dp[]=;/*
for (int i=2;i<=n;i++)
{
int l=0;
for (int j=1;j<i;j++)
{
if(v[i]>v[j]&&dp[j]>l) l=dp[j];
}
dp[i]=l+1;
}
int ans=0;
for (int i=1;i<=n;i++)
if (dp[i]>ans) ans=dp[i];*/
int ans=;
for (int i=;i<=n;i++)
{
if (v[i]>=dp[ans]) dp[++ans]=v[i];//>=
else {
int pos=upper_bound(dp+,dp++ans,v[i])-dp;
dp[pos]=v[i];
}
}
printf("%d",n-ans);
return ;
}

第二题:小L的牛栏

  小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?)。勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后,凭着自己积累下的浓厚经济学与计算机学的基础,成功建设了一个现代化奶牛场! 奶牛们十分聪明,于是在牛场建围栏时打算和小L斗智斗勇!小L有N种可以建造围栏的木料,长度分别是l1,l2„lN,每种长度的木料无限。
  修建时,他将把所有选中的木料拼接在一起,因此围栏的长度就是他使用的木料长度之和。但是聪明的小L很快发现很多长度都是不能由这些木料长度相加得到的,于是决定在必要的时候把这些木料砍掉一部分以后再使用。
  不过由于小L比较节约,他给自己规定:任何一根木料最多只能削短M米。当然,每根木料削去的木料长度不需要都一样。不过由于测量工具太原始,小L只能准确的削去整数米的木料,因此,如果他有两种长度分别是7和11的木料,每根最多只能砍掉1米,那么实际上就有4种可以使用的木料长度,分别是6, 7,10, 11。
因为小L相信自己的奶牛举世无双,于是让他们自己设计围栏。奶牛们不愿意自己和同伴在游戏时受到围栏的限制,于是想刁难一下小L,希望小L的木料无论经过怎样的加工,长度之和都不可能得到他们设计的围栏总长度。不过小L知道,如果围栏的长度太小,小L很快就能发现它是不能修建好的。因此她希望得到你的帮助,找出无法修建的最大围栏长度。

40 % :1< N<10, 0< M< 300

100 % :1< N< 100, 0< M< 3000


解: 新方法:同余最短路。

  1.首先预处理出所有能搞出来的原始木棍长度,然后找到一个最小的,记为P。如果P=1那就不用做下去了,直接输出-1.
  2.我们把所有的整数按mod P 的值分为P 类(mod P=0,1,2,3,4...P-1),记为集合Q0,Q1,Q2...QP-1。如果集合Qi 中有一个长度len 可以被组合出来,那么该集合中所有比len 大的数也一定可以组合出来.因为是mod P 的,所以len 可以不断加P 来组合出比它大的且和它在同一个集合里的数。根据这个性质就可以找到图论模型了。
  3.我们抽象出P-1 个点,分别表示集合Qi 中最小的能被组合出来的数D[i]。那么把根据原始木棍的长度,可以在这些点之间连边,表示可以从Qi 中的一个数加X 得到Qj中的一个数。跑一遍SPFA找每个集合中的最小能被组合出来的数;

  4、集合Qi 中最大的不能被组合出来的数就是D[i]-P,在这之中找一个最大的不能被组合的。

  5、注意,如果有一个D[i]没被赋值,即这个集合中的所有数都不能被组合,而且是无限大的。所以还是输出-1;

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 3005
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,len[maxn],idx,mi=,ans=;
int q[maxn];
bool can[maxn],b[maxn];
queue<int> que;
void spfa()
{
memset(q,INF,sizeof(q));//赋为最大初值**
q[]=;que.push();b[]=true;
while(!que.empty())
{
int u=que.front();
que.pop();
b[u]=false;
for (int i=;i<=idx;i++)
{
int v=(u+len[i])%mi;
if (q[v]>q[u]+len[i]/*&&!b[v]*/)
{
q[v]=q[u]+len[i];
if (b[v]) continue;//不能写在里面,因为还要更新q[v]
b[v]=true;
que.push(v);
}
}
}
}
int main()
{
freopen("bullpen.in","r",stdin);
freopen("bullpen.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
int x=;
scanf("%d",&x);
for (int j=;j<=m;j++)
{
if (x-j<=) break;
can[x-j]=true;
if (x-j<mi) mi=x-j;
}
}
for (int i=;i<=maxn;i++)
if (can[i]) len[++idx]=i;
if (mi==) {
printf("-1");
return ;
}
spfa();
for (int i=;i<=mi-;i++)
{
if (ans<q[i]) ans=q[i];
if (q[i]>=INF) {
printf("-1");
return ;
}
} printf("%d",ans-mi);
return ;
}

第三题:小L的珍珠挂饰

  小L通过泥萌的帮助,成功解决了牛栏的修建问题。奶牛们觉得主人非常厉害,于是再也不敢偷懒,母牛们奋力挤奶,生娃。子子孙孙无穷匮也!小L于是成为了一代富豪! 但是一直困扰小L的就是单身问题!小L经过长久的寻觅,小L终于找到了一个心仪的漂亮妹子。于是,小L打算在520那天给妹子一个惊喜!(虽然小L很节约,但是对妹子还是很阔绰的!) 小L决定用K种珍珠为妹子做一串举世无双的珍珠垂饰。珍珠垂饰是由珍珠连接而成的,其长度可以认为就是珍珠垂饰上珍珠的个数。小L现在腰缠万贯,每种珍珠他都拥有N颗。根据将珍珠垂饰打开后珍珠不同的排列顺序可以区别不同种类的项链。现在,小L好奇自己可以组成多少种长度为1至N的不同的珍珠垂饰?当然,为显富有,每串珍珠垂饰都要必须由K种珍珠连成。 答案取模1234567891。

40 % :1<= N<=100000, 0<=K<=30

70 % :1<= N<= 1000000000, 0<=K<=30时限 :1000ms

80%~100% :T <= 10, 1<= N<= 1000000000, 0<=K<=30 时限:50ms


解:

  40%:递推。。i 颗珍珠,取 j 种:f[i][j]=f[i-1][j-1]*(k-j+1)【第 i 个取一个新的种类,有k-j+1种取法】+f[i-1][j]*j【第i个取一个与取过的重复的】   初值:f[1][1]=k  f[i][0]=1

  100%:矩阵快速幂。挖坑

 

  

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】的更多相关文章

  1. Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]

    /* 题意:给定一个长度为n的序列a. 两种操作: 1.给定区间l r 加上某个数x. 2.查询区间l r sigma(fib(ai)) fib代表斐波那契数列. 思路: 1.矩阵操作,由矩阵快速幂求 ...

  2. Wannafly Winter Camp 2019.Day 8 div1 E.Souls-like Game(线段树 矩阵快速幂)

    题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵, ...

  3. 线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E

    http://codeforces.com/contest/719/problem/E 题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作 ①对[l,r]区间+一个val ②求出[l ...

  4. CF575A Fibonotci [线段树+矩阵快速幂]

    题意 \(s\{\}\) 是一个循环数列 循环节为 \(n\),你可以改掉 \(m\) 项,这 \(m\) 项独立,且不影响循环节 考虑线段树维护矩阵,单点修改最多m次,每次矩阵快速幂就完事了 // ...

  5. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】

    黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...

  6. 【主席树维护mex】 【SG函数递推】 Problem H. Cups and Beans 2017.8.11

    Problem H. Cups and Beans 2017.8.11 原题: There are N cups numbered 0 through N − 1. For each i(1 ≤ i ...

  7. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  8. Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树

    E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  9. E. Sasha and Array 矩阵快速幂 + 线段树

    E. Sasha and Array 这个题目没有特别难,需要自己仔细想想,一开始我想了一个方法,不对,而且还很复杂,然后lj提示了我一下说矩阵乘,然后再仔细想想就知道怎么写了. 这个就是直接把矩阵放 ...

随机推荐

  1. Android 录音器

    Android自带的mediarecoder录音器不含pause暂停功能,解决方法:录制多个音频片段,最后合成一个文件. 参照 : http://blog.csdn.net/a601445984/ar ...

  2. 【开园 and 计划】

    开园 啊啊啊啊啊啊啊啊,郁闷啊,头一回写博客,一刻钟前保存的草稿为何荡然无存??? 那少废话直击要点:今日乃我开园之日,开园为了改变.为了学习.为了积累. 计划 最长为时 3月,截止到 2016年9月 ...

  3. css动画属性性能

    性能主要表现:流量.功耗与流畅度 在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画. JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案. ...

  4. Hadoop 集群搭建

    Hadoop 集群搭建 2016-09-24 杜亦舒 目标 在3台服务器上搭建 Hadoop2.7.3 集群,然后测试验证,要能够向 HDFS 上传文件,并成功运行 mapreduce 示例程序 搭建 ...

  5. test 2016-12-28

    // dpm(variable_get('node_submitted_page'));// //0// dpm(variable_get('language_count'));// //i3 = i ...

  6. linux centos yum安装LAMP环境

    centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...

  7. solr的增删改查

    solr的配置请查看:http://www.cnblogs.com/byteworld/p/5898651.html 创建Core:(可以复制模版到solrhome\test\conf文件夹中) 简化 ...

  8. Python之路 day2 按行读文件

    #1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: line = fil ...

  9. android 单元测试

    android studio 2.0创建一个空android moudle后, 会出现两个test目录,其中一个是Instrument Test, 另一个则是Unit Test Unit Test 和 ...

  10. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...