T1

离散化后线段树维护\(dp\),\(fi\)表示最小值为\(i\)时最多点亮多少个,

区间操作即可。

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define int long long
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef long long ll;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline int min(int a,int b){return a<b?a:b;}inline int max(int a,int b){return a>b?a:b;}
inline void pi(int x){pf("%lld ",x);}inline void pn(){pf("\n");}const int N=1e5+100;
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
int n;int a[N<<4],b[N<<4],s[N<<4],cnt;
struct tree{int val,lz;}t[N<<4];
inline void down(int p){
if(t[p].lz){
t[p<<1].lz+=t[p].lz;t[p<<1|1].lz+=t[p].lz;
t[p<<1].val+=t[p].lz;t[p<<1|1].val+=t[p].lz;
t[p].lz=0;
}
}
inline void up(int p){
t[p].val=max(t[p<<1].val,t[p<<1|1].val);
}
inline void add(int p,int l,int r,int ql,int qr){
if(ql>qr)return;
if(l>=ql&&r<=qr){
++t[p].lz;++t[p].val;
return;
}down(p);
int mid=(l+r)>>1;
if(qr<=mid)add(p<<1,l,mid,ql,qr);
else if(ql>mid)add(p<<1|1,mid+1,r,ql,qr);
else add(p<<1,l,mid,ql,mid),add(p<<1|1,mid+1,r,mid+1,qr);
up(p);
}
inline int getmax(int p,int l,int r,int ql,int qr){
if(ql>qr)return 0;
if(l>=ql&&r<=qr){
return t[p].val;
}down(p);
int mid=(l+r)>>1;
if(qr<=mid)return getmax(p<<1,l,mid,ql,qr);
if(ql>mid)return getmax(p<<1|1,mid+1,r,ql,qr);
return max(getmax(p<<1,l,mid,ql,mid),getmax(p<<1|1,mid+1,r,mid+1,qr));
}
inline void change(int p,int l,int r,int x,int v){
if(l==r){
t[p].val=max(t[p].val,v);
return;
}down(p);
int mid=(l+r)>>1;
if(x<=mid)change(p<<1,l,mid,x,v);
else change(p<<1|1,mid+1,r,x,v);
up(p);
}
inline short main(){
n=read();
F(i,1,n)s[++cnt]=a[i]=read(),s[++cnt]=b[i]=read();
std::sort(s+1,s+cnt+1);
int len=std::unique(s+1,s+cnt+1)-s-1;
F(i,1,n)a[i]=std::lower_bound(s+1,s+len+1,a[i])-s,b[i]=std::lower_bound(s+1,s+len+1,b[i])-s;
F(i,1,n){
if(a[i]<=b[i]){
int x=getmax(1,1,len,b[i]+1,len);
change(1,1,len,a[i],x+1);
}else{
int x=getmax(1,1,len,a[i],len);
change(1,1,len,a[i],x+1);
add(1,1,len,b[i]+1,a[i]-1);
}
}
pi(getmax(1,1,len,1,len));
return 0;
}
}
signed main(){return EMT::main();}

T2

用一手主席树,按照深度插入,这里历史版本比较特殊,还要边插入边修改,

判断和上个版本的相似情况即可。

set维护dfs序,在i与i的前趋、后继的lca处分别减1,前趋后继的lca处加1,每次查找前趋后继为O(logn).

