一如既往的垃圾,又回到了那个场场垫底的自己,明明考场上都想到正解了,但是就是拿不到分,可能是互奶把rp用光了吧以后一定加强训练代码能力。

T1:

考场上一直yy矩阵快速幂,虽然自己矩阵快速幂一点都不会还是硬着头皮yy,发现不可做之后并没有及时转化思路,但其实自己预处理的数组就是正解。

切记:不仅矩阵快速幂是log的,普通快速幂也是2333

然后这题其实很水啊,我们设$dp[i][j]$为前$i$列放$j$个棋子的方案数,然后枚举最后一列放多少个棋子就好了。

转移方程为$dp[i][j]=\sum{dp[i-1][j-k]*C_n^k}$,这样转移m列显然不行,考虑性质,第$i$列和第$i+kn$列的摆放方式一定相同,所以后面的组合数乘还有多少这样的列就好了即${C_n^k}^{\frac{m-i}{n}+1}$,但这样的复杂度是$O(n^4logn)$的,发现组合数可以预处理,于是去掉了log

 #include<bits/stdc++.h>
using namespace std;
const int N=1e5+,mod=1e9+;
#define int long long
int n,m,c,fac[N],inv[N];
int f[][*],pre[][*];
int min(int a,int b){
return a<b?a:b;
}
int qpow(int a,int b){
int ans=;
while(b){
if(b&) ans=ans*a%mod;
b>>=;
a=a*a%mod;
}
return ans%mod;
}
int C(int a,int b){
return fac[a]*inv[b]%mod*inv[a-b]%mod;
}
signed main(){
fac[]=;
for(int i=;i<=;++i) fac[i]=fac[i-]*i%mod;
inv[]=qpow(fac[],mod-);
for(int i=;i;--i) inv[i-]=inv[i]*i%mod;
scanf("%lld%lld%lld",&n,&m,&c);
f[][]=;
for(int i=;i<=n;++i) for(int j=;j<=max(n,c);++j) pre[i][j]=qpow(C(n,j),(m-i)/n+)%mod;
// for(int i=1;i<=n;++i,cout<<endl) for(int j=1;j<=n;++j) cout<<pre[i][j];
for(int i=;i<=n;++i){
for(int j=;j<=c;++j){
for(int k=;k<=min(n,j);++k){
(f[i][j]+=f[i-][j-k]*pre[i][k]%mod)%=mod;
// cout<<pre[i][k]<<" "<<qpow(C(n,k),(m-i)/n+1)<<endl;
}
}
}
printf("%lld",f[n][c]%mod);
}
/*
2 3 1
*/

chess

T2:

考场上先想到单调栈,但是后来成功理解错题意对拍5w组WA0 2333。

如果理解对题意的话单调栈就挺明显了吧,肯定要找它前面第一各比他大的,那么答案一定在这段区间中,有一个比较明显的贪心就是,最优决策点一定是在,高度最小的那个点,稍想一下就可以明白。

所以在弹栈的时候每次更新,高度最小的下标即可。

对于输入量大的题,快读真的很有必要。

 #include<bits/stdc++.h>
using namespace std;
const int N=1e7+;
pair<int,int > s[N];
int a[N],sta[N],top;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline int read(){
register int p=;register char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') p=(p<<)+(p<<)+ch-,ch=getchar();
return p;
} int main(){
int n;
scanf("%d",&n);++n;
for(register int i=;i^n;++i) a[i]=read();
// for(int i=1;i<=n;++i) s[i].first=a[i],s[i].second=i;
sta[++top]=;a[]=0x7fffffff;
register int ans=;
for(register int i=;i^n;++i){
s[i]=make_pair(a[i],i);
while(a[i]>=a[sta[top]]){
s[i]=min(s[i],s[sta[top--]]); }ans=max(ans,i-s[i].second+);
sta[++top]=i;
}
printf("%d",ans);
}

array

T3:

回滚莫队裸题。

就维护两个数组now1,now2,分别代表x向左向右能伸展的最长连续值域。

分别用x+1,x-1更新。还有就是更新一下这整段区间的左右端点以保证以后更新答案正确,中间的不用更新因为不会在插入了。

当这个区间左端点和上一个区间左端点不一样时,直接清空你now1,now2数组。

做完了之后觉的理解更加深入了。

放个回滚莫队讲解链接

 #include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
