noip模拟14
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的更多相关文章
- NOIP模拟 14
垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd ...
- Noip模拟14 2021.7.13
T1 队长快跑 本身dp就不强的小马看到这题并未反映过来是个dp(可能是跟题面太过于像那个黑题的队长快跑相似) 总之,基础dp也没搞出来,不过这题倒是启发了小马以后考试要往dp哪里想想 $dp_{i, ...
- [NOIP模拟14]题解
当垃圾已经成为一种常态233333 A.旋转子段 考场上的$n^2$手残少了20分,555 (主要是因为实在打不出来$n^3$的做法所以写不了对拍?ccc为什么考场上没有想起有reverse()这么 ...
- [考试总结]noip模拟14
咕掉了好长时间,现在终于回来了.. 这次考试炸裂得很完蛋,直接分数上天. \(T1\) 本来想打一个记忆化搜索,然而老是通过不了样例,然后就挂了,只剩下了垃圾的 \(30pts\) 部分分数. 然而到 ...
- NOIP 模拟 $14\; \text{抛硬币}$
题解 \(by\;\;zj\varphi\) 签到题,自己看题解 Code #include<bits/stdc++.h> #define ri register signed #defi ...
- NOIP 模拟 $14\; \text{影魔}$
题解 \(by\;\;zj\varphi\) 不是原题 一道(对我来说)很需要技巧的题 对于颜色数如何处理 离线,将子树转化为 \(dfs\) 序,但这种做法无法处理深度 我们按照深度加点(可以通过 ...
- NOIP 模拟 $14\; \text{队长快跑}$
题解 \(by\;zj\varphi\) 一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少 看到数据范围,直接想离散化 设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁 ...
- NOIP模拟14「队长快跑·影魔·抛硬币」
T1:队长快跑 基本思路: 离散化·DP·数据结构优化DP 这三个我都没想到....气死. 定义状态数组:\(c[i][j]\)表示在i时最小的a值是j时可以摧毁的最多的水晶数. 那么 ...
- NOIP模拟 17.8.14
NOIP模拟17.8.14 (天宇哥哥考察细心程度的题) [样例解释]如果删去第一个 1:在[3,1,2]中有 3 个不同的数如果删去 3:在[1,1,2]中有 2 个不同的数如果删去第二个 1:在[ ...
随机推荐
- layim即时通讯实例各功能整合
一.系统演示1.1 聊天窗体主界面演示 1.2 模拟两人在线聊天(点击图片查看演示视频) 1.3 在线演示> 在线演示,点击进入系统到这里,若是您想要的,接下来听我娓娓道来二.开发工具开发软件: ...
- JUnit5依赖注入与测试接口
依赖注入 以前的JUnit的类构造方法和测试方法都是不能有参数的,JUnit Jupiter有一个颠覆性的改进,就是允许它们有入参,这样就能做依赖注入了. 如果你对pytest的fixture有了解的 ...
- 洛谷P5463 小鱼比可爱(加强版) 题解
写博客不易,来玩会? 这道题我和dalao们的做法略有不同,我用的是归并排序做法qwq 归并排序求逆序对大家应该很清楚了,我这里就来讲讲如何用归并排序求出这道题的答案 让我们先观察一下规律 举个栗子, ...
- jconsole和jstack
1.jconsole jconsole是jdk自带的一个可视化的jvm监控工具,可以监控本地的jvm,也可以监控远程jvm 打开本地jdk安装目录下的bin目录下的jconsole.exe 2.jst ...
- 关于hive的基础
Hive基础 1.引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 事实上,许多底层细节实际 ...
- 【动画消消乐】HTML+CSS 自定义加载动画 061
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专 ...
- python 子类调用 父类的构造函数
class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % sel ...
- 单细胞分析实录(19): 基于CellPhoneDB的细胞通讯分析及可视化 (下篇)
在上一篇帖子中,我介绍了CellPhoneDB的原理.实际操作,以及一些值得注意的地方.这一篇继续细胞通讯分析的可视化. 公众号后台回复20210723获取本次演示的测试数据,以及主要的可视化代码. ...
- 【洛谷P2623物品选取】动态规划
分析 各种背包弄在一起. AC代码 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #def ...
- 【codeforces1058】Vasya and Golden Ticket 枚举+暴力+模拟
#点击传送 题目描述 Recently Vasya found a golden ticket - a sequence which consists of nn digits a1a2-ana1a2 ...