noip14
T1
考试假贪心,20pts,能摧毁就摧毁,不管前边已经摧毁的水晶。
正解:
首先肯定要离散化,然后考虑dp,设 \(dp_{i,j}\) 表示当前处理到了i,摧毁掉的水晶的a最小为j,则转移方程:
\]
\]
\]
\]
直接转移有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的方案数,那么转移方程:
\]
方程右侧前两项统计方案数,后一项做减法,容斥掉重复的。其中 \(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的更多相关文章
- 【NOIP14 D2T2】寻找道路
Source and Judge NOIP2014 提高组 D2T2Luogu2296Caioj1567 Problem [Description] 在有向图 G 中,每条边的长度均为 1,现给定起点 ...
- 20200713晚 noip14
考场 很紧张,上午考太烂了 开场看到"影魔",想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了 T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\} ...
随机推荐
- ABP Framework 为什么好上手,不好深入?探讨最佳学习姿势!
离写上一篇经验总结 ABP Framework 研习社经验总结(6.28-7.2) ,已经过去两周. ABP Framework 研习社(QQ群:726299208) 最近一周,又迎来了很多新伙伴,成 ...
- 架构之:REST和RESTful
目录 简介 REST REST和RESTful API REST架构的基本原则 Uniform interface统一的接口 Client–server 客户端和服务器端独立 Stateless无状态 ...
- 家庭账本开发day01
--好长时间没有进行web应用的开发,手有些生疏了,知识点也有些遗忘了,不过抹油关系,边开发边复习边学习新的东西. 今天主要完成了,家庭记账本的项目梳理,如下: 利用layUI模板 修改layUImi ...
- ES6 数组Arrary 常用方法
ES6 数组Arrary 常用方法: <script type="text/javascript"> // 操作数据方法 // arr.push() 从后面添加元素,返 ...
- debug:am、cmd命令源码分析
debug:am.cmd命令源码分析 目录 debug:am.cmd命令源码分析 am命令的实现 手机里的am am.jar cmd命令的实现 手机里的cmd cmd activity cmd.cpp ...
- npm WARN checkPermissions Missing write access to ......解决方法
npm安装出错 npm WARN checkPermissions Missing write access to ...... 解决方法: 删除本地node_modules文件夹,之后再次 npm ...
- 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统
文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...
- 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 ...
- Vue学习笔记(一)简单使用和插值操作
目录 一.Vue是什么 二.Vue简单体验 1. 声明式渲染 2. vue列表展示 3. 处理用户输入(事件监听) 三.插值操作 1. Mustache语法 2. 常用v-指令 v-once v-ht ...
- 在阿里云上单机部署k8s1.18
系统:CentOS Linux release 8.1.1911 配置主机名 [root@iZwz9e3t4tj14jzewdtvj8Z ~]# hostnamectl set-hostname la ...