int blo[N];
int sta1[N],sta2[N],top;
struct node{
int l,r,id,ld;
bool friend operator < (node a,node b){
return blo[a.l]==blo[b.l]?(a.r<b.r):blo[a.l]<blo[b.l];
}
}ask[N];
int now1[N],now2[N],a[N],ans[N];
int main(){
//freopen("ants1.in","r",stdin);
//freopen("my.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
int size=sqrt(n);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
for(int i=;i<=m;++i){
scanf("%d%d",&ask[i].l,&ask[i].r);
ask[i].id=i;
ask[i].ld=(ask[i].l-)/size+;
}
for(int i=;i<=n/size+;++i){
for(int j=size*(i-)+;j<=size*i;++j) blo[j]=i;
}
sort(ask+,ask+m+);
int r=,l=,res=;
for(int i=;i<=m;++i){
if(ask[i].ld!=ask[i-].ld){
for(int j=;j<=n;++j) now1[j]=now2[j]=;
res=;
l=r=ask[i].ld*size;
}
while(ask[i].r>r){
++r;
int x=a[r];
now1[x]=now1[x+]+;
now2[x]=now2[x-]+;
int kh=now1[x]+now2[x]-;
now1[x-now2[x]+]=kh;
now2[x+now1[x]-]=kh;
res=max(kh,res);
}
top=;
int tmp=res;
for(int j=ask[i].l;j<=min(ask[i].r,l);++j){
int x=a[j];
now1[x]=now1[x+]+;
now2[x]=now2[x-]+;
int kh=now1[x]+now2[x]-;
sta1[++top]=x-now2[x]+;
sta2[top]=now1[x-now2[x]+];
sta1[++top]=x+now1[x]-;
sta2[top]=now2[x+now1[x]-];
now1[x-now2[x]+]=kh;
now2[x+now1[x]-]=kh;
tmp=max(kh,tmp);
}
for(int j=top;j;--j){
if(j&) now1[sta1[j]]=sta2[j];
else now2[sta1[j]]=sta2[j];
}
for(int j=ask[i].l;j<=min(l,ask[i].r);++j){
now1[a[j]]=;
now2[a[j]]=;
}
ans[ask[i].id]=tmp;
}
for(int i=;i<=m;++i) printf("%d\n",ans[i]);
}

ants

CSP-S模拟测试69 题解的更多相关文章

  1. CSP-S 模拟测试94题解

    T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...

  2. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  3. CSP-S 模拟测试92 题解

    话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...

  4. CSP-S 模拟测试57题解

    人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...

  5. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

  6. CSP-S 模拟测试 45 题解

    由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...

  7. [CSP-S模拟测试97]题解

    A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...

  8. [CSP-S模拟测试96]题解

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

  9. [CSP-S模拟测试92]题解

    A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...

随机推荐

  1. 把axios挂载到vue实例上面/==Axios 各种请求方式传递参数格式

    /*ajax请求*/   import axios from 'axios'   axios.defaults.baseURL = 'https://api.douban.com/v2/movie' ...

  2. asp.net core-2.在vs2017中创建asp.net core应用程序

    今天我们用vs2017创建一个asp.net core 的应用程序,打开vs2017 点击:文件—>项目,选择asp.net core web 应用程序 点击确定 红框内就昨天用控制台去创建的应 ...

  3. 谈jdbcTemplate与mybatis

    为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的 ...

  4. XML和JSON序列化以及反序列化

    1.将文件保存序列化至文档中,然后再读取: //首先创建可序列化的实体类 [Serializable] public class Message { public string Name { get; ...

  5. Quartz任务调度:MisFire策略和源码分析

    Quartz是为大家熟知的任务调度框架,先看看官网的介绍: ---------------------------------------------------------------------- ...

  6. [NOIP2018模拟赛10.20A]挂分报告

    闲扯 先看看了B组,T1 ZROI刚好讲过一个性质原根一般很小的,直接枚举;T2一眼二分然后似乎状压 T3没看 然后上来A组题,T1 flow这名字...网络流?! T1题面非常的社会主义核心价值观, ...

  7. 前端知识总结--js异步事件顺序

    js中异步事件中容易混淆的 Promise 和 setTimeout 的执行顺序是怎样的? setTimeout(() => console.log(1), 0); new Promise(fu ...

  8. ASE19团队项目 beta阶段 model组 scrum1 记录

    本次会议于12月2日,18时30分在微软北京西二号楼sky garden召开,持续25分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...

  9. man手册--iostat

    iostat手册 IOSTAT(1) Linux User's Manual IOSTAT(1) NAME iostat - Report Central Processing Unit (CPU) ...

  10. Flutter中的普通路由与命名路由(Navigator组件)

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...