Stack

  1. #include<iostream>
  2. #include<cstdio>
  3. #define mod 7
  4. using namespace std;
  5. int f[][],n;
  6. int main(){
  7. freopen("stack.in","r",stdin);freopen("stack.out","w",stdout);
  8. scanf("%d",&n);
  9. for(int i=;i<=n;i++)
  10. for(int j=;j<=i;j++){
  11. if(j)f[i][j]=f[i-][j]+f[i][j-];
  12. else f[i][j]=;
  13. while(f[i][j]>=mod)f[i][j]-=mod;
  14. }
  15. printf("%d",f[n][n]);
  16. return ;
  17. }

100分 卡特兰数求第n项取模

Cube

  1. /*
  2. 记录每个点下面有多少元素top[i],他所在并查集的大小,每次移动操作就把移动后在上面的那部分中所有的点的top加上它移动到的病茶几的大小,修改复杂度很高,查询是O(1)的
  3. */
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<cstring>
  7. #define maxn 30010
  8. using namespace std;
  9. int p,fa[maxn],sz[maxn],top[maxn];
  10. char ch[];
  11. int find(int x){
  12. if(fa[x]==x)return fa[x];
  13. return fa[x]=find(fa[x]);
  14. }
  15. int main(){
  16. //freopen("Cola.txt","r",stdin);
  17. freopen("cube.in","r",stdin);freopen("cube.out","w",stdout);
  18. scanf("%d",&p);
  19. int n=;
  20. for(int i=;i<=;i++)fa[i]=i,sz[i]=;
  21. while(p--){
  22. scanf("%s",ch);
  23. int x,y;
  24. if(ch[]=='M'){
  25. scanf("%d%d",&x,&y);
  26. n=max(n,max(x,y));
  27. int f1=find(x),f2=find(y);
  28. if(f1!=f2){
  29. for(int i=;i<=n;i++){
  30. if(find(i)==f1){
  31. top[i]+=sz[f2];
  32. }
  33. }
  34. fa[f1]=f2;
  35. sz[f2]+=sz[f1];
  36. sz[f1]=;
  37. }
  38.  
  39. }
  40. else{
  41. scanf("%d",&x);
  42. n=max(n,x);
  43. printf("%d\n",top[x]);
  44. }
  45. }
  46. }

70分 暴力并查集

  1. #include<iostream>
  2. #include<cstdio>
  3. #define maxn 30010
  4. using namespace std;
  5. int p,cnt[maxn],sum[maxn],fa[maxn];
  6. char s[];
  7. int find(int x){
  8. if(x==fa[x])return fa[x];
  9. int f=fa[x];
  10. fa[x]=find(fa[x]);
  11. cnt[x]+=cnt[f];
  12. return fa[x];
  13. }
  14. void merge(int x,int y){
  15. fa[y]=x;
  16. cnt[y]+=sum[x];
  17. sum[x]+=sum[y];
  18. sum[y]=;
  19. }
  20. int main(){
  21. freopen("cube.in","r",stdin);freopen("cube.out","w",stdout);
  22. for(int i=;i<=;i++)fa[i]=i,sum[i]=;
  23. scanf("%d",&p);
  24. while(p--){
  25. scanf("%s",s);
  26. int x,y;
  27. if(s[]=='M'){
  28. scanf("%d%d",&x,&y);
  29. merge(find(x),find(y));
  30. }
  31. else {
  32. scanf("%d",&x);
  33. printf("%d\n",sum[find(x)]-cnt[x]-);
  34. }
  35. }
  36. }

100分 带权并查集

