Problem 1 Graph (graph.cpp/c/pas)

【题目描述】

给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点。

【输入格式】

第 1 行,2 个整数 N,M。 接下来 M 行,每行 2 个整数 Ui,Vi,表示边 ⟨Ui,Vi⟩。点用 1,2,...,N 编号。

【输出格式】

N 个整数 A(1),A(2),...,A(N)。

【样例输入】

4 3

1 2

2 4

4 3

【样例输出】

4 4 3 4

【数据范围】

对于 60% 的数据,1 ≤ N,K ≤ 10^3

对于 100% 的数据,1 ≤ N,M ≤ 10^5。

Problem 2 Incr(incr.cpp/c/pas)

【题目描述】

数列 A1,A2,...,AN,修改最少的数字,使得数列严格单调递增。

【输入格式】

第 1 行,1 个整数 N

第 2 行,N 个整数 A1,A2,...,AN

【输出格式】

1 个整数,表示最少修改的数字

【样例输入】

3

1 3 2

【样例输出】

1

【数据范围】

对于 50% 的数据,N ≤ 10^3

对于 100% 的数据,1 ≤ N ≤ 10^5,1 ≤ Ai ≤ 10^9

Problem 3 Permutation (permutation.cpp/c/pas)

【题目描述】

将 1 到 N 任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。

问在所有排列中,有多少个排列恰好有K个“<”。

例如排列(3, 4, 1, 5, 2)

3 < 4 > 1 < 5 > 2

共有2个“<”

【输入格式】

N,K

【输出格式】

答案

【样例输入】

5 2

【样例输出】

66

【数据范围】

20%:N <= 10

50%:答案在0..2^63-1内

100%:K < N <= 100


NOIP复习题旨在复习知识点,故写详细一点啦

T1:

强联通分量缩点的裸题(我当时竟然以为第一题应该不会太难而没考虑环,结果40分炸掉QAQ)

我用的是Kosaraj+dfs缩点,效率很低

不过还是写一下吧,反正我不会tarjan~

先是两遍深搜获取基本信息,然后再一遍深搜把各个缩点连接起来

最后一遍拓扑排序。

总共四边搜索,四次清空bool数组,三个邻接表

程序太垃圾啦~

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 100005
using namespace std;
vector<int> G[MAXN];
vector<int> rG[MAXN];
vector<int> nG[MAXN];
vector<int> vs;
int cmp[MAXN],cnt;
int m[MAXN];
int b[MAXN];
int ru[MAXN];
int V,E;
void dfs1(int x){
b[x]=;
for(int i=;i<G[x].size();i++){
int y=G[x][i];
if(!b[y]){
dfs1(y);
}
}
vs.push_back(x);
}
void dfs2(int x){
b[x]=;
cmp[x]=cnt;
m[cnt]=max(m[cnt],x);
for(int i=;i<rG[x].size();i++){
int y=rG[x][i];
if(!b[y]){
dfs2(y);
}
}
}
void suo(int x){
b[x]=;
for(int i=;i<G[x].size();i++){
int y=G[x][i];
if(cmp[x]!=cmp[y]){
nG[cmp[x]].push_back(cmp[y]);
ru[cmp[y]]++;
}
if(!b[y]){
suo(y);
}
}
}
void topoSort(int x){
b[x]=;
for(int i=;i<nG[x].size();i++){
int y=nG[x][i];
if(!b[y]){
topoSort(y);
}
m[x]=max(m[x],m[y]);
}
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d%d",&V,&E);
for(int i=;i<=E;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
rG[y].push_back(x);
}
memset(b,,sizeof(b));
for(int i=;i<=V;i++){
if(!b[i]){
dfs1(i);
}
}
memset(b,,sizeof(b));
for(int i=vs.size()-;i>=;i--){
cnt++;
int x=vs[i];
if(!b[x]){
dfs2(x);
}
}
memset(b,,sizeof(b));
for(int i=;i<=V;i++){
if(!b[i]){
suo(i);
}
}
memset(b,,sizeof(b));
for(int i=;i<=cnt;i++){
if(!ru[i]){
topoSort(i);
}
}
for(int i=;i<=V;i++){
printf("%d ",m[cmp[i]]);
}
return ;
}

