比赛时,开了大号去做,算了半天发现不会做A,囧。于是跑去看B,发现很水?于是很快敲完了,但是A不会,没敢交。于是去看C,一直找规律啊,后来总算调了出来,看了一下榜,发现还是算了吧,直接去睡觉了。第二天一起床把代码一交,居然A了,发现交的话rating还能涨一点,囧。

B:其实就是求一个最长不下降子序列的长度。注意到数据范围,使用二分的方式求解。

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull; #define debug puts("here")
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
#define pb push_back
#define RD(n) scanf("%d",&n)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define All(vec) vec.begin(),vec.end()
#define MP make_pair
#define PII pair<int,int>
#define PQ priority_queue
#define cmax(x,y) x = max(x,y)
#define cmin(x,y) x = min(x,y)
#define Clear(x) memset(x,0,sizeof(x))
/* #pragma comment(linker, "/STACK:1024000000,1024000000") int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) ); */ /******** program ********************/ const int MAXN = 100005; int a[MAXN];
int dp[MAXN];
int q[MAXN];
int n; void cc(){
int top = 0;
rep1(i,n){
if(top==0||dp[top]<a[i]){
dp[++top] = a[i];
continue;
}
int l = 1 , r = top;
int ans = 1;
while(l<=r){
int mid = (l+r)>>1;
if(dp[mid]<a[i])
l = mid+1;
else{
ans = mid;
r = mid-1;
}
}
dp[ans] = a[i];
}
cout<<top<<endl;
} int main(){ #ifndef ONLINE_JUDGE
freopen("sum.in","r",stdin);
//freopen("sum.out","w",stdout);
#endif while(cin>>n){
rep1(i,n)
RD(a[i]);
cc();
} return 0;
}

  

C:注意变与不变的部分。

假设现在有位置:1,2,3,4,5,6

需要填入的数为:1,2,3,4,7,8

则可以分成两个部分:右边的可以匹配任意位置。

位置:1,2,3,4  5,6

数:   1,2,3,4  7,8

1.当左边的数1匹配上左边时,不妨假设1-2,则左边消除了两个,右边增加一个:数2可以匹配其他的所有位置

2.当左边的数1匹配上右边时,不妨假设1-5,则左边消除了一个,右边数目不变(消除了5,添加了1)

3.当右边的数7匹配上左边时,不妨假设7-1,则左边消除了一个,右边数目不变(消除了7,添加了1)

4.当右边的数7匹配上右边时,不妨假设7-5,则左边不变,右边数目减少一个

所以可以dp,dp[i][j]表示左边有i个,右边有j个时的方案数。

1.当i=0时,为p[j](p[j]表示j的排列)

2.当i=1时,左边任意匹配右边一位,右边数目不变,因此方案数为为p[j]*j。

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull; #define debug puts("here")
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
#define pb push_back
#define RD(n) scanf("%d",&n)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define All(vec) vec.begin(),vec.end()
#define MP make_pair
#define PII pair<int,int>
#define PQ priority_queue
#define cmax(x,y) x = max(x,y)
#define cmin(x,y) x = min(x,y)
#define Clear(x) memset(x,0,sizeof(x))
/* #pragma comment(linker, "/STACK:1024000000,1024000000") int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) ); */ /******** program ********************/ const int MAXN = 2005;
const int MOD = 1e9+7; ll dp[MAXN][MAXN];
int a[MAXN],n;
bool use[MAXN];
ll p[MAXN]; ll dfs(int x,int y,int res){
if(res<=0) return p[y];
if(x==1)return p[y]*y%MOD;
if(x==0)return p[y];
if(~dp[x][y])return dp[x][y]; ll tmp = (x-1);
tmp *= dfs(x-2,y+1,res-2);
tmp += dfs(x-1,y,res-1)*y;
return dp[x][y] = tmp%MOD;
} int main(){ #ifndef ONLINE_JUDGE
freopen("sum.in","r",stdin);
//freopen("sum.out","w",stdout);
#endif p[0] = p[1] = 1;
for(int i=2;i<MAXN;i++)
p[i] = p[i-1]*i%MOD; while(cin>>n){
Clear(use);
rep1(i,n){
RD(a[i]);
if(~a[i])
use[ a[i] ] = true;
} int x = 0 , y = 0;
rep1(i,n){
if(a[i]==-1){
if(use[i])y ++;
else x ++;
}
} memset(dp,-1,sizeof(dp));
cout<<dfs(x,y,x+y)<<endl;
} return 0;
}

  

最新文章

  1. case when then else end 的用法
  2. lecture10-模型的结合与全贝叶斯学习
  3. CentOS安装rpm包时error:Failed dependencies
  4. LRU 缓冲池 (不考虑多线程)
  5. 《tr命令》-linux命令五分钟系列之六
  6. Framework7功能齐全的 iOS7 App 前端框架
  7. MapReduce的InputFormat学习过程
  8. CodeForces 625B War of the Corporations
  9. HDU 2809 God of War
  10. Codeforces758C
  11. macOS 中使用 phpize 动态添加 PHP 扩展的错误解决方法
  12. React 深入系列1:React 中的元素、组件、实例和节点
  13. C(n,m)排列组合算法
  14. 微信小程序中的组件使用1
  15. Python-生成器_监听文件输入的例子_37
  16. Mysql-8 配置主从复制(基于二进制日志)
  17. ajax使用异步问题
  18. ORACLE 通过连接查询更新 update select
  19. Spark2 Dataset多维度统计cube与rollup
  20. zabbix超级乱码解决问题

热门文章

  1. 广州项目实施步骤I_练习安装 CentOS x64 6.4
  2. Swift学习笔记十四
  3. Codeforces Round #336 (Div. 2)A. Saitama Destroys Hotel 水题
  4. hdu 5264 pog loves szh I 水题
  5. linux C 快速排序法
  6. 大话数据结构—平衡二叉树(AVL树)
  7. JS同名方法,
  8. 【JavaScript】你知道吗?Web的26项基本概念和技术
  9. iOS开发——UI篇Swift篇&amp;UIWebView
  10. 关于CQRS(老外经典好文)