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 后端开发学习路线
大家好,我是帅地. 接下来的一段时间,帅地会总结各种技术栈的学习路线,例如 Java 开发,C++ 开发,python 开发,前端开发等等,假如你没有明确的目标,或许可以按照我说的学习路线来学习一波, ...
- 一键设置WPS_Office_2019专业版的定时自动备份的批处理文件
一键设置WPS_Office_2019专业版的定时自动备份的批处理文件 rem ================================================ rem 一键设置WPS ...
- 安装Linux的步骤 包含linux下安装jdk,及mysql
https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ 镜像下载网址,4G 左右. 安装VMware 15版本 一路下一步, ...
- HCIA—(网络初相识)
网络 IT--> 信息服务 -->数据底层 云计算 大数据 CT--> 通信服务 -->通信服务 构建数据通信的协议 ICT-->信息通信 数据 + 通信 数通 基础 R ...
- 三年Android开发快手、美团、支付宝连挂,怒刷1549页面试题字节上岸
刚开始面试的时候我真的是处处碰壁,面一家挂一家,面完之后怀疑自我,是不是自己真的太菜了找不到工作.工作本身就是双向选择,一家不行再换一家,总有合适的,千万不要因为别人的一句话就全盘否定自己,一定要自信 ...
- ES6与ES2015、ES2016以及ECMAScript的区别
1. ECMAScript 和 JavaScript 的关系 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现. javascript是netscape ...
- Python正则表达式re库的初次使用入门
正则表达式常用操作符: 操作符 说明 实例 . 表示任何单个字符,不包括换行符 [] 字符集,对单个字符给出取值范围 [abc]表示a.b.c,[a-z]表示a到z单个字符 [^ ] 非字符集 [^a ...
- 实战爬取某网站图片-Python
直接上代码 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 from bs4 import BeautifulSoup 4 import request ...
- char、signed char、unsigned char的区别总结。
转载地址:http://hi.baidu.com/thewillreigns/blog/item/67e665c4296e69c038db492d.html char 和 unsigned char是 ...
- 《手把手教你》系列技巧篇(十八)-java+ selenium自动化测试-元素定位大法之By css中卷(详细教程)
1.简介 按计划今天宏哥继续讲解倚天剑-css的定位元素的方法:ID属性值定位.其他属性值定位和使用属性值的一部分定位(这个类似xpath的模糊定位). 2.常用定位方法(8种) (1)id(2)na ...