一如既往的垃圾,又回到了那个场场垫底的自己,明明考场上都想到正解了,但是就是拿不到分,可能是互奶把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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+,mod=1e9+;
  4. #define int long long
  5. int n,m,c,fac[N],inv[N];
  6. int f[][*],pre[][*];
  7. int min(int a,int b){
  8. return a<b?a:b;
  9. }
  10. int qpow(int a,int b){
  11. int ans=;
  12. while(b){
  13. if(b&) ans=ans*a%mod;
  14. b>>=;
  15. a=a*a%mod;
  16. }
  17. return ans%mod;
  18. }
  19. int C(int a,int b){
  20. return fac[a]*inv[b]%mod*inv[a-b]%mod;
  21. }
  22. signed main(){
  23. fac[]=;
  24. for(int i=;i<=;++i) fac[i]=fac[i-]*i%mod;
  25. inv[]=qpow(fac[],mod-);
  26. for(int i=;i;--i) inv[i-]=inv[i]*i%mod;
  27. scanf("%lld%lld%lld",&n,&m,&c);
  28. f[][]=;
  29. 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;
  30. // for(int i=1;i<=n;++i,cout<<endl) for(int j=1;j<=n;++j) cout<<pre[i][j];
  31. for(int i=;i<=n;++i){
  32. for(int j=;j<=c;++j){
  33. for(int k=;k<=min(n,j);++k){
  34. (f[i][j]+=f[i-][j-k]*pre[i][k]%mod)%=mod;
  35. // cout<<pre[i][k]<<" "<<qpow(C(n,k),(m-i)/n+1)<<endl;
  36. }
  37. }
  38. }
  39. printf("%lld",f[n][c]%mod);
  40. }
  41. /*
  42. 2 3 1
  43. */

chess

T2:

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

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

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e7+;
  4. pair<int,int > s[N];
  5. int a[N],sta[N],top;
  6. inline int min(int a,int b){return a<b?a:b;}
  7. inline int max(int a,int b){return a>b?a:b;}
  8. inline int read(){
  9. register int p=;register char ch=getchar();
  10. while(ch<''||ch>'') ch=getchar();
  11. while(ch>=''&&ch<='') p=(p<<)+(p<<)+ch-,ch=getchar();
  12. return p;
  13. }
  14.  
  15. int main(){
  16. int n;
  17. scanf("%d",&n);++n;
  18. for(register int i=;i^n;++i) a[i]=read();
  19. // for(int i=1;i<=n;++i) s[i].first=a[i],s[i].second=i;
  20. sta[++top]=;a[]=0x7fffffff;
  21. register int ans=;
  22. for(register int i=;i^n;++i){
  23. s[i]=make_pair(a[i],i);
  24. while(a[i]>=a[sta[top]]){
  25. s[i]=min(s[i],s[sta[top--]]);
  26.  
  27. }ans=max(ans,i-s[i].second+);
  28. sta[++top]=i;
  29. }
  30. printf("%d",ans);
  31. }

array

T3:

回滚莫队裸题。

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

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

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

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