Zuma

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. using namespace std;
  7. map<string,bool>vis;
  8. string s,snow;
  9. struct node{
  10. string s;
  11. int step;
  12. }cur,nxt;
  13. queue<node>q;
  14. void down(){
  15. string pre=snow;
  16. snow="";
  17. for(int i=;i<pre.length();){
  18. while(pre[i]==''&&i<pre.length())i++;
  19. snow=snow+pre[i];i++;
  20. }
  21. }
  22. void updata(){
  23. string pre=snow;
  24. bool flag=;
  25. for(int i=;i<pre.length();i++){
  26. if(pre[i]==pre[i-]&&pre[i]==pre[i+])flag=,snow[i]=snow[i-]=snow[i+]='';
  27. }
  28. if(flag){
  29. down();
  30. updata();
  31. }
  32. }
  33. int main(){
  34. //freopen("Cola.txt","r",stdin);
  35. freopen("zuma.in","r",stdin);freopen("zuma.out","w",stdout);
  36. cin>>s;
  37. vis[s]=;
  38. cur.s=s;cur.step=;
  39. //cout<<s<<endl;
  40. bool flag=;
  41. int n1=,n0=;
  42. for(int i=;i<s.length();i++){
  43. if(s[i]==s[i-]){
  44. flag=;break;
  45. }
  46. if(s[i]=='')n0++;
  47. if(s[i]=='')n1++;
  48. }
  49. if(flag==){
  50. int ans=;
  51. if(s[]=='')n0++;
  52. if(s[]=='')n1++;
  53. if(n1%==&&n0%==&&n1==n0){
  54. ans=+(n1/)+((n0-)/)+;
  55. printf("%d",ans);
  56. return ;
  57. }
  58. if(n1%==&&n0%==&&n1==n0){
  59. ans=+((n1-)/)+((n0-)/);
  60. printf("%d",ans);
  61. return ;
  62. }
  63. if(n1<n0)swap(n1,n0);
  64. if(n1%==&&n0==n1-){
  65. ans=+((n1-)/)+(n0/);
  66. printf("%d",ans);
  67. return ;
  68. }
  69. if(n1%==&&n0==n1-){
  70. ans=+(n1/)+((n0-)/);
  71. printf("%d",ans);
  72. return ;
  73. }
  74. }
  75. q.push(cur);
  76. while(!q.empty()){
  77. cur=q.front();q.pop();
  78. int len=cur.s.length();
  79. //cout<<cur.s<<endl;
  80. if(len==){printf("%d",cur.step);return ;}
  81. for(int i=;i<=len;i++){//在第i个前面插
  82. snow="";
  83. snow=snow+cur.s.substr(,max(,i));
  84. snow=snow+"";
  85. snow=snow+cur.s.substr(i,len-i);
  86. string now=snow;
  87. updata();
  88. if(!vis[snow]){
  89. vis[snow]=;
  90. nxt.s=snow;nxt.step=cur.step+;
  91. q.push(nxt);
  92. if(nxt.s.length()==&&nxt.s[]!=''&&nxt.s[]!=''){printf("%d",nxt.step);return ;}
  93. }
  94. //cout<<snow<<endl;
  95.  
  96. snow=now;
  97. snow[i]='';
  98. updata();
  99. if(!vis[snow]){
  100. vis[snow]=;
  101. nxt.s=snow;nxt.step=cur.step+;
  102. q.push(nxt);
  103. if(nxt.s.length()==&&nxt.s[]!=''&&nxt.s[]!=''){printf("%d",nxt.step);return ;}
  104. }
  105. //cout<<snow<<endl;
  106. }
  107. }
  108. fclose(stdin);fclose(stdout);
  109. return ;
  110. }

