题面:https://www.cnblogs.com/Juve/articles/11487699.html

队长快跑:

权值线段树与dp

yy的不错

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const int MAXN=1e5+5;
  8. int n,a[MAXN],b[MAXN],ans=0,lsh[MAXN<<1],cnt,tot=0;
  9. struct node{
  10. int l,r,laz,mx;
  11. }tr[MAXN<<4];
  12. void build(int k,int l,int r){
  13. tr[k].l=l,tr[k].r=r;
  14. if(l==r){
  15. tr[k].mx=0;
  16. return ;
  17. }
  18. int mid=(l+r)>>1;
  19. build(k<<1,l,mid);
  20. build(k<<1|1,mid+1,r);
  21. }
  22. void down(int k){
  23. tr[k<<1].laz+=tr[k].laz;
  24. tr[k<<1|1].laz+=tr[k].laz;
  25. tr[k<<1].mx+=tr[k].laz;
  26. tr[k<<1|1].mx+=tr[k].laz;
  27. tr[k].laz=0;
  28. }
  29. void pushup(int k){
  30. tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);
  31. }
  32. int query_max(int k,int opl,int opr){
  33. int l=tr[k].l,r=tr[k].r;
  34. if(opl<=l&&r<=opr) return tr[k].mx;
  35. if(tr[k].laz) down(k);
  36. int mid=(l+r)>>1,res=0;
  37. if(opl<=mid) res=max(res,query_max(k<<1,opl,opr));
  38. if(opr>mid) res=max(res,query_max(k<<1|1,opl,opr));
  39. return res;
  40. }
  41. void update(int k,int opt,int val){
  42. int l=tr[k].l,r=tr[k].r;
  43. if(l==r){
  44. tr[k].mx=max(tr[k].mx,val);
  45. return ;
  46. }
  47. if(tr[k].laz) down(k);
  48. int mid=(l+r)>>1;
  49. if(opt<=mid) update(k<<1,opt,val);
  50. else update(k<<1|1,opt,val);
  51. pushup(k);
  52. }
  53. void change(int k,int opl,int opr){
  54. int l=tr[k].l,r=tr[k].r;
  55. if(opl<=l&&r<=opr){
  56. ++tr[k].mx;
  57. ++tr[k].laz;
  58. return ;
  59. }
  60. if(tr[k].laz) down(k);
  61. int mid=(l+r)>>1;
  62. if(opl<=mid) change(k<<1,opl,opr);
  63. if(opr>mid) change(k<<1|1,opl,opr);
  64. pushup(k);
  65. }
  66. signed main(){
  67. scanf("%d",&n);
  68. for(int i=1;i<=n;++i){
  69. scanf("%d%d",&a[i],&b[i]);
  70. lsh[++tot]=a[i],lsh[++tot]=b[i];
  71. }
  72. sort(lsh+1,lsh+tot+1);
  73. cnt=unique(lsh+1,lsh+tot+1)-lsh;
  74. for(int i=1;i<=n;++i){
  75. a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;
  76. b[i]=lower_bound(lsh+1,lsh+cnt+1,b[i])-lsh;
  77. }
  78. build(1,1,cnt);
  79. for(int i=n;i>=1;--i){
  80. if(a[i]>b[i]){
  81. int p=query_max(1,1,b[i]-1)+1;
  82. update(1,b[i],p);
  83. change(1,b[i]+1,a[i]);
  84. }else{
  85. int p=query_max(1,1,a[i]-1)+1;
  86. update(1,b[i]+1,p);
  87. }
  88. }
  89. printf("%d\n",tr[1].mx);
  90. return 0;
  91. }

影魔:

