题目:(开始自己描述题目了...)

  第一题大意:

    求1~n的所有排列中逆序对为k个的方案数,输出方案数%10000,n<=1000。

  解:这道题一个递推,因为我基本上没怎么自己做过递推,所以推了一个小时,而其实熟练后几分钟十多分钟就推出来了。好吧,我递推的方法:从n=1 开始递推,当n=2的时候由 n=1 推出,以此类推。如何递推?以n=3,k=3为例:有三种方式结尾,以3结尾,前两个数由1,2 排列,3在1,2后面不产生逆序对,那么方案数就等于当n=2的时候产生3个逆序对的方案数,为0 ;以2结尾,2在1,3后面产生1个逆序对,那么方案数就等于当n=2的时候产生2个逆序对的方案数0;以1 结尾,1在2,3后面已产生2个逆序对,那么方案数就等于当n=2的时候产生1个逆序对的方案数1.那么总方案为三种情况的和:1。同样的道理,我们可以得到所有n、k 的情况。。。就自己再推吧,画图比较好理解。。。我就不说了。。

  注意:在取mo的时候,如果前面的式子有 减号,那应该再 +mo 再% mo.... 为此我被坑了70分输出负数。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<map>
  5. #define maxn 1005
  6. #define inf 10000
  7. #define ll long long
  8. using namespace std;
  9. int t,an[maxn],ak[maxn],man,mak;
  10. int last_k;
  11. ll m[maxn][maxn],sum[maxn][maxn];
  12. int main()
  13. {
  14. freopen("permut.in","r",stdin);
  15. freopen("permut.out","w",stdout);
  16. cin>>t;
  17. for (int i=;i<=t;i++)
  18. {
  19. scanf("%d%d",&an[i],&ak[i]);
  20. if (an[i]>man) man=an[i];
  21. if (ak[i]>mak) mak=ak[i];
  22. }
  23. last_k=;
  24. for (int i=;i<=man;i++)
  25. m[i][]=sum[i][]=;
  26. for (int i=;i<=man;i++)
  27. {
  28. int j;
  29. for (j=;j<=last_k+i-;j++)
  30. {
  31. if (j>mak) break;
  32. if (j<=i-){
  33. if(j<=last_k){
  34. m[i][j]=(m[i-][j]+m[i][j-])%inf;
  35. }
  36. else m[i][j]=(sum[i-][last_k])%inf;
  37. }
  38. else
  39. {
  40. if(j<=last_k){
  41. m[i][j]=((sum[i-][j]-sum[i-][j-i])%inf+inf)%inf;//否则输出负数 !!
  42. }
  43. else m[i][j]=((sum[i-][last_k]-sum[i-][j-i])%inf+inf)%inf;//否则输出负数
  44.  
  45. }
  46.  
  47. sum[i][j]=(sum[i][j-]+m[i][j])%inf;
  48. // printf("%I64d ",m[i][j]%inf);
  49. }
  50. //cout<<endl;
  51. last_k=j-;
  52. }
  53. for (int i=;i<=t;i++)
  54. printf("%I64d\n",m[an[i]][ak[i]]%inf);
  55. return ;
  56. }

  第二题大意:

  有一个数字序列,其中每一个 ai 都有对应的优美值(- -),即找一个包含这个ai的最长的区间,并且ai为这个区间的中位数,那么优美值即这个区间的长度(一定是奇数)。询问对于一个[l,r]的区间中最大的优美值。

  解:1、找优美值。一个数组s。在ai的左右两边,aj如果大于ai,s[j]=1,否则为-1,然后扫描一遍序列,找到最长的区间使s值加起来为0,那么在这个区间内ai肯定是中位数。

    2、查询。可以用线段树,或者RMQ。RMQ更简单一点,就是一个链上倍增。线段树写起来太复杂,下一次来复习。

        3、注意当aj与ai相等时,如果aj在ai左边,则s[j]是-1,右边是+1,所以要注意>和>= 的区别。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 2005
  6. using namespace std;
  7. int n,q,num[maxn],be[maxn],f[maxn][],ma[maxn][];
  8. int s[maxn],sum[maxn],posl[*maxn],posr[*maxn];
  9. void get_beautiful()
  10. {
  11. for (int i=;i<=n;i++)
  12. {
  13. s[i]=sum[i]=;
  14. memset(posl,,sizeof (posl));
  15. memset(posr,,sizeof (posr));
  16. posl[n]=posr[n]=i;
  17. for (int j=i-;j>=;j--)//倒序
  18. {
  19. if (num[j]>num[i]) s[j]=;//> 字典序
  20. else s[j]=-;
  21. sum[j]=sum[j+]+s[j];
  22. posl[n+sum[j]]=j;//+
  23. }
  24. for (int j=i+;j<=n;j++)
  25. {
  26. if (num[j]>=num[i]) s[j]=;//
  27. else s[j]=-;
  28. sum[j]=sum[j-]+s[j];
  29. posr[n+sum[j]]=j;
  30. }
  31. for (int j=;j<=*n;j++)
  32. if (posl[*n-j]&&posr[j])//** posr[2*n-j] **
  33. be[i]=max(be[i],posr[j]-posl[*n-j]+);//** posr[2*n-j] **
  34. }
  35. }
  36. void RMQ()
  37. {
  38. for (int i=;i<=;i++)
  39. for (int j=;j<=n;j++)
  40. {
  41. f[j][i]=f[f[j][i-]][i-];
  42. ma[j][i]=max(ma[j][i-],ma[f[j][i-]][i-]);
  43. }
  44. }
  45. void query(int l,int r)
  46. {
  47. int ans=,d=r-l,now=l;
  48. if (l==r)//********
  49. {
  50. printf("%d\n",be[l]);
  51. return ;
  52. }
  53. for (int i=;i<=;i++)
  54. {
  55. if ((<<i)&d){
  56. ans=max(ma[now][i],ans);
  57. now=f[now][i];
  58. }
  59. }
  60. printf("%d\n",ans);
  61. }
  62. int main()
  63. {
  64. freopen("beautiful.in","r",stdin);
  65. freopen("beautiful.out","w",stdout);
  66. cin>>n;
  67. for (int i=;i<=n;i++)
  68. scanf("%d",&num[i]);
  69. get_beautiful();
  70. for (int i=;i<n;i++)
  71. {
  72. f[i][]=i+;
  73. ma[i][]=max(be[i],be[i+]);
  74. }
  75. RMQ();
  76. cin>>q;
  77. for (int i=;i<=q;i++)
  78. {
  79. int l,r;
  80. scanf("%d%d",&l,&r);
  81. query(l,r);
  82. }
  83. return ;
  84. }

