Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)
心得
D写了个假算法被hack了wtcl…
E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多
F概率dp G费用流 回头再补
思路来源
马老师 归神 贤神等代码
http://www.mamicode.com/info-detail-2530493.html(51nod1405 近似E原题)
D.Subarray Sorting(思维题/线段树)
本来过这题人数900+ 后来被hack成100多 真是可怕
长度为n(n<=3e5)的两个序列a[]和b[],
每次可以把a[]序列里的某一子段排成不降序,
可以排序无数次,问a[]是否能变成b[]
贪心考虑,每个b[]所需匹配的位置是离它最近的位置,
这样才使得排序的区间越短越好,越可能满足条件
倒序考虑b[i],其对应的a[]中最近的位置pos能换到i的位置,
当且仅当[pos,i]中没有数比a[pos]大,
维护一颗a[]上还有哪些数没被匹配的线段树,
去检查这个区间是否有数比b[i]大即可,
匹配一个删一个,所以[pos,i]和[pos,n]等价,
但pos可能本身就比i大,是pos后面插入了一些初始时位于它前面但比它大的值,把它向前挤到pos的位置的
避免特判,直接写[pos,n]即可
#include<bits/stdc++.h>
#define lson p<<1,l,mid
#define rson p<<1|1,mid+1,r
using namespace std;
const int N=3e5+10;
stack<int>pos[N];
int t,n,dat[N*4],v;
int a[N],b[N];
bool flag;
void build(int p,int l,int r)
{if(l==r){dat[p]=0;return; } int mid=(l+r)/2;build(lson);build(rson);dat[p]=max(dat[p<<1],dat[p<<1|1]);
}
void update(int p,int l,int r,int pos,int v)
{if(l==r){dat[p]=v;return;}int mid=(l+r)/2;if(pos<=mid)update(lson,pos,v);else update(rson,pos,v);dat[p]=max(dat[p<<1],dat[p<<1|1]);
}
int ask(int p,int l,int r,int ql,int qr)
{if(ql<=l&&r<=qr)return dat[p];int mid=(l+r)/2,res=0;if(ql<=mid)res=max(res,ask(lson,ql,qr));if(qr>mid)res=max(res,ask(rson,ql,qr));return res;
}
int main()
{scanf("%d",&t);while(t--){flag=0; scanf("%d",&n);build(1,1,n);for(int i=1;i<=n;++i)while(!pos[i].empty())pos[i].pop();for(int i=1;i<=n;++i){scanf("%d",&a[i]);update(1,1,n,i,a[i]);pos[a[i]].push(i);}for(int i=1;i<=n;++i)scanf("%d",&b[i]); for(int i=n;i>=1&&!flag;--i){if(pos[b[i]].empty()){flag=1;break;}//离b[i]最近的与之相等的位置 int adj=pos[b[i]].top();pos[b[i]].pop();//[pos,n]之间 其实是[pos,i]之间 有大于b[i]的值使得离b[i]最近的与b[i]相等的a[i]换不到b[i]的位置//但考虑到pos可能>i 所以用[pos,n] 事实上[i+1,n]的值都已经被匹配好了 线段树上维护的是还没被匹配的值 if(ask(1,1,n,adj,n)>b[i]){flag=1;break; } else update(1,1,n,adj,0);}puts(flag?"NO":"YES");}return 0;
}
E.Tree Painting(树形dp/二次扫描与换根法)
一棵n(2<=n<=2e5)个点的树,初始所有点都是白色的
第一次选择树上的一个点,获得所有与这个白点的联通的白点的个数(含自己),然后把它变成黑色,
之后每次操作,都只能选择和现有黑点邻接的白点,然后获得个数,变成黑色
所有点都变黑的时候,输出获得个数的最大值
注意除了第一个点外,每涂一个点,所获贡献是以这个点为根的子树的数量(含)
然后发现,其实第一个点也是这样的,
所以等价于求树根rt,使得在以rt为根的情况下,所有点的子树和最大
①先随便以一个点为根,不妨为1号点,dfs1,统计答案作dp[1]
②然后考虑换根,dfs2,
设u和v相连,u和v之间的边为w,u是v的父亲,显然可以把sz[v]的贡献记到w这条边上
那开始u是根,w的贡献是v这棵子树sz[v];后来v是根,w的贡献就是u这棵子树也就是n-sz[v]了
dfs2相邻点的时候,换根,更新答案即可
也可以直接考虑本问题,从u到v的换根,只涉及到sz[u]和sz[v]的变化,其他的都不变,
所以就是sz[u]减少了原sz[v],sz[v]增加了原n-sz[v],等价
#include<bits/stdc++.h>
#define pb push_back
typedef long long ll;
using namespace std;
const int N=2e5+10;
vector<int>E[N*2];
int n,u,v;
ll ans,dp[N],sz[N];
void dfs1(int u,int fa)
{sz[u]=1;for(int v:E[u]){if(v==fa)continue;dfs1(v,u);sz[u]+=sz[v];}dp[1]+=sz[u];
}
void dfs2(int u,int fa,ll now)
{ans=max(ans,now);for(int v:E[u]){if(v==fa)continue;dfs2(v,u,now-sz[v]+(n-sz[v]));}
}
int main()
{scanf("%d",&n);for(int i=1;i<n;++i){scanf("%d%d",&u,&v);E[u].pb(v);E[v].pb(u);}dfs1(1,-1);dfs2(1,-1,dp[1]);printf("%I64d\n",ans);return 0;
}
Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)相关推荐
- Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp
传送门 文章目录 题意: 思路: 题意: 给你一个打乱的排列,每个位置都各有一个价值,让你选择一个分界点,分成p1,p2,...,prp_1,p_2,...,p_rp1,p2,...,pr和pr ...
- Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环
传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(D 思维 E 打表)
题目链接 D. Maximum Sum on Even Positions 题意:给你n长度的数组a 要求翻转 子区间 使得 偶数上的数之和尽量最大. 做法:用偶数位置减去奇数位置的值 就相当 ...
- Educational Codeforces Round 94 (Rated for Div. 2) D(思维)
题目: You are given an array a1,a2-an. Calculate the number of tuples (i,j,k,l) such that: 1≤i<j< ...
- Educational Codeforces Round 112 (Rated for Div. 2)(补题)
B. Two Tables 题意: 给定一个W*H的矩形,在里面有一个蓝色桌子,坐标(左右顶点)(x1,y1)(x2,y2),然后还要在里面放一个红色桌子,要想放开红色桌子,问你蓝色桌子移动的最小距离 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
最新文章
- Vue 组件库 HeyUI@1.19.0 发布,新增 Icon 图标
- 小米澄清传闻:不存在跨境转移利润及逃避缴纳税款行为
- tar命令解压文件后造成目录权限更改
- python中math模块函数_python中math模块函数
- mysql主键和外键的连接_MySQL的主键和外键
- hikaricp mysql_HikariCP数据库连接池
- Intel CPU的型号漫谈
- 代码覆盖率、功能覆盖率分析
- python进行独立样本t检验
- openjudge666:放苹果
- 华为鸿蒙会适配很老的机型吗,华为鸿蒙适配机型公布 P50首发/小米10S才是真正至尊版...
- 【翻译】和麻美学姐一起的世界树(マミさんと世界樹スレ)第二话
- This application is currently offline解决办法
- 【记录十七】Sling JCR Resources
- Everything Is Generated In Equal Probability HDU-6595 期望DP
- 七个人生工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则
- 11月11日在线研讨会预热 | ODX诊断数据库转换工具 — VDC(ODX)
- 贝加莱学习笔记第九节常用设置
- 手机显示视频服务器连接异常怎么回事,荧石云视频显示服务器连接异常
- 《破坏之王:DDoS攻击与防范深度剖析》思维导图