T1

考试假贪心,20pts,能摧毁就摧毁,不管前边已经摧毁的水晶。

正解:

首先肯定要离散化,然后考虑dp,设 \(dp_{i,j}\) 表示当前处理到了i,摧毁掉的水晶的a最小为j,则转移方程:

\[a_{i}\le b_{i}
\]
\[dp_{i,a_{i}}=\max\left(dp_{i-1,b_{i+1}},dp_{i-1,b_{i+2}}...dp_{i-1,MAX}\right)+1
\]
\[a_{i}< b_{i}
\]
\[dp_{i,a_{i}}=\max\left(dp_{i-1,a_{i}+1},dp_{i-1,a_{i+2}}...dp_{i-1,MAX}\right)+1
\]

直接转移有60pts。

考虑优化,我们发现,第二维可放到线段树上去维护,转移就可以通过区间取最值,单点修改,区间加来完成。

有个sb坑点,单点修改的时候记得判断点是否比离散化后的点数大,如果大,则没有能够用来更新的它的点,直接break,或者一开始建树的时候,让右端点大一亿

Code
#include<cstdio>
#include<algorithm>
#define MAX 100010
#define re register
namespace OMA
{
int a[MAX],b[MAX];
int n,cnt,tmp[MAX<<1];
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
struct Segment_Tree
{
struct TREE
{
int val;
int l,r;
int lazy;
}st[MAX<<4];
inline int ls(int p)
{ return p<<1; }
inline int rs(int p)
{ return p<<1|1; }
inline int max(int a,int b)
{ return a>b?a:b; }
inline void Push_up(int p)
{ st[p].val = max(st[ls(p)].val,st[rs(p)].val); }
inline void Push_down(int p)
{
if(st[p].lazy)
{
st[ls(p)].val += st[p].lazy;
st[rs(p)].val += st[p].lazy;
st[ls(p)].lazy += st[p].lazy;
st[rs(p)].lazy += st[p].lazy;
st[p].lazy = 0;
}
}
inline void build(int p,int l,int r)
{
st[p].l = l,st[p].r = r;
if(l==r)
{ return ; }
int mid = (l+r)>>1;
build(ls(p),l,mid),build(rs(p),mid+1,r);
}
inline int query(int p,int l,int r)
{
if(l<=st[p].l&&st[p].r<=r)
{ return st[p].val; }
int xam = 0,mid = (st[p].l+st[p].r)>>1;
Push_down(p);
if(l<=mid)
{ xam = max(xam,query(ls(p),l,r)); }
if(r>mid)
{ xam = max(xam,query(rs(p),l,r)); }
return xam;
}
inline void update1(int p,int pos,int val)
{
if(pos==st[p].l&&st[p].r==pos)
{ st[p].val = max(st[p].val,val); return ; }
int mid = (st[p].l+st[p].r)>>1;
Push_down(p);
if(pos<=mid)
{ update1(ls(p),pos,val); }
if(pos>mid)
{ update1(rs(p),pos,val); }
Push_up(p);
}
inline void update2(int p,int l,int r)
{
if(l<=st[p].l&&st[p].r<=r)
{ st[p].val++,st[p].lazy++; return ; }
int mid = (st[p].l+st[p].r)>>1;
Push_down(p);
if(l<=mid)
{ update2(ls(p),l,r); }
if(r>mid)
{ update2(rs(p),l,r); }
Push_up(p);
}
}Tree;
signed main()
{
n = read();
for(re int i=1; i<=n; i++)
{ tmp[++cnt] = a[i] = read(),tmp[++cnt] = b[i] = read(); }
std::sort(tmp+1,tmp+1+cnt);
cnt = std::unique(tmp+1,tmp+1+cnt)-tmp;
for(re int i=1; i<=n; i++)
{
a[i] = std::lower_bound(tmp+1,tmp+1+cnt,a[i])-tmp;
b[i] = std::lower_bound(tmp+1,tmp+1+cnt,b[i])-tmp;
}
Tree.build(1,1,cnt+cnt);
for(re int i=n; i>=1; i--)
{
int val;
if(a[i]<=b[i])
{
val = Tree.query(1,1,a[i])+1;
//if(b[i]+1>cnt)
//{ continue ; }
Tree.update1(1,b[i]+1,val);
}
else
{
val = Tree.query(1,1,b[i])+1;
Tree.update1(1,b[i],val),Tree.update2(1,b[i]+1,a[i]);
}
}
printf("%d\n",Tree.st[1].val);
return 0;
}
}
signed main()
{ return OMA::main(); }