主席树,每个深度建树

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int MAXN=1e5+5;
  7. int n,m,c[MAXN],fa[MAXN],ans,tot=0;
  8. int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
  9. void add(int u,int v){
  10. ++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
  11. }
  12. int root1[MAXN],root2[MAXN];
  13. struct node{
  14. int ls,rs,val;
  15. }tr[MAXN<<7];
  16. void build(int &k,int l,int r,int pos,int val){
  17. k=++tot;
  18. if(l==r){
  19. tr[k].val=val;
  20. return ;
  21. }
  22. int mid=(l+r)>>1;
  23. if(pos<=mid) build(tr[k].ls,l,mid,pos,val);
  24. else build(tr[k].rs,mid+1,r,pos,val);
  25. }
  26. void update(int &k,int l,int r,int pos,int val){
  27. ++tot;
  28. tr[tot]=tr[k];
  29. k=tot;
  30. tr[k].val+=val;
  31. if(l==r) return ;
  32. int mid=(l+r)>>1;
  33. if(pos<=mid) update(tr[k].ls,l,mid,pos,val);
  34. else update(tr[k].rs,mid+1,r,pos,val);
  35. }
  36. int merge1(int x,int y,int l,int r,int p){
  37. if(!x||!y) return x+y;
  38. int k=++tot;
  39. if(l==r){
  40. tr[k].val=min(tr[x].val,tr[y].val);
  41. update(root2[p],1,n,max(tr[x].val,tr[y].val),-1);
  42. return k;
  43. }
  44. int mid=(l+r)>>1;
  45. tr[k].ls=merge1(tr[x].ls,tr[y].ls,l,mid,p);
  46. tr[k].rs=merge1(tr[x].rs,tr[y].rs,mid+1,r,p);
  47. return k;
  48. }
  49. int merge2(int x,int y,int l,int r){
  50. if(!x||!y) return x+y;
  51. int k=++tot;
  52. tr[k].val=tr[x].val+tr[y].val;
  53. int mid=(l+r)>>1;
  54. tr[k].ls=merge2(tr[x].ls,tr[y].ls,l,mid);
  55. tr[k].rs=merge2(tr[x].rs,tr[y].rs,mid+1,r);
  56. return k;
  57. }
  58. int query(int k,int l,int r,int opl,int opr){
  59. if(opl<=l&&r<=opr) return tr[k].val;
  60. int res=0,mid=(l+r)>>1;
  61. if(opl<=mid) res+=query(tr[k].ls,l,mid,opl,opr);
  62. if(opr>mid) res+=query(tr[k].rs,mid+1,r,opl,opr);
  63. return res;
  64. }
  65. int deep[MAXN];
  66. void dfs(int x,int fa){
  67. build(root1[x],1,n,c[x],deep[x]);
  68. update(root2[x],1,n,deep[x],1);
  69. for(int i=pre[x];i;i=nxt[i]){
  70. int y=to[i];
  71. if(y==fa) continue;
  72. deep[y]=deep[x]+1;
  73. dfs(y,x);
  74. root1[x]=merge1(root1[x],root1[y],1,n,x);
  75. root2[x]=merge2(root2[x],root2[y],1,n);
  76. }
  77. }
  78. signed main(){
  79. scanf("%d%d",&n,&m);
  80. for(int i=1;i<=n;++i){
  81. scanf("%d",&c[i]);
  82. }
  83. for(int i=2;i<=n;++i){
  84. scanf("%d",&fa[i]);
  85. add(fa[i],i);
  86. }
  87. deep[1]=1;
  88. dfs(1,0);
  89. for(int i=1,k,dis;i<=m;++i){
  90. scanf("%d%d",&k,&dis);
  91. ans=query(root2[k],1,n,deep[k],deep[k]+dis);
  92. printf("%d\n",ans);
  93. }
  94. return 0;
  95. }

抛硬币:

乱搞dp

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int MAXN=3005;
  7. const int mod=998244353;
  8. int l,len,f[MAXN][MAXN],s[MAXN];
  9. char ch[MAXN];
  10. signed main(){
  11. scanf("%s",ch+1);
  12. scanf("%d",&l);
  13. len=strlen(ch+1);
  14. //cout<<len<<endl;
  15. for(int i=1;i<=len;++i){
  16. f[i][0]=1;
  17. for(int j=i-1;j>=1;--j){
  18. if(ch[j]==ch[i]){
  19. s[i]=j;
  20. break;
  21. }
  22. }
  23. }
  24. //for(int i=1;i<=len;++i) cout<<s[i]<<endl;
  25. f[0][0]=1;
  26. for(int i=1;i<=len;++i){
  27. for(int j=1;j<=l;++j){
  28. if(s[i]!=0) f[i][j]=((f[i-1][j]+f[i-1][j-1]-f[s[i]-1][j-1])%mod+mod)%mod;
  29. else f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;
  30. }
  31. }
  32. printf("%d\n",f[len][l]);
  33. return 0;
  34. }