65分 宽搜

  1. /*
  2. 区间dp,情况有些多需要讨论
  3. 首先连续相同的颜色为了方便要合并,记录每个块的颜色,就可以dp了
  4. dp[l][r]表示合并这段区间的最小步数,分几种情况
  5. 这段区间是奇数(为了避免区间长度为2的情况)
  6. 1. color[l]==color[r] && tot[l]+tot[r]==2 --> dp[l][r] 可从 dp[l+1][r-1]+1 转移过来。
  7. 2. color[l]==color[r] && tot[l]+tot[r]>2 --> dp[l][r] 可从 dp[l+1][r-1] 转移过来。
  8. 3. color[l]==color[k]==color[r](k∈(l,r) && [l,k],[k,r] 为奇数) -->可从dp[l+1][k-1]+dp[k+1][r-1]转移过来。
  9. 这段区间是偶数
  10. 普通的转移 dp[l][r] =min(dp[l][r] , dp[l][k]+dp[k+1][r]);
  11. */
  12. #include<iostream>
  13. #include<cstdio>
  14. #include<cstring>
  15. #define maxn 257
  16. using namespace std;
  17. int dp[maxn][maxn],col[maxn],a[maxn];
  18. char s[maxn];
  19. int n,m,ans;
  20. int main(){
  21. freopen("zuma.in","r",stdin);freopen("zuma.out","w",stdout);
  22. scanf("%s",s);n=strlen(s);
  23. a[]=;m=;
  24. for(int i=;i<n;i++){
  25. if(s[i]==s[i-]){
  26. col[m]=s[i]-'';
  27. a[m]++;
  28. }
  29. else {
  30. a[++m]=;
  31. col[m]=s[i]-'';
  32. }
  33. }
  34. for(int len=;len<=m;len++){
  35. for(int i=;i<=m;i++){
  36. int j=i+len;
  37. if(j>=&&j<=m){
  38. dp[i][j]=*n;
  39. if(len==)dp[i][j]=-a[i];
  40. else {
  41. for(int k=i;k<j;k++)
  42. dp[i][j]=min(dp[i][k]+dp[k+][j],dp[i][j]);
  43. if((j-i)%==){
  44. if(a[i]+a[j]==){
  45. if(col[i]==col[j])
  46. dp[i][j]=min(dp[i][j],dp[i+][j-]+);
  47. }
  48. else
  49. if(col[i]==col[j])
  50. dp[i][j]=min(dp[i][j],dp[i+][j-]);
  51. if(a[i]+a[j]<)
  52. for(int k=i+;k<j;k+=)
  53. if(a[k]==)dp[i][j]=min(dp[i+][k-]+dp[k+][j-],dp[i][j]);
  54. }
  55. }
  56. }
  57. }
  58. }
  59. printf("%d\n",dp[][m]);
  60. return ;
  61. }

100分 区间dp

2017-10-15 NOIP模拟赛的更多相关文章

  1. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  2. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  3. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  4. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  5. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  6. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  7. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  8. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

  9. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  10. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

随机推荐

  1. php 数据处理--合并,拆分,追加,去重

    1. 合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次迫加. 示例代码: <?php $arr = ...

  2. Hibernate学习---第九节:Hibernate之hql

    一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; impor ...

  3. php导出内容到txt并自动弹出下载文件

    php将内容保存到txt文件中,并自动弹出下载文件窗口的方法: $id=array('我爱学习网http://www.5ixuexiwang.com','汇享在线工具箱http://tool.huix ...

  4. 百度编辑器UEditor配置toolbars工具条功能按钮

    两种方式: 1.代码中定义 <script id="container" name="content" type="text/plain&quo ...

  5. Java 对象引用以及对象赋值

    一.Vehicle veh1 = new Vehicle(); 通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作. 1.new Vehicle  :表示在堆空间内创建了一个Vehicle ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第三周作业

    本次作业分为两部分:第一部分为实验.主要目的是进行基于MYKERNEL的一个简单的时间片轮转多道程序内核代码分析.第二部分为阅读教材,了解LINUX进程调度等. 一.实验部分 实验过程如过程所述:使用 ...

  7. 比线程更NB的存在

    阅读目录 一 引子 二 协程介绍 三 Greenlet模块 四 Gevent模块 引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来 ...

  8. UML Design Via Visual Studio-Class Diagram

    用过几个建模设计工具,小的有staruml,大的有rational rose,EA.最后发现还是Visual Studio建模比较舒服(个人观点,不要争论). 打算对自己经常用的几个建模图做一个介绍, ...

  9. BZOJ3680:吊打XXX

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...

  10. javascript中string的用法总结

    javascript中很经常的会用到string类型的变量,对此,总结了几种常用操作或者方法:创建.拼接.子串.大小写转换.判断字符串相等.字符串查找等几种.下面将一一简单描述. 一.js中strin ...