20200713晚 noip14
考场
很紧张,上午考太烂了
开场看到“影魔”,想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了
T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\}\),发现有问题。改成 DP,\(f[i,j]\) 表示前 \(i\) 个水晶只选选 \(a\ge j\) 的最长路,每次从 \(f[i-1][b[i]+1..\max\{a,b\}]\) 转移。
T2 隐约记得是线段树,具体想不起来了。发现 \(d=10^9\) 可以离线,线段树合并。
T3 先想了想 DP,发现不好去重,于是掉进序列自动机的大坑再也没出来。画了一页草稿纸只找到了一个 \(O(|S|L^2\log|S|)\) 的正确性不会证的做法。在想题的 1h 中这个题大概就废了 30min。
T1 写完暴力肉眼观察,想到把第二维改成线段树,以 \(a[i]\) 分界,变成区间查询 \(\max\),区间取 \(\max\),写完过不了样例,发现离散化锅了,后来顿悟 \(b[i]+1..a[i]\) 是区间加,发现自己不会推 \(\text{max,add}\) 两个懒标记,胡了半天也过不去,此时已经 8.20 了。
赶紧上了个厕所开始写 T2 T3 的暴力,T2 的部分分也没顾上写就 9.00 了。。。当时以为 9.20 结束,就很慌(T1 还处于爆 \(0\) 状态),想了想决定冲 T1,改了一堆地方最终在不到 9.20 过了样例开拍(但是以为懒标记推对了,考后发现是区间取 \(\max\) 改成了单点)。交题的时候发现 9.40 结束?!又开始 Rush T2 的部分分,仔细一想子树拉到 dfs 序上就变成了《HH的项链》,但是忘记了 BIT 的做法,于是大力卡常写了莫队,好在写完了。
res
rk3 90+50+50
T1 离散化出锅挂了 10pts,只能说数据水
T2 大力卡常能过随机数据的 10pts,小亏
rk1 杨卓凡 100+50+100
rk5 马瑞暄 60+60+50
队长快跑
线段树优化 DP
考场 shit
const int N = 1e5+5;
int n,a[N],b[N];
int mx,ans,lsh[N*2];
#define ls (u<<1)
#define rs (u<<1|1)
struct Seg {
int l,r,mx,add,lt;
} t[N*8];
void up(int u) { t[u].mx = max(t[ls].mx,t[rs].mx); }
void addd(int x,int u) { t[u].mx += x, t[u].lt += x, t[u].add += x; }
void maxx(int x,int u) { t[u].mx = max(t[u].mx,x), t[u].lt = max(t[u].lt,x); }
void down(int u) {
addd(t[u].add,ls), addd(t[u].add,rs);
maxx(t[u].lt,ls), maxx(t[u].lt,rs);
t[u].lt = t[u].add = 0;
}
void build(int u,int l,int r) {
t[u].l = l, t[u].r = r;
if( l == r ) return;
int mid = l+r>>1;
build(ls,l,mid), build(rs,mid+1,r);
}
int query(int u,int l,int r) {
if( l <= t[u].l && t[u].r <= r ) return t[u].mx;
down(u);
int res = 0;
if( l <= t[ls].r ) res = query(ls,l,r);
if( t[rs].l <= r ) res = max(res,query(rs,l,r));
return res;
}
void add(int u,int l,int r) {
if( l <= t[u].l && t[u].r <= r ) { addd(1,u); return; }
// if( t[u].l == t[u].r ) { ++t[u].mx; return; }
down(u);
if( l <= t[ls].r ) add(ls,l,r);
if( t[rs].l <= r ) add(rs,l,r);
up(u);
}
void modify(int u,int l,int r,int x) {
if( l <= t[u].l && t[u].r <= r ) { maxx(x,u); return; }
down(u);
if( l <= t[ls].r ) modify(ls,l,r,x);
if( t[rs].l <= r ) modify(rs,l,r,x);
up(u);
}
#undef ls
#undef rs
/*
void debug() {
For(i,1,mx) printf("%d ",query(1,i,i));
putchar(10);
// For(i,1,n*8) if( t[i].l )
// printf("> [%d,%d] %d\n",t[i].l,t[i].r,t[i].mx);
}
*/
signed main() {
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
read(n);
For(i,1,n) read(a[i],b[i]), lsh[i] = a[i], lsh[i+n] = b[i];
sort(lsh+1,lsh+n*2+1);
mx = unique(lsh+1,lsh+n*2+1)-lsh-1;
For(i,1,n)
a[i] = lower_bound(lsh+1,lsh+mx+1,a[i])-lsh,
b[i] = lower_bound(lsh+1,lsh+mx+1,b[i])-lsh;
build(1,1,mx);
// debug();
For(i,1,n) {
if( b[i] < a[i] ) {
add(1,b[i]+1,a[i]);
if( a[i] < mx ) modify(1,a[i],a[i],query(1,a[i]+1,mx)+1);
} else if( b[i] < mx ) modify(1,a[i],a[i],query(1,b[i]+1,mx)+1);
// debug();
}
printf("%d",t[1].mx);
return 0;
}
影魔
先说在线做法:
考虑没有深度限制,那就找到每个点 \(u\) 在 dfs 序上同色的前驱 \(pre\)、后继 \(suf\),然后树上差分+容斥 \(u+1,lca(pre,u)-1,lca(u,suf)-1,lca(pre,suf)+1\),线段树维护子树和。
有深度限制就按深度插入主席树。每个版本上要修改多次,注意细节。
code
const int N = 1e5+5;
int n,m,fa[N],col[N];
vector<int> to[N];
int ind,mxdep,dep[N],siz[N],son[N],top[N],dfn[N],id[N],rt[N];
queue<int> que;
set<int> st[N];
void dfs1(int u) {
dep[u] = dep[fa[u]]+1, mxdep = max(mxdep,dep[u]);
siz[u] = 1;
for(int v : to[u]) {
dfs1(v);
siz[u] += siz[v];
if( siz[v] > siz[son[u]] ) son[u] = v;
}
}
void dfs2(int u,int tp) {
top[u] = tp, dfn[u] = ++ind, id[ind] = u;
if( son[u] ) dfs2(son[u],tp);
for(int v : to[u]) if( v != son[u] ) dfs2(v,v);
}
int lca(int u,int v) {
while( top[u] != top[v] ) {
if( dep[top[u]] < dep[top[v]] ) swap(u,v);
u = fa[top[u]];
}
return dep[u]<dep[v] ? u : v;
}
#define mid ((l+r)>>1)
class HJT {
private:
struct Seg {
int ch[2],siz;
#define ls(x) t[x].ch[0]
#define rs(x) t[x].ch[1]
} t[N*68];
public:
void insert(int u,int &v,int l,int r,int p,int x) {
t[ v=++ind ] = t[u], t[v].siz += x;
if( l == r ) return;
if( p <= mid ) insert(ls(u),ls(v),l,mid,p,x);
else insert(rs(u),rs(v),mid+1,r,p,x);
}
int query(int u,int l,int r,int ql,int qr) {
if( !u || (ql <= l && r <= qr) ) return t[u].siz;
int res=0;
if( ql <= mid ) res = query(ls(u),l,mid,ql,qr);
if( mid < qr ) res += query(rs(u),mid+1,r,ql,qr);
return res;
}
} hjt;
#undef mid
signed main() {
read(n,m);
For(i,1,n) read(col[i]);
For(i,2,n) {
read(fa[i]);
to[fa[i]].pb(i);
}
dfs1(1), dfs2(1,1);
ind = 0;
que.push(1);
while( !que.empty() ) {
int u = que.front(), pre=0, suf=0; que.pop();
auto it = st[col[u]].upper_bound(dfn[u]);
if( it != st[col[u]].end() ) suf = id[*it];
if( it != st[col[u]].begin() ) pre = id[*--it];
if( !rt[dep[u]] ) hjt.insert(rt[dep[u]-1],rt[dep[u]],1,n,dfn[u],1);
else hjt.insert(rt[dep[u]],rt[dep[u]],1,n,dfn[u],1);
if( pre ) hjt.insert(rt[dep[u]],rt[dep[u]],1,n,dfn[lca(pre,u)],-1);
if( suf ) hjt.insert(rt[dep[u]],rt[dep[u]],1,n,dfn[lca(u,suf)],-1);
if( pre && suf )
hjt.insert(rt[dep[u]],rt[dep[u]],1,n,dfn[lca(pre,suf)],1);
st[col[u]].insert(dfn[u]);
for(int v : to[u]) que.push(v);
}
while( m-- ) {
int u,d; read(u,d);
printf("%d\n",
hjt.query(rt[min(dep[u]+d,mxdep)],1,n,dfn[u],dfn[u]+siz[u]-1));
}
return 0;
}
但这个题没有强制在线,我们就可以离线水过去,而且时间、代码复杂度吊打在线做法。
这个离线做法的统计答案部分与树上逆序对有点像。
抛硬币
出题人说是“⼀道送温暖的⼩⽔题”,本场最简单的题。。。
设 \(f[i,j]\) 为前 \(i\) 个字符中长度为 \(j\) 的本质不同子序列数。显然有 \(f[i,j]=f[i-1,j]+f[i-1,j-1]\)。问题在于会算重,那么找到最大的 \(lst\) 使 \(lst<i,s[lst]=s[i]\),算重的部分即为 \(f[lst-1,j-1]\)
code
const int N = 3005, mod = 998244353;
int l;
char s[N];
int n,lst[26],f[N][N];
signed main() {
scanf("%s%d",s+1,&l); n = strlen(s+1);
For(i,0,n) f[i][0] = 1;
For(i,1,n) {
int x = s[i]-'a';
For(j,1,l) {
f[i][j] = (f[i-1][j] + f[i-1][j-1]) %mod;
if( lst[x] ) f[i][j] = (f[i][j] - f[lst[x]-1][j-1] +mod) %mod;
}
lst[x] = i;
}
printf("%d",f[n][l]);
return 0;
}
20200713晚 noip14的更多相关文章
- 亲临现场不是梦,2017央视春晚推出VR直播
自里约奥运会首次试水VR直播 后,用户开始关注这种观影方式,一瞬间VR直播开始流行.就在月初,江苏卫视宣布2017年跨年晚会将进行VR全景直播.当然,央视是绝对不会错过这中潮流方式. 据悉,央视201 ...
- MSSQL日志传送出现“LSN 太晚,无法应用到数据库”
一个月之前配置了日志传送的数据库,在今天早上收到作业警报:"LSRestore_ServerName_Databasename"运行失败,到历史记录中查看,错误信息如下 消息 20 ...
- 献给广大it从业人士:早睡早起,晚睡也早起
早睡早起占人体健康的百分之七十:心态.饮食.及时调理各占百分之十,我们就可以知道早睡早起的重要性. 我们白天是放电,晚上睡觉是充电.晚上只冲了50%的电,白天还要释放100%,那50%哪来的?就是从五 ...
- 屌丝逆袭--Asp.net快速入门学习教程 第1晚
本人屌丝一名,因工作原因,不能白天学习编程,所以只能做夜猫子学习编程,期待一天能逆袭成一名高帅富的技术大牛(靠,都想到流口水了........囧). 本教程记录本屌丝学习Asp.net的过程,大牛就飞 ...
- 又折腾到这么晚 , 图片Viewpager PagerIndicator,listview 和侧边栏滑动的事件处理
代码 思路 根据坐标判断 事件是否拦截 调用 getParent().requestDisallowInterceptTouchEvent(true);方法告诉上层ViewGroup 是否拦截 返回t ...
- 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦
认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...
- 大晚上装CocoaPods出现错误坑爹
大晚上装CocoaPods出现错误坑爹 [!] Pod::Executable clone 'https://github.com/CocoaPods/Specs.git' master xcrun: ...
- myeclipse中控制台日志比实际晚8小时解决方法及java日志处理
今天终于忍不住要解决myeclipse控制台中日志显示比实际晚8小时的问题,开始以为myeclipse编辑器时间问题,后来想想不对,myeclipse控制台打印的是tomcat的日志,随后以为是log ...
- win7和ubuntu双系统,win7时间晚8小时解决办法。
装了Win7和Ubuntu双系统后发现,使用Ubuntu后再登陆win7时系统显示时间不准确,比实际时间晚了8小时. 搜索后发现原来Linux和Windows的系统时间管理是不同的.Linux是以主板 ...
随机推荐
- Java代码中,如何监控Mysql的binlog?
最近在工作中,遇到了这样一个业务场景,我们需要关注一个业务系统数据库中某几张表的数据,当数据发生新增或修改时,将它同步到另一个业务系统数据库中的表中. 一提到数据库的同步,估计大家第一时间想到的就是基 ...
- OpenGL学习笔记(二)画三角形
目录 渲染管线(Graphics Pipeline) 编码实现 顶点数据 顶点缓冲对象(VBO) 顶点着色器 编译着色器 片段着色器 着色器程序 链接顶点属性 顶点数组对象 最终绘制三角形 索引缓冲对 ...
- WinUI 3学习笔记(2)—— 用ListView来展示集合
在WPF的时代,我们多是使用ListBox和ListView来展示,纵向滚动条显示的集合数据.这两个控件的默认样式,以及对触控的支持,已完全落后于时代.他们两个分别长这样,和Win10及Win11的风 ...
- 获取异常信息里再出异常就找不到日志了,我TM人傻了
本系列是 我TM人傻了 系列第三期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 最近组 ...
- 苹果手机点击输入框input 页面放大 超出屏幕问题
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale ...
- 使用PageFactory类封装页面元素,并实现简单的登录
1.新建页面对象类LoginPage import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; impo ...
- 009 FPGA实现网口通信的几种方式【转载】
从硬件上来说,一般PHY芯片为模数混合电路,负责接收电.光这类模拟信号,经过解调和A/D转换后通过MII接口将信号交给MAC芯片进行处理.一般MAC芯片为纯数字电路. 物理层定义了数据传送与接收所需要 ...
- linux /etc/passwd详解
文件概述 Linux 系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中绝大部分的用户基本信息,并不是所有,所有用户都可以对此文件执行读操作.(如果通过其他方式创建管理的用户名. ...
- 题解 b
传送门 考场上只会暴力 \(n^4\) DP,部分分还写炸了 但其实这个DP可以前缀和优化到 \(n^3\) ,我觉得没有这档部分分就没写 但其实是有这一档的,我没有看出来-- 正解想不到 如果我们已 ...
- DLL-创建DLL
动态链接库的创建 fangyukuan 2010.6.20 编写DLL时的函数与一般的函数方法基本一样.但要对库中的函数进行必要的声明,以说明哪些函数是可以导出的,哪些函数是不可以导出的. 把DLL中 ...