ps:主席树的ls和rs不再是\(p<<1\)和\(p<<1|1\)了!调了半天。

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef long long ll;//(double)clock() / (double)CLOCKS_PER_SEC;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline int min(int a,int b){return a<b?a:b;}inline int max(int a,int b){return a>b?a:b;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
const int N=1e5+100;
int n,m,c[N],deep[N],head[N],co,ti,time[N];
struct node{int next,to;}e[N];
struct tp{int top,son,size,dfn,fa;}w[N];
struct pt{int id,deep,pre,nxt;}p[N];
inline void add(int next,int to){e[++co].next=head[next],e[co].to=to;head[next]=co;}
inline void dfs1(int k){
w[k].son=-1;w[k].size=1;
for(register int i=head[k];i;i=e[i].next){
w[e[i].to].fa=k;deep[e[i].to]=deep[k]+1;
dfs1(e[i].to);
w[k].size+=w[e[i].to].size;
if(w[k].son==-1||w[w[k].son].size<w[e[i].to].size)w[k].son=e[i].to;
}
}
inline void dfs2(int k,int tp){
w[k].top=tp;w[k].dfn=++ti;time[ti]=k;
if(w[k].son==-1)return;
dfs2(w[k].son,tp);
for(register int i=head[k];i;i=e[i].next)
if(e[i].to!=w[k].son)
dfs2(e[i].to,e[i].to);
}
inline int getlca(int x,int y){
int fx=w[x].top,fy=w[y].top;
while(fx!=fy){
if(deep[fx]>=deep[fy])x=w[fx].fa;
else y=w[fy].fa;
fx=w[x].top,fy=w[y].top;
}if(deep[x]>=deep[y])return y;return x;
}
inline bool cmp(pt a,pt b){return a.deep<b.deep;}
std::set<int>v[N];
int root[N],tot,sum[N*40],ls[N*40],rs[N*40];
inline void up(int p){
sum[p]=0;
if(ls[p])sum[p]+=sum[ls[p]];
if(rs[p])sum[p]+=sum[rs[p]];
}
inline void add(int x,int &y,int l,int r,int t,int v){
if(!y){
y=++tot;sum[y]=sum[x];ls[y]=ls[x];rs[y]=rs[x];
}if(l==r){sum[y]+=v;return;}
int mid=(l+r)>>1;
if(t<=mid){if(ls[x]==ls[y])ls[y]=0;add(ls[x],ls[y],l,mid,t,v);}
else {if(rs[x]==rs[y])rs[y]=0;add(rs[x],rs[y],mid+1,r,t,v);}
up(y);
}
inline int query(int p,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr)return sum[p];
int mid=(l+r)>>1;
if(qr<=mid)return query(ls[p],l,mid,ql,qr);
if(ql>mid)return query(rs[p],mid+1,r,ql,qr);
return query(ls[p],l,mid,ql,mid)+query(rs[p],mid+1,r,mid+1,qr);
}
inline short main(){
//file();
n=read(),m=read();
F(i,1,n)c[i]=read(),p[i].id=i;
F(i,2,n){int x=read();add(x,i);}
deep[1]=1;
dfs1(1);dfs2(1,1);
F(i,1,n)p[i].deep=deep[i];
std::sort(p+1,p+n+1,cmp);
F(i,1,n){
add(root[p[i].deep-1],root[p[i].deep],1,n,w[p[i].id].dfn,1);
v[c[p[i].id]].insert(w[p[i].id].dfn);
std::set<int>::iterator it1,it;it1=it=v[c[p[i].id]].find(w[p[i].id].dfn);
if(it==v[c[p[i].id]].begin())p[i].pre=0;else it--,p[i].pre=time[*it];
it1++;
if(it1==v[c[p[i].id]].end())p[i].nxt=0;else p[i].nxt=time[*it1];
if(p[i].nxt)add(root[p[i].deep-1],root[p[i].deep],1,n,w[getlca(p[i].nxt,p[i].id)].dfn,-1);
if(p[i].pre)add(root[p[i].deep-1],root[p[i].deep],1,n,w[getlca(p[i].pre,p[i].id)].dfn,-1);
if(p[i].nxt&&p[i].pre)
add(root[p[i].deep-1],root[p[i].deep],1,n,w[getlca(p[i].pre,p[i].nxt)].dfn,1);
}
F(i,1,m){
int u=read(),d=read();
pi(query(root[min(deep[u]+d,p[n].deep)],1,n,w[u].dfn,w[u].dfn+w[u].size-1));
pn();
}
return 0;
}
}
signed main(){return EMT::main();}

T3

设\(f_{i,j}\)表示到\(i\)点长度为\(j\)的方案数

\(p_i\)为上一个相似的字符位置,

则有:

f[i][j]=f[i-1][j]+f[i-1][j-1]-(p[i][s[i]-'a']?f[p[i][s[i]-'a']-1][j-1]:0))

递推即可

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef long long ll;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline int min(int a,int b){return a<b?a:b;}inline int max(int a,int b){return a>b?a:b;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
const int N=3e3+10;const int mod=998244353;
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
int n,l,p[N][30],f[N][N];char s[N];
inline void db(){pf("debug\n");}
inline short main(){
int x=scanf("%s",s+1);
l=read();n=strlen(s+1);
F(i,2,n){
F(j,0,25){
p[i][j]=p[i-1][j];
}p[i][s[i-1]-'a']=i-1;
}
f[1][1]=1;
F(i,2,n){f[i][1]=p[i][s[i]-'a']?f[i-1][1]:f[i-1][1]+1;F(j,2,min(i-1,l))f[i][j]=((f[i-1][j]+f[i-1][j-1]-(p[i][s[i]-'a']?f[p[i][s[i]-'a']-1][j-1]:0))%mod+mod)%mod;f[i][i]=1;}
pi(f[n][l]);
return 0;
}
}
signed main(){return EMT::main();}