第三题大意:

  有三个操作:add 一个数字  delete一个数字,cnt 一个数字s:找数组中ai & s = ai的个数并输出。s<2^16

 解:

  把s分为两块,2^8和2^8。首先要明白:当s的一位上为1 的时候,如果满足ai & s = ai,那么ai那一位上可以为1,0。所以可以说ai是s的子集,s是ai的父集。

  add s的时候用s找它的负集,cnt s的时候找s的子集的个数。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #define maxn 260
  7. using namespace std;
  8. int q,a[maxn][maxn];
  9. int main()
  10. {
  11. freopen("subset.in","r",stdin);
  12. freopen("subset.out","w",stdout);
  13. cin>>q;
  14. for (int i=;i<=q;i++)
  15. {
  16. char s[];
  17. int x,w=;
  18. scanf("%s%d",s,&x);
  19. if (s[]=='d') w=-;
  20. if (s[]!='c'){
  21. int pre=(x>>),suf=(x&),comp=^suf;//找到s中所有 0,改为 1
  22. a[pre][suf]+=w;//****
  23. for (int j=comp;j!=;j=(j-)&comp)//父集:各种情况的 0 改为 1
  24. a[pre][(j|suf)]+=w;
  25. }
  26. else{
  27. int pre=(x>>),suf=(x&);
  28. int ans=a[][suf];
  29. for (int j=pre;j!=;j=(j-)&pre)//子集:各种情况的 1 改为 0
  30. ans+=a[j][suf];
  31. printf("%d\n",ans);
  32. }
  33. }
  34. return ;
  35. }

  

  

