HZOI20190908模拟40 队长快跑,影魔,抛硬币 题解
题面: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 队长快跑,影魔,抛硬币 题解的更多相关文章
- NOIP模拟14「队长快跑·影魔·抛硬币」
T1:队长快跑 基本思路: 离散化·DP·数据结构优化DP 这三个我都没想到....气死. 定义状态数组:\(c[i][j]\)表示在i时最小的a值是j时可以摧毁的最多的水晶数. 那么 ...
- [CSP-S模拟测试]:队长快跑(DP+离散化+线段树)
题目背景 传说中,在远古时代,巨龙大$Y$将$P$国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个$P$国的所有冒险家前去夺回,尤其是皇家卫士队的队长小$W$.在$P$国量子科技实验室的帮助下,队长小$ ...
- BZOJ4829: [Hnoi2017]队长快跑
BZOJ4829: [Hnoi2017]队长快跑 Description 众所周知,在P国外不远处盘踞着巨龙大Y. 传说中,在远古时代,巨龙大Y将P国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个P国的 ...
- [LOJ 2022]「AHOI / HNOI2017」队长快跑
[LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...
- NOIP 模拟 $14\; \text{队长快跑}$
题解 \(by\;zj\varphi\) 一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少 看到数据范围,直接想离散化 设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁 ...
- 20190908 NOIP 模拟40
考试过程: 刚看完题,发现T1是个类lis 问题,但要求$O(nlogn)$,应该是个数据结构优化dp,T2应该是个数据结构,T3是个字符串?没有匹配,不会是后缀数组吧,这是NOIP模拟啊,可能是个d ...
- csps模拟92数列,数对,最小距离题解
题面:https://www.cnblogs.com/Juve/articles/11767225.html 数列: 简化题意:已知a,b,c,求满足$a*x+b*y=c$的$x+y$最小值 然后ex ...
- 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...
- LYK 快跑!(LYK别打我-)(话说LYK是谁)
LYK 快跑!(run) Time Limit:5000ms Memory Limit:64MB 题目描述 LYK 陷进了一个迷宫! 这个迷宫是网格图形状的. LYK 一开始在(1,1)位置, 出口在 ...
随机推荐
- 【luoguP3868】猜数字
description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...
- 【JZOJ6273】欠钱
description analysis 读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值 那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲 明显\(LC ...
- thinkphp 模块化设计
一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器. ThinkPHP3.2采用模块化的架构设计思想,对目录结构规范做了调整,可以支持多模块 ...
- luoguP1062 数列 [数学]
题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...
- 0921CSP-S模拟测试赛后总结
倒数第一祭. 感觉T3数据范围50可以qj一下.于是押了T3. 然后两个小时调我4.1k的bfs.最后调出来了发现策略错了.十分绝望. T120分吊住了.十分难过.倒数第一了.还是实力不行. 不应该押 ...
- hibernate_05_hibernateHQL查询QBC查询和SQL查询
1.HQL简介:HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活.更为强大的查询能力:HQL更接近SQL语句查询语法.Hibernate ...
- 微信小程序 tabBar模板
tabBar导航栏 小程序tabBar,我们可以通过app.json进行配置,可以放置于顶部或者底部,用于不同功能页面的切换,挺好的... 但,,,貌似不能让动态修改tabBar(需求:通过switc ...
- Eclipse 连接MySql数据库总结
Eclipse 连接MySql数据库总结 一.在MySql中创建数据库,并创建表,向表中插入数据 1.创建数据库 create database select_test 2.创建表 create ta ...
- 【转载】Kafka介绍及升级经验分享
http://blog.talkingdata.net/?p=3165 背景 当时的现状:开始使用Kafka的时候,使用的版本是0.7.2,当时的目的是为了替代kestrel,主要是使用Kafka来做 ...
- 2019-7-1-Roslyn-让编译时候-Message-内容默认输出
title author date CreateTime categories Roslyn 让编译时候 Message 内容默认输出 lindexi 2019-07-01 14:16:59 +080 ...