T2

没改出来,咕了,正解是主席树。

T3

正解是sbdp。

设 \(dp_{i,j}\) 表示处理到i位置,长度为j的方案数,那么转移方程:

\[dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}-dp_{p_{i}-1,j-1}
\]

方程右侧前两项统计方案数,后一项做减法,容斥掉重复的。其中 \(p_{i}\) 表示该字符上一次出现的位置。别忘了取模。

Code
#include<cstdio>
#include<cstring>
#define MAX 3010
#define re register
namespace OMA
{
char s[MAX];
int p[MAX],d;
int dp[MAX][MAX];
const int mod = 998244353;
inline int min(int a,int b)
{ return a<b?a:b; }
signed main()
{
scanf("%s%d",s+1,&d);
int len = strlen(s+1);
for(re int i=1; i<=len; i++)
{
dp[i][0] = 1;
for(re int j=i-1; j>=1; j--)
{
if(s[j]==s[i])
{ p[i] = j; break ; }
}
}
dp[0][0] = dp[1][1] = 1;
for(re int i=2; i<=len; i++)
{
for(re int j=1; j<=min(i,d); j++)
{
dp[i][j] = dp[i-1][j]+dp[i-1][j-1];
if(p[i])
{ dp[i][j] -= dp[p[i]-1][j-1]; }
dp[i][j] = (dp[i][j]%mod+mod)%mod;
}
}
printf("%d\n",dp[len][d]);
return 0;
}
}
signed main()
{ return OMA::main(); }

noip14的更多相关文章

  1. 【NOIP14 D2T2】寻找道路

    Source and Judge NOIP2014 提高组 D2T2Luogu2296Caioj1567 Problem [Description] 在有向图 G 中,每条边的长度均为 1,现给定起点 ...

  2. 20200713晚 noip14

    考场 很紧张,上午考太烂了 开场看到"影魔",想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了 T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\} ...

随机推荐

  1. ABP Framework 为什么好上手,不好深入?探讨最佳学习姿势!

    离写上一篇经验总结 ABP Framework 研习社经验总结(6.28-7.2) ,已经过去两周. ABP Framework 研习社(QQ群:726299208) 最近一周,又迎来了很多新伙伴,成 ...

  2. 架构之:REST和RESTful

    目录 简介 REST REST和RESTful API REST架构的基本原则 Uniform interface统一的接口 Client–server 客户端和服务器端独立 Stateless无状态 ...

  3. 家庭账本开发day01

    --好长时间没有进行web应用的开发,手有些生疏了,知识点也有些遗忘了,不过抹油关系,边开发边复习边学习新的东西. 今天主要完成了,家庭记账本的项目梳理,如下: 利用layUI模板 修改layUImi ...

  4. ES6 数组Arrary 常用方法

    ES6 数组Arrary 常用方法: <script type="text/javascript"> // 操作数据方法 // arr.push() 从后面添加元素,返 ...

  5. debug:am、cmd命令源码分析

    debug:am.cmd命令源码分析 目录 debug:am.cmd命令源码分析 am命令的实现 手机里的am am.jar cmd命令的实现 手机里的cmd cmd activity cmd.cpp ...

  6. npm WARN checkPermissions Missing write access to ......解决方法

    npm安装出错 npm WARN checkPermissions Missing write access to ...... 解决方法: 删除本地node_modules文件夹,之后再次 npm ...

  7. 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统

    文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...

  8. Liferay Portal CE 反序列化命令执行漏洞(CVE-2020-7961)

    影响范围 Liferay Portal 6.1.X Liferay Portal 6.2.X Liferay Portal 7.0.X Liferay Portal 7.1.X Liferay Por ...

  9. Vue学习笔记(一)简单使用和插值操作

    目录 一.Vue是什么 二.Vue简单体验 1. 声明式渲染 2. vue列表展示 3. 处理用户输入(事件监听) 三.插值操作 1. Mustache语法 2. 常用v-指令 v-once v-ht ...

  10. 在阿里云上单机部署k8s1.18

    系统:CentOS Linux release 8.1.1911 配置主机名 [root@iZwz9e3t4tj14jzewdtvj8Z ~]# hostnamectl set-hostname la ...