CSP-S模拟测试69 题解
一如既往的垃圾,又回到了那个场场垫底的自己,明明考场上都想到正解了,但是就是拿不到分,可能是互奶把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 题解的更多相关文章
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- [CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...
- [CSP-S模拟测试92]题解
A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...
随机推荐
- (十)easyUI之折叠面板+选项卡+树完成系统布局
一.效果 二 .编码 数据库设计 数据库函数设计,该函数根据父节点id 查询出所有字节点(包括孙子节点) BEGIN #声明两个临时变量 ); ); '; SET tempChd=CAST(rootI ...
- mysql 树结构递归处理
日常开发中我们经常会遇到树形结构数据处理,一般表结构通常会常用id,pid这种设计方案. 之前用oracle.sqlServer数据库,用相应的语法即可获取树形结构数据(oracel:connect ...
- JSQI网站大事表 | Website Landmark
2016-07-01 网站前身jsqi.50vip.com上线.2016-07-12 购买jsqi.org域名,替代之前的二级域名.2016-12-12 申请ChinaDMOZ收录,瞬间申请通过.20 ...
- zTree插件实现菜单树
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- 抓某音乐播放器时现在多了个vkey,导致播放地址有问题,如何抓到vkey
一:在已经通过axios和vue-cli本地服express通过地址获取到songmid这个参数 在js里面地址和参数如下: // 获取歌手和歌曲的详细信息 export function getSi ...
- JavaScript知识点:分支结构(if、switch)+算法例题
if-else分支 1.if条件应该是boolean类型的值或表达式 2.如果条件不是Boolean,会进行自动转换 以下几种情况会默认转换为 false: if(0).if(0.0) if(NaN) ...
- vue学习(4)-组件的创建,父子组件传值,$refs
模块化:代码逻辑 组件化:UI 组件的创建:1.
- Python模拟登陆某网教师教育网
本文转载自看雪论坛[作者]rdsnow 不得不说,最近的 Python 蛮火的,我也稍稍了解了下,并试着用 Python 爬取网站上的数据 不过有些数据是要登陆后才能获取的,我们每年都要到某教师教育网 ...
- List · leetcode-24. 交换相邻节点
题面 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...
- 9.Redis的Java客户端Jedis
Redis的Java客户端Jedis Jedis所需jar包 commons-pool-1.6.jar jedis-2.1.0.jar 1.Jedis常用操作(jedis中的api 和 我们在 l ...