Code1


T2:

其实就是n-最大上升序列长度即可

证明如下:

设m=n-最长上升序列长度

1)改变m次一定足以使数列递增

2)改变不到m次一定不足以使数列递增

依次证明:

1)显然成立。。。

2)不到m次,那么就设为x吧(x<m)

那么假设x次操作改变的数列项为b1,b2,……,bx

无视这x项,剩余的项数一定是递增的,即此时上升序列长度为n-x

出现了矛盾:最长上升序列=n-m<n-x

于是得证

然后问题是最长上升序列我竟然有点忘记了

巩固一下:

建立单调栈,使得a[i]<a[i+1]

对于新插入的元素a[i],查找大于等于(注意这里是大于等于,因为是严格递增的,所以不能出现相同)第一个a[Pos]

f[i]=f[Pos-1]+1,然后直接用a[i]更新a[Pos],原因a[i]和a[Pos]的f相同的,但a[i]<=a[Pos],所以状态会更优

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
#define pii pair<int,int>
using namespace std;
pii s[MAXN];
int top=;
int a[MAXN];
int f[MAXN];
int n;
int max_array(){
int ret=;
for(int i=;i<=n;i++){
pii t=make_pair(a[i],);
// lower_bound the key should be the same
int Pos=lower_bound(s+,s+top+,t)-s;
f[i]=s[Pos-].second+;
ret=max(f[i],ret);
if(Pos>top){
top++;
}
s[Pos]=make_pair(a[i],f[i]);
}
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
int len=n-max_array();
printf("%d\n",len);
return ;
}

Code2


T3:

这题我做过啊

f[i][j]=f[i-1][j-1]*(i-j)+f[i-1][j]*(j+1)

边界f[1~n][0]=1

关键就是复习一下高精度了

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 105
#define SIZE 1000
using namespace std;
struct BigInt{
int len;
int s[SIZE];
BigInt(){
len=;
memset(s,,sizeof(s));
}
BigInt operator = (const BigInt &A){
len=A.len;
for(int i=;i<=len;i++){
s[i]=A.s[i];
}
return *this;
}
friend BigInt operator * (const BigInt &A,const int B){
BigInt t;
t=A;
int L=t.len;
for(int i=;i<=L;i++){
t.s[i]*=B;
}
for(int i=;i<=L;i++){
t.s[i+]+=(t.s[i]/);
t.s[i]%=;
}
while(t.s[L+]){
L++;
t.s[L+]+=(t.s[L]/);
t.s[L]%=;
}
t.len=L;
return t;
}
friend BigInt operator + (const BigInt &A,const BigInt &B){
BigInt t;
t.len=max(A.len,B.len);
int L=t.len;
for(int i=;i<=L;i++){
t.s[i]=A.s[i]+B.s[i];
}
for(int i=;i<=L;i++){
t.s[i+]+=(t.s[i]/);
t.s[i]%=;
}
if(t.s[L+]){
L++;
}
t.len=L;
return t;
}
void Print(){
for(int i=len;i>=;i--){
printf("%d",s[i]);
}
printf("\n");
} }f[MAXN][MAXN];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
f[i][].len=,f[i][].s[]=;
}
for(int i=;i<=n;i++){
for(int j=;j<n;j++){
f[i][j]=f[i-][j-]*(i-j)+f[i-][j]*(j+);
}
}
f[n][k].Print();
return ;
}

Code3

总结:基础知识很重要啊,要不然真是有苦说不出。。。