noip模拟14的更多相关文章

  1. NOIP模拟 14

    垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd ...

  2. Noip模拟14 2021.7.13

    T1 队长快跑 本身dp就不强的小马看到这题并未反映过来是个dp(可能是跟题面太过于像那个黑题的队长快跑相似) 总之,基础dp也没搞出来,不过这题倒是启发了小马以后考试要往dp哪里想想 $dp_{i, ...

  3. [NOIP模拟14]题解

    当垃圾已经成为一种常态233333 A.旋转子段 考场上的$n^2$手残少了20分,555  (主要是因为实在打不出来$n^3$的做法所以写不了对拍?ccc为什么考场上没有想起有reverse()这么 ...

  4. [考试总结]noip模拟14

    咕掉了好长时间,现在终于回来了.. 这次考试炸裂得很完蛋,直接分数上天. \(T1\) 本来想打一个记忆化搜索,然而老是通过不了样例,然后就挂了,只剩下了垃圾的 \(30pts\) 部分分数. 然而到 ...

  5. NOIP 模拟 $14\; \text{抛硬币}$

    题解 \(by\;\;zj\varphi\) 签到题,自己看题解 Code #include<bits/stdc++.h> #define ri register signed #defi ...

  6. NOIP 模拟 $14\; \text{影魔}$

    题解 \(by\;\;zj\varphi\) 不是原题 一道(对我来说)很需要技巧的题 对于颜色数如何处理 离线,将子树转化为 \(dfs\) 序,但这种做法无法处理深度 我们按照深度加点(可以通过 ...

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

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

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

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

  9. NOIP模拟 17.8.14

    NOIP模拟17.8.14 (天宇哥哥考察细心程度的题) [样例解释]如果删去第一个 1:在[3,1,2]中有 3 个不同的数如果删去 3:在[1,1,2]中有 2 个不同的数如果删去第二个 1:在[ ...

随机推荐

  1. layim即时通讯实例各功能整合

    一.系统演示1.1 聊天窗体主界面演示 1.2 模拟两人在线聊天(点击图片查看演示视频) 1.3 在线演示> 在线演示,点击进入系统到这里,若是您想要的,接下来听我娓娓道来二.开发工具开发软件: ...

  2. JUnit5依赖注入与测试接口

    依赖注入 以前的JUnit的类构造方法和测试方法都是不能有参数的,JUnit Jupiter有一个颠覆性的改进,就是允许它们有入参,这样就能做依赖注入了. 如果你对pytest的fixture有了解的 ...

  3. 洛谷P5463 小鱼比可爱(加强版) 题解

    写博客不易,来玩会? 这道题我和dalao们的做法略有不同,我用的是归并排序做法qwq 归并排序求逆序对大家应该很清楚了,我这里就来讲讲如何用归并排序求出这道题的答案 让我们先观察一下规律 举个栗子, ...

  4. jconsole和jstack

    1.jconsole jconsole是jdk自带的一个可视化的jvm监控工具,可以监控本地的jvm,也可以监控远程jvm 打开本地jdk安装目录下的bin目录下的jconsole.exe 2.jst ...

  5. 关于hive的基础

    Hive基础 1.引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 事实上,许多底层细节实际 ...

  6. 【动画消消乐】HTML+CSS 自定义加载动画 061

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专 ...

  7. python 子类调用 父类的构造函数

    class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % sel ...

  8. 单细胞分析实录(19): 基于CellPhoneDB的细胞通讯分析及可视化 (下篇)

    在上一篇帖子中,我介绍了CellPhoneDB的原理.实际操作,以及一些值得注意的地方.这一篇继续细胞通讯分析的可视化. 公众号后台回复20210723获取本次演示的测试数据,以及主要的可视化代码. ...

  9. 【洛谷P2623物品选取】动态规划

    分析 各种背包弄在一起. AC代码 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #def ...

  10. 【codeforces1058】Vasya and Golden Ticket 枚举+暴力+模拟

    #点击传送 题目描述 Recently Vasya found a golden ticket - a sequence which consists of nn digits a1a2-ana1a2 ...