放个回滚莫队讲解链接

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e6+;
  4. int blo[N];
  5. int sta1[N],sta2[N],top;
  6. struct node{
  7. int l,r,id,ld;
  8. bool friend operator < (node a,node b){
  9. return blo[a.l]==blo[b.l]?(a.r<b.r):blo[a.l]<blo[b.l];
  10. }
  11. }ask[N];
  12. int now1[N],now2[N],a[N],ans[N];
  13. int main(){
  14. //freopen("ants1.in","r",stdin);
  15. //freopen("my.out","w",stdout);
  16. int n,m;
  17. scanf("%d%d",&n,&m);
  18. int size=sqrt(n);
  19. for(int i=;i<=n;++i) scanf("%d",&a[i]);
  20. for(int i=;i<=m;++i){
  21. scanf("%d%d",&ask[i].l,&ask[i].r);
  22. ask[i].id=i;
  23. ask[i].ld=(ask[i].l-)/size+;
  24. }
  25. for(int i=;i<=n/size+;++i){
  26. for(int j=size*(i-)+;j<=size*i;++j) blo[j]=i;
  27. }
  28. sort(ask+,ask+m+);
  29. int r=,l=,res=;
  30. for(int i=;i<=m;++i){
  31. if(ask[i].ld!=ask[i-].ld){
  32. for(int j=;j<=n;++j) now1[j]=now2[j]=;
  33. res=;
  34. l=r=ask[i].ld*size;
  35. }
  36. while(ask[i].r>r){
  37. ++r;
  38. int x=a[r];
  39. now1[x]=now1[x+]+;
  40. now2[x]=now2[x-]+;
  41. int kh=now1[x]+now2[x]-;
  42. now1[x-now2[x]+]=kh;
  43. now2[x+now1[x]-]=kh;
  44. res=max(kh,res);
  45. }
  46. top=;
  47. int tmp=res;
  48. for(int j=ask[i].l;j<=min(ask[i].r,l);++j){
  49. int x=a[j];
  50. now1[x]=now1[x+]+;
  51. now2[x]=now2[x-]+;
  52. int kh=now1[x]+now2[x]-;
  53. sta1[++top]=x-now2[x]+;
  54. sta2[top]=now1[x-now2[x]+];
  55. sta1[++top]=x+now1[x]-;
  56. sta2[top]=now2[x+now1[x]-];
  57. now1[x-now2[x]+]=kh;
  58. now2[x+now1[x]-]=kh;
  59. tmp=max(kh,tmp);
  60. }
  61. for(int j=top;j;--j){
  62. if(j&) now1[sta1[j]]=sta2[j];
  63. else now2[sta1[j]]=sta2[j];
  64. }
  65. for(int j=ask[i].l;j<=min(l,ask[i].r);++j){
  66. now1[a[j]]=;
  67. now2[a[j]]=;
  68. }
  69. ans[ask[i].id]=tmp;
  70. }
  71. for(int i=;i<=m;++i) printf("%d\n",ans[i]);
  72. }

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. (十)easyUI之折叠面板+选项卡+树完成系统布局

    一.效果 二 .编码 数据库设计 数据库函数设计,该函数根据父节点id 查询出所有字节点(包括孙子节点) BEGIN #声明两个临时变量 ); ); '; SET tempChd=CAST(rootI ...

  2. mysql 树结构递归处理

    日常开发中我们经常会遇到树形结构数据处理,一般表结构通常会常用id,pid这种设计方案. 之前用oracle.sqlServer数据库,用相应的语法即可获取树形结构数据(oracel:connect ...

  3. JSQI网站大事表 | Website Landmark

    2016-07-01 网站前身jsqi.50vip.com上线.2016-07-12 购买jsqi.org域名,替代之前的二级域名.2016-12-12 申请ChinaDMOZ收录,瞬间申请通过.20 ...

  4. zTree插件实现菜单树

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...

  5. 抓某音乐播放器时现在多了个vkey,导致播放地址有问题,如何抓到vkey

    一:在已经通过axios和vue-cli本地服express通过地址获取到songmid这个参数 在js里面地址和参数如下: // 获取歌手和歌曲的详细信息 export function getSi ...

  6. JavaScript知识点:分支结构(if、switch)+算法例题

    if-else分支 1.if条件应该是boolean类型的值或表达式 2.如果条件不是Boolean,会进行自动转换 以下几种情况会默认转换为 false: if(0).if(0.0) if(NaN) ...

  7. vue学习(4)-组件的创建,父子组件传值,$refs

    模块化:代码逻辑 组件化:UI 组件的创建:1.

  8. Python模拟登陆某网教师教育网

    本文转载自看雪论坛[作者]rdsnow 不得不说,最近的 Python 蛮火的,我也稍稍了解了下,并试着用 Python 爬取网站上的数据 不过有些数据是要登陆后才能获取的,我们每年都要到某教师教育网 ...

  9. List · leetcode-24. 交换相邻节点

    题面 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...

  10. 9.Redis的Java客户端Jedis

    Redis的Java客户端Jedis Jedis所需jar包   commons-pool-1.6.jar jedis-2.1.0.jar 1.Jedis常用操作(jedis中的api 和 我们在 l ...