2014-10-30NOIP复习题1的更多相关文章

  1. Contest - 2014 SWJTU ACM 手速测试赛(2014.10.31)

    题目列表: 2146 Problem A [手速]阔绰的Dim 2147 Problem B [手速]颓废的Dim 2148 Problem C [手速]我的滑板鞋 2149 Problem D [手 ...

  2. Linux - Eclipse CDT + GCC 安装(2014.10.2)

    Eclipse CDT + GCC 安装 (2014.10.2) 本文地址:http://blog.csdn.net/caroline_wendy 1. 安装Eclipse,在官方站点下载Eclips ...

  3. App Store审核指南中文版(2014.10.11更新)

    App Store审核指南中文版(2014.10.11更新) 2014-10-11 16:36 编辑: suiling 分类:AppStore研究 来源:CocoaChina  2 8657 App ...

  4. phpStudy + JspStudy 2014.10.02 下载

    phpStudy + JspStudy 2014.10.02 下载 目标:让天下没有难配的php环境. phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Teng ...

  5. 2014.10.5 再次学习LINUX

    mesg 发送信息给root y n write/talk 写消息给 wall 给所有用户发送消息 ps -aux ps -elF pstree 命令行跳转:CTRL+a行首 CTRL+e行尾 CTR ...

  6. iPhone屏幕适配,历史及现状(http://hjcapple.github.io/2014/10/10/iphone-screen.html)

    iPhone屏幕适配,历史及现状 初代iPhone 2007年,初代iPhone发布,屏幕的宽高是320×480像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS的也保持不变 ...

  7. Cheatsheet: 2014 10.01 ~ 10.30

    .NET ASP.NET Web Api: Unwrapping HTTP Error Results and Model State Dictionaries Client-Side HTTP 20 ...

  8. 2014.10.09 Andrew 学习 WPF(刘铁锰) 笔记分享

    引言 主要是讲了关于WPF只是表现层的工具. 第一章: XAML : 可扩张应用程序标记语言    Extensible Application Markup Language 什么是XAML?  X ...

  9. 基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现(by 低端农业代码 2014.10.27)

    介绍 技术原因写这篇文章,有两种: 一个是在大多数在线叙述性说明发现PLT/GOT第二十符号重定向过程定向x86的,例<Redirecting functions in shared ELF l ...

  10. Teamproject Week7 --Scrum Meeting #1 2014.10.28

    这是团队的第一次会议,具体议题如下: 1)我们明确了团队成员的职责所需: PM职责:根据项目范围.质量.时间与成本的综合因素的考虑,进行项目的总体规划与阶段计划.  控制项目组各成员的工作进度,即时了 ...

随机推荐

  1. nyoj 黑色帽子

    黑色帽子 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述         最近发现了一个搞笑的游戏,不过目前还没玩过.一个舞会上,每个人头上都戴着一顶帽子,帽子只有黑 ...

  2. java中DelayQueue的一个使用陷阱分析

    最近工作中有接触到DelayQueue,网上搜索资料的时候发现一篇文章谈到DelayQueue的坑.点击打开链接 文中已经总结了遇到坑的地方,还有解决方案.不过我第一眼看一下没弄明白为什么,所以翻了翻 ...

  3. JAVA_SE基础——33.this关键字的练习

    需求:使用java定义的一个人类,人具备 id ,name ,age 三个属性,还具备一个比较年龄的方法. 要求:必须要写上构造函数,构造函数也必须要使用上this关键字. class Person{ ...

  4. 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结

    初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...

  5. Spark入门(1-5)Spark统一了TableView和GraphView

    下面我们看一下图计算的简单示例: 从图我们可以看出, 拿到Wikipedia的文档后,我们可以: 1.Wikipedia的文档 -- > table视图 -- >分析Hyperlinks超 ...

  6. Linux将端口设置进防火墙的白名单

    1.先检查linux服务器的端口是否被防火墙拦住 `telnet 172.168.1.101 8080后面跟端口号,如果连接上证明是防火墙白名单.如果没有配置 vi /etc/sysconfig/ip ...

  7. Java8新特性第1章(Lambda表达式)

    在介绍Lambda表达式之前,我们先来看只有单个方法的Interface(通常我们称之为回调接口): public interface OnClickListener { void onClick(V ...

  8. 分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等

    游戏是自己整理的邮箱来源于网上,下面是我的有道云的分享地址: https://note.youdao.com/share/?id=c5f258fa9efd1b28b2d8f0d37e59b194&am ...

  9. requests+正则表达式爬取ip

    #requests+正则表达式爬取ip #findall方法,如果表达式中包含有子组,则会把子组单独返回出来,如果有多个子组,则会组合成元祖 import requests import re def ...

  10. Docker 基础技术之 Linux namespace 源码分析

    上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace ...