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

队长快跑:

权值线段树与dp

yy的不错

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=1e5+5;
int n,a[MAXN],b[MAXN],ans=0,lsh[MAXN<<1],cnt,tot=0;
struct node{
int l,r,laz,mx;
}tr[MAXN<<4];
void build(int k,int l,int r){
tr[k].l=l,tr[k].r=r;
if(l==r){
tr[k].mx=0;
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void down(int k){
tr[k<<1].laz+=tr[k].laz;
tr[k<<1|1].laz+=tr[k].laz;
tr[k<<1].mx+=tr[k].laz;
tr[k<<1|1].mx+=tr[k].laz;
tr[k].laz=0;
}
void pushup(int k){
tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);
}
int query_max(int k,int opl,int opr){
int l=tr[k].l,r=tr[k].r;
if(opl<=l&&r<=opr) return tr[k].mx;
if(tr[k].laz) down(k);
int mid=(l+r)>>1,res=0;
if(opl<=mid) res=max(res,query_max(k<<1,opl,opr));
if(opr>mid) res=max(res,query_max(k<<1|1,opl,opr));
return res;
}
void update(int k,int opt,int val){
int l=tr[k].l,r=tr[k].r;
if(l==r){
tr[k].mx=max(tr[k].mx,val);
return ;
}
if(tr[k].laz) down(k);
int mid=(l+r)>>1;
if(opt<=mid) update(k<<1,opt,val);
else update(k<<1|1,opt,val);
pushup(k);
}
void change(int k,int opl,int opr){
int l=tr[k].l,r=tr[k].r;
if(opl<=l&&r<=opr){
++tr[k].mx;
++tr[k].laz;
return ;
}
if(tr[k].laz) down(k);
int mid=(l+r)>>1;
if(opl<=mid) change(k<<1,opl,opr);
if(opr>mid) change(k<<1|1,opl,opr);
pushup(k);
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d",&a[i],&b[i]);
lsh[++tot]=a[i],lsh[++tot]=b[i];
}
sort(lsh+1,lsh+tot+1);
cnt=unique(lsh+1,lsh+tot+1)-lsh;
for(int i=1;i<=n;++i){
a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;
b[i]=lower_bound(lsh+1,lsh+cnt+1,b[i])-lsh;
}
build(1,1,cnt);
for(int i=n;i>=1;--i){
if(a[i]>b[i]){
int p=query_max(1,1,b[i]-1)+1;
update(1,b[i],p);
change(1,b[i]+1,a[i]);
}else{
int p=query_max(1,1,a[i]-1)+1;
update(1,b[i]+1,p);
}
}
printf("%d\n",tr[1].mx);
return 0;
}

影魔:

