csps模拟69chess,array,70木板,打扫卫生题解
题面:https://www.cnblogs.com/Juve/articles/11663898.html
69:
本以为T2傻逼题结果爆零了。。。T3原题虽然打的不是正解复杂度但是都不记得做过这道题。。。
T1:组合数dp,发现i列与n+i列棋子个数一样,所以可以dp转移
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=;
const int mod=1e9+;
int n,m,c,ans=,dp[MAXN][MAXN*MAXN];
int fac[MAXN],inv[MAXN],g[MAXN][MAXN];
inline int q_pow(re int a,re int b,re int p){
a%=p;
re int res=;
while(b){
if(b&) res=res*a%p;
a=a*a%p;
b>>=;
}
return res%p;
}
void get_c(int N){
fac[]=fac[]=inv[]=inv[]=;
for(int i=;i<=N;++i) fac[i]=fac[i-]*i%mod;
inv[N]=q_pow(fac[N],mod-,mod);
for(int i=N-;i>=;--i) inv[i]=inv[i+]*(i+)%mod;
}
int C(int n,int m){
if(n<m) return ;
if(n==m||m==) return ;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&c);
get_c(n);
for(int i=;i<=n;++i){
for(int j=;j<=n;++j)
g[i][j]=q_pow(C(n,i),(m-j)/n+,mod)%mod;
}
dp[][]=;
for(int i=;i<=n;++i){
for(int j=;j<=min(n*i,c);++j)
for(int t=;t<=min(n,j);++t)
dp[i][j]=(dp[i][j]+dp[i-][j-t]*g[t][i]%mod)%mod;
}
printf("%lld\n",dp[n][c]);
return ;
}
array:
暴力思路:对于当前的位置i,在i前面找出第一个比a[i]大的位置j,然后在j到i中找最小值出现的位置就是i的答案
考虑优化,单调栈,维护单调递减的栈,每次pop时更新答案
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e7+;
inline int read(){
re int x=;re char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'',ch=getchar();}
return x;
}
int n,a[MAXN],ans=,sta[MAXN],top=,pos[MAXN];
signed main(){
n=read();++n;
a[]=0x7fffffff;
for(int i=;i<=n;++i) a[i]=read();
sta[++top]=,pos[]=;
for(int i=;i<=n;++i){
pos[i]=i;
while(top&&a[i]>=a[sta[top]]){
if(a[pos[i]]>=a[pos[sta[top]]])
pos[i]=pos[sta[top]];
--top;
}
sta[++top]=i;
ans=max(ans,i-pos[i]+);
}
printf("%lld\n",ans);
return ;
}
70:
上来一看T1好像是高考数学,打了个表,发现的规律,然后A了,T3只会dfs搜索
T2一个可以优化成根号的dp,但是考场上状态定义错了,始终想不出转移,搜索又不好打,于是打了个40分骗分?
T1:
打表找规律,答案就是n的最大平方因子减一再乘上8
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
int n,ans=;
signed main(){
while(~scanf("%lld",&n)){
if(n==) break;
int t=sqrt(n);
for(int i=t;i>=;--i){
if(n%(i*i)==){
ans=i-;
break;
}
}
printf("%lld\n",*ans);
ans=;
}
return ;
}
T2:
考虑dp,设f[i]表示前i个的最小贡献,枚举i,然后从i-1反向枚举j,统计i到j出现的多少数,记为x,则:
f[i]=min(f[j]+x2)
然后减枝,如果x2大于f[i]就break
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=4e4+;
int n,m,a[MAXN],f[MAXN],vis[MAXN];
signed main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
f[]=;
for(int i=;i<=n;++i){
f[i]=0x7fffffff;
vis[a[i]]=i;
int x=;
for(int j=i-;j>=;--j){
if(vis[a[j]]!=i){
vis[a[j]]=i;
f[i]=min(f[i],f[j]+x*x);
if(x*x>=f[i]) break;
++x;
}
}
}
printf("%d\n",f[n]);
return ;
}
csps模拟69chess,array,70木板,打扫卫生题解的更多相关文章
- 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼
T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...
- [CSP-S模拟测试]:array(单调栈)
题目描述 在放完棋子之后,$dirty$又开始了新的游戏. 现在他拥有一个长为$n$的数组$A$,他定义第$i$个位置的分值为$i−k+1$,其中$k$需要满足: 对于任意满足$k\leqslant ...
- csp-s模拟测试61砖块, 数字,甜圈题解
题面:https://www.cnblogs.com/Juve/articles/11626350.html 砖块: 直接模拟即可,map统计被覆盖的次数 #include<iostream&g ...
- csp-s模拟测试56Merchant, Equation,Rectangle题解
题面:https://www.cnblogs.com/Juve/articles/11619002.html merchant: 二分答案,贪心选前m大的 但是用sort复杂度不优,会T掉 我们只是找 ...
- csp-s模拟测试54x,y,z题解
题面:https://www.cnblogs.com/Juve/articles/11606834.html x: 并差集,把不能分到两个集合里的元素和并到一起,设连通块个数为cnt,则答案为:$2^ ...
- csp-s模拟47 Emotional Flutter,Endless Fantasy题解
题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...
- csp-s模拟测试53u,v,w题解
题面:https://www.cnblogs.com/Juve/articles/11602450.html u: 用差分优化修改 二维差分:给(x1,y1),(x2,y2)加上s: $d[x1][y ...
- csp-s模拟测试51(b)attack,tree题解
题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...
- 「10.12」木板(数学)·打扫卫生(神仙DP)
A. 木板 一个很简单的数学题,简单推一下就好,路丽姐姐教你学数学. 将式子化出我们发现只需求出$i\times i/n$的个数 那么我们将$n$质因数分解,可知因子个数 为了整除$n$,令$i==\ ...
随机推荐
- 基于Netty的RPC架构学习笔记(一):NIO
文章目录 传统的socket分析 举个
- class11_messagebox 弹窗
最终的运行效果图(程序见序号2) #!/usr/bin/env python# -*- coding:utf-8 -*-# -------------------------------------- ...
- (转)Python学习笔记(1)__name__变量
Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行.每个文件(模块)都可以任意写一些没有缩进的代码,并在载入时自动执行.为了区分 主执行代码和被调用文件,Python引入 ...
- 来个我一起学习Python把!!!(新手共同努力)
<初识Python> 大家好,让我们一起来学习Python,因本人也是个新手但我会把我所学的东西分享出来,并记录自己的经验学习过程,不单单是分享代码,会详细的讲解,如有错误地方希望大家指点 ...
- Python高级核心技术97讲✍✍✍
Python高级核心技术97讲 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...
- RHEL7中网卡绑定team和bond的区别
red hat 官方给出的team和bond特性对比 A Comparison of Features in Bonding and Team Feature Bonding Team broadca ...
- JDBC_数据库连接池DRUID
/** * @Description: TODO(这里用一句话描述这个类的作用) * @Author aikang * @Date 2019/8/26 20:12 */ /* 1.数据库连接池: 1. ...
- iOS开发系列-应用程序之间跳转
概述 常见的涉及到应用程序之间的跳转场景,比如社交分享.支付宝.微信支付.链接跳转到应用. 在iOS中应用跳转的本质:打开一个应用只需要拿到对应应用的URL即可. 统一资源定位符 URL(统一资源定位 ...
- boost 条件变量
// boost 条件变量 // 做个简单的笔记 #include <boost/thread/mutex.hpp> #include <boost/thread/condition ...
- stelller插件与background-attachment配合使用,制作滚动页面
stelller插件与background-attachment:fixed配合使用,制作滚动页面