HZOI20190908模拟40 队长快跑,影魔,抛硬币 题解的更多相关文章

  1. NOIP模拟14「队长快跑·影魔·抛硬币」

    T1:队长快跑 基本思路:   离散化·DP·数据结构优化DP   这三个我都没想到....气死.   定义状态数组:\(c[i][j]\)表示在i时最小的a值是j时可以摧毁的最多的水晶数.   那么 ...

  2. [CSP-S模拟测试]:队长快跑(DP+离散化+线段树)

    题目背景 传说中,在远古时代,巨龙大$Y$将$P$国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个$P$国的所有冒险家前去夺回,尤其是皇家卫士队的队长小$W$.在$P$国量子科技实验室的帮助下,队长小$ ...

  3. BZOJ4829: [Hnoi2017]队长快跑

    BZOJ4829: [Hnoi2017]队长快跑 Description 众所周知,在P国外不远处盘踞着巨龙大Y. 传说中,在远古时代,巨龙大Y将P国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个P国的 ...

  4. [LOJ 2022]「AHOI / HNOI2017」队长快跑

    [LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...

  5. NOIP 模拟 $14\; \text{队长快跑}$

    题解 \(by\;zj\varphi\) 一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少 看到数据范围,直接想离散化 设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁 ...

  6. 20190908 NOIP 模拟40

    考试过程: 刚看完题,发现T1是个类lis 问题,但要求$O(nlogn)$,应该是个数据结构优化dp,T2应该是个数据结构,T3是个字符串?没有匹配,不会是后缀数组吧,这是NOIP模拟啊,可能是个d ...

  7. csps模拟92数列,数对,最小距离题解

    题面:https://www.cnblogs.com/Juve/articles/11767225.html 数列: 简化题意:已知a,b,c,求满足$a*x+b*y=c$的$x+y$最小值 然后ex ...

  8. 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...

  9. LYK 快跑!(LYK别打我-)(话说LYK是谁)

    LYK 快跑!(run) Time Limit:5000ms Memory Limit:64MB 题目描述 LYK 陷进了一个迷宫! 这个迷宫是网格图形状的. LYK 一开始在(1,1)位置, 出口在 ...

随机推荐

  1. 【luoguP3868】猜数字

    description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...

  2. 【JZOJ6273】欠钱

    description analysis 读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值 那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲 明显\(LC ...

  3. thinkphp 模块化设计

    一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器. ThinkPHP3.2采用模块化的架构设计思想,对目录结构规范做了调整,可以支持多模块 ...

  4. luoguP1062 数列 [数学]

    题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...

  5. 0921CSP-S模拟测试赛后总结

    倒数第一祭. 感觉T3数据范围50可以qj一下.于是押了T3. 然后两个小时调我4.1k的bfs.最后调出来了发现策略错了.十分绝望. T120分吊住了.十分难过.倒数第一了.还是实力不行. 不应该押 ...

  6. hibernate_05_hibernateHQL查询QBC查询和SQL查询

    1.HQL简介:HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活.更为强大的查询能力:HQL更接近SQL语句查询语法.Hibernate ...

  7. 微信小程序 tabBar模板

    tabBar导航栏 小程序tabBar,我们可以通过app.json进行配置,可以放置于顶部或者底部,用于不同功能页面的切换,挺好的... 但,,,貌似不能让动态修改tabBar(需求:通过switc ...

  8. Eclipse 连接MySql数据库总结

    Eclipse 连接MySql数据库总结 一.在MySql中创建数据库,并创建表,向表中插入数据 1.创建数据库 create database select_test 2.创建表 create ta ...

  9. 【转载】Kafka介绍及升级经验分享

    http://blog.talkingdata.net/?p=3165 背景 当时的现状:开始使用Kafka的时候,使用的版本是0.7.2,当时的目的是为了替代kestrel,主要是使用Kafka来做 ...

  10. 2019-7-1-Roslyn-让编译时候-Message-内容默认输出

    title author date CreateTime categories Roslyn 让编译时候 Message 内容默认输出 lindexi 2019-07-01 14:16:59 +080 ...