考场

很紧张,上午考太烂了

开场看到“影魔”,想起以前看过(但没做),心态爆炸,咆哮时被 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的更多相关文章

  1. 亲临现场不是梦,2017央视春晚推出VR直播

    自里约奥运会首次试水VR直播 后,用户开始关注这种观影方式,一瞬间VR直播开始流行.就在月初,江苏卫视宣布2017年跨年晚会将进行VR全景直播.当然,央视是绝对不会错过这中潮流方式. 据悉,央视201 ...

  2. MSSQL日志传送出现“LSN 太晚,无法应用到数据库”

    一个月之前配置了日志传送的数据库,在今天早上收到作业警报:"LSRestore_ServerName_Databasename"运行失败,到历史记录中查看,错误信息如下 消息 20 ...

  3. 献给广大it从业人士:早睡早起,晚睡也早起

    早睡早起占人体健康的百分之七十:心态.饮食.及时调理各占百分之十,我们就可以知道早睡早起的重要性. 我们白天是放电,晚上睡觉是充电.晚上只冲了50%的电,白天还要释放100%,那50%哪来的?就是从五 ...

  4. 屌丝逆袭--Asp.net快速入门学习教程 第1晚

    本人屌丝一名,因工作原因,不能白天学习编程,所以只能做夜猫子学习编程,期待一天能逆袭成一名高帅富的技术大牛(靠,都想到流口水了........囧). 本教程记录本屌丝学习Asp.net的过程,大牛就飞 ...

  5. 又折腾到这么晚 , 图片Viewpager PagerIndicator,listview 和侧边栏滑动的事件处理

    代码 思路 根据坐标判断 事件是否拦截 调用 getParent().requestDisallowInterceptTouchEvent(true);方法告诉上层ViewGroup 是否拦截 返回t ...

  6. 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦

    认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...

  7. 大晚上装CocoaPods出现错误坑爹

    大晚上装CocoaPods出现错误坑爹 [!] Pod::Executable clone 'https://github.com/CocoaPods/Specs.git' master xcrun: ...

  8. myeclipse中控制台日志比实际晚8小时解决方法及java日志处理

    今天终于忍不住要解决myeclipse控制台中日志显示比实际晚8小时的问题,开始以为myeclipse编辑器时间问题,后来想想不对,myeclipse控制台打印的是tomcat的日志,随后以为是log ...

  9. win7和ubuntu双系统,win7时间晚8小时解决办法。

    装了Win7和Ubuntu双系统后发现,使用Ubuntu后再登陆win7时系统显示时间不准确,比实际时间晚了8小时. 搜索后发现原来Linux和Windows的系统时间管理是不同的.Linux是以主板 ...

随机推荐

  1. 技能篇:git的简易教程

    在学校,或许凭借一个人的力量就能负责整个项目的开发到上线.但是在公司,因为项目的复杂性和紧急性,一个项目的往往是由多个人实现,此时就有一个问题,代码提交和代码合并.git和svn,这篇文章来讲讲git ...

  2. vulnhub-DC:6靶机渗透记录

    准备工作 在vulnhub官网下载DC:6靶机DC: 6 ~ VulnHub 导入到vmware,设置成NAT模式 打开kali准备进行渗透(ip:192.168.200.6) 信息收集 利用nmap ...

  3. 移动APP我们需要关注什么

    移动APP关注的点比web或者PC上的程序更多 1.测试用例的设计 移动互联网的快节奏,要放弃传统的测试用例编写方式,不需要写详细的测试用例,采用罗列测试点的方式如思维导图,这样既节省时间又能够直观清 ...

  4. user-agent浏览器标识集合

    user_agent_list = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET ...

  5. 自学linux——11.shell入门

    shell 基础 1.shell介绍(内置脚本) 程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 语法简单,代码写起来比较轻松,简单易学 (1)什么是shell shell ...

  6. Vue-axios 封装了一手好axios:)

    请求方式 很多种请求方式,重点还是第一种吧 下载 npm install axios --save 下载完成 直接导入 import axios from 'axios' 简单配置 axios({ u ...

  7. 从零开始实现简单 RPC 框架 2:扩展利器 SPI

    RPC 框架有很多可扩展的地方,如:序列化类型.压缩类型.负载均衡类型.注册中心类型等等. 假设框架提供的注册中心只有zookeeper,但是使用者想用Eureka,修改框架以支持使用者的需求显然不是 ...

  8. Linux 中的虚拟网络接口

    独立博客地址:https://ryan4yin.space/posts/linux-virtual-network-interfaces/ 本文用到的字符画工具:vscode-asciiflow2 L ...

  9. JavaScript学习06(操作BOM和表单)

    操作BOM window 所有浏览器都支持 window 对象.它代表浏览器的窗口. 所有全局 JavaScript 对象,函数和变量自动成为 window 对象的成员. 全局变量是 window 对 ...

  10. PTA 朋友圈 (25 分) 代码详解 (并查集)

    1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...