主席树,每个深度建树

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;
int n,m,c[MAXN],fa[MAXN],ans,tot=0;
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
int root1[MAXN],root2[MAXN];
struct node{
int ls,rs,val;
}tr[MAXN<<7];
void build(int &k,int l,int r,int pos,int val){
k=++tot;
if(l==r){
tr[k].val=val;
return ;
}
int mid=(l+r)>>1;
if(pos<=mid) build(tr[k].ls,l,mid,pos,val);
else build(tr[k].rs,mid+1,r,pos,val);
}
void update(int &k,int l,int r,int pos,int val){
++tot;
tr[tot]=tr[k];
k=tot;
tr[k].val+=val;
if(l==r) return ;
int mid=(l+r)>>1;
if(pos<=mid) update(tr[k].ls,l,mid,pos,val);
else update(tr[k].rs,mid+1,r,pos,val);
}
int merge1(int x,int y,int l,int r,int p){
if(!x||!y) return x+y;
int k=++tot;
if(l==r){
tr[k].val=min(tr[x].val,tr[y].val);
update(root2[p],1,n,max(tr[x].val,tr[y].val),-1);
return k;
}
int mid=(l+r)>>1;
tr[k].ls=merge1(tr[x].ls,tr[y].ls,l,mid,p);
tr[k].rs=merge1(tr[x].rs,tr[y].rs,mid+1,r,p);
return k;
}
int merge2(int x,int y,int l,int r){
if(!x||!y) return x+y;
int k=++tot;
tr[k].val=tr[x].val+tr[y].val;
int mid=(l+r)>>1;
tr[k].ls=merge2(tr[x].ls,tr[y].ls,l,mid);
tr[k].rs=merge2(tr[x].rs,tr[y].rs,mid+1,r);
return k;
}
int query(int k,int l,int r,int opl,int opr){
if(opl<=l&&r<=opr) return tr[k].val;
int res=0,mid=(l+r)>>1;
if(opl<=mid) res+=query(tr[k].ls,l,mid,opl,opr);
if(opr>mid) res+=query(tr[k].rs,mid+1,r,opl,opr);
return res;
}
int deep[MAXN];
void dfs(int x,int fa){
build(root1[x],1,n,c[x],deep[x]);
update(root2[x],1,n,deep[x],1);
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
deep[y]=deep[x]+1;
dfs(y,x);
root1[x]=merge1(root1[x],root1[y],1,n,x);
root2[x]=merge2(root2[x],root2[y],1,n);
}
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&c[i]);
}
for(int i=2;i<=n;++i){
scanf("%d",&fa[i]);
add(fa[i],i);
}
deep[1]=1;
dfs(1,0);
for(int i=1,k,dis;i<=m;++i){
scanf("%d%d",&k,&dis);
ans=query(root2[k],1,n,deep[k],deep[k]+dis);
printf("%d\n",ans);
}
return 0;
}

抛硬币:

乱搞dp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=3005;
const int mod=998244353;
int l,len,f[MAXN][MAXN],s[MAXN];
char ch[MAXN];
signed main(){
scanf("%s",ch+1);
scanf("%d",&l);
len=strlen(ch+1);
//cout<<len<<endl;
for(int i=1;i<=len;++i){
f[i][0]=1;
for(int j=i-1;j>=1;--j){
if(ch[j]==ch[i]){
s[i]=j;
break;
}
}
}
//for(int i=1;i<=len;++i) cout<<s[i]<<endl;
f[0][0]=1;
for(int i=1;i<=len;++i){
for(int j=1;j<=l;++j){
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;
else f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;
}
}
printf("%d\n",f[len][l]);
return 0;
}

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. 【JZOJ4474】【luoguP4071】排列计数

    description 求有多少种长度为 n 的序列 A,满足以下条件: (1)1 ~ n 这 n 个数在序列中各出现了一次 (2)若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 ...

  2. 【转载】TCP拥塞控制算法 优缺点 适用环境 性能分析

    [摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点    缺点   适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...

  3. 树形dp——cf1010D

    一个点的改变如果对根节点的值不会造成任何影响,那么这个点的所有子节点的改变也不会对根节点造成影响 因为每次只改一个叶子节点,也就是一条到根的路径,可以先预处理出初始情况下的每个结点的值 分别讨论根节点 ...

  4. 如何清除本机DNS缓存

    如何清除本机DNS缓存 在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其 解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成 ...

  5. VS2010-MFC(MFC常用类:定时器Timer)

    转自:http://www.jizhuomi.com/software/232.html 前面一节讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考 ...

  6. ASP.NET的Validform验证表单使用说明

    当我们写提交表单的时候往往需要验证表单是否填写了内容,是否正确,这个插件可以很方便的完成我们需要的验证! 使用方法: 1.引用JS <script type="text/javascr ...

  7. 《DSP using MATLAB》Problem 8.34

    今天下了小雨,空气中泛起潮湿的味道,阴冷的感觉袭来,心情受到小小影响. 代码: hp2lpfre子函数 function [wpLP, wsLP, alpha] = hp2lpfre(wphp, ws ...

  8. TKmybatis的框架介绍和原理分析及Mybatis新特性演示

    tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...

  9. 12-5-上下文this

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Oracle如何用单字段或多字段进行查重

    最近在整理数据形成信用报告,发现重复的数据真的多,梳理都好久.我就做个笔记把去掉重复数据的方法整理下来.方便我后期查阅. 我将我目前已知的两种去重方法分为:视图去重和表去重.原理就是有无rowid这个 ...