【第53套模拟题】【递推】【RMQ】【二进制】【分块】的更多相关文章

  1. 0x02 枚举、模拟、递推

    1.TYVJ1266(这站是不是已经倒闭了啊) USACO陈年老题,对于这种开关问题啊,最多只按一次,而且第一行随便按完下面的就全确定了,类似的还有固定翻转一个长度的区间,这个也是最多翻一次的而且翻的 ...

  2. P5110-块速递推【特征方程,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P5110 题目大意 数列\(a\)满足 \[a_n=233a_{n-1}+666a_{n-2},a_0=0,a_1= ...

  3. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  4. UVa 11040 Add bricks in the wall (水题递推)

    题意:给定一个金字塔,除了最后一行,每个数都等于支撑它的两个数的和,现在给奇数行的左数奇数位置,求整个金字塔. 析:很容易看出来,从下往上奇数行等于 a[i][j] = (a[i-2][j-1] - ...

  5. [luogu4310] 绝世好题 (递推)

    传送门 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入输出格式 输入格式: 输入文件共2行. 第一行包括 ...

  6. HDU 2569(简单的递推)

    彼岸 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  7. 洛谷P1240-诸侯安置+递推非搜索

    诸侯安置 这道题是一题递推题,一开始自己不知道,用了搜索,只过了三个样例: 两两相同的合并, 成 1,1,3,3,5,5........n*2-1; 然后我们会容易发现一种不同与搜索的动态规划做法. ...

  8. BZOJ5017题解SNOI2017炸弹--玄学递推

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5017 分析 老师讲课谈到了这道题,课上想出了个连边建图然后乱搞的操作,被老师钦定的递推方 ...

  9. [luogu]P1066 2^k进制数[数学][递推][高精度]

    [luogu]P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻 ...

随机推荐

  1. 题目:在泛型为Integer的容器内添加一个字符串.

    这个题目有两种解法,第一种利用反射来解决: //ArrayList<Integer> list = new ArrayList<Integer>(); //在这个泛型为Inte ...

  2. HTML5Canvas标签

     

  3. (三)stm32之串口通信DMA传输完成中断

    一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...

  4. iOS——Xcode中添加第三方库

    一.只有.h和.a文件的库 1.向项目中添加三方库文件 如果添加的第三方库只有.h和.a文件,直接把文件夹拖进项目下面,这时会弹出下面的提示框,一定要勾选下面选择的选项: 这里要注意,在Add to ...

  5. 记录---base64

    什么是Base64呢? Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下 ...

  6. chrome web开发工具

    顾名思义Chrome开发工具就是一个工具,它允许Web开发人员可以通过浏览器应用程序干预和操作Web页面,也可以通过这个工具调试和测试Web页面或Web应用程序.有了这个工具,你可以做很多有趣的事情: ...

  7. semantic-ui dropdown is not a function

    按照semantic-ui官网示例,编写了如下示例,却不见效果. <div class="ui secondary menu"> <a class="i ...

  8. eclipse配置tomcat,访问http://localhost:8080出现404错误

     问题:通过eclipse来启动tomcat会碰到“访问http://localhost:8080出现404错误”这样的问题,需要在eclipse中进行一系列的设置才行. 解决:打开eclipse的s ...

  9. 悟透javascript读书笔记

    1.undefined,null,0,""  这四个值转换为逻辑值时是false,其他无论简单类型值,对象或者函数转换过来都是true 2.如图 第一个是“声明了一个变量,给变量赋 ...

  10. Hibernate4+Spring JPA+SpringMVC+Volecity搭建web应用(二)

    SpringMVC.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...