心得

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) 二次扫描与换根法)相关推荐

  1. Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个打乱的排列,每个位置都各有一个价值,让你选择一个分界点,分成p1,p2,...,prp_1,p_2,...,p_rp1​,p2​,...,pr​和pr ...

  2. Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环

    传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...

  3. Educational Codeforces Round 90 (Rated for Div. 2)(D 思维 E 打表)

    题目链接 D. Maximum Sum on Even Positions 题意:给你n长度的数组a  要求翻转 子区间  使得  偶数上的数之和尽量最大. 做法:用偶数位置减去奇数位置的值  就相当 ...

  4. 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< ...

  5. Educational Codeforces Round 112 (Rated for Div. 2)(补题)

    B. Two Tables 题意: 给定一个W*H的矩形,在里面有一个蓝色桌子,坐标(左右顶点)(x1,y1)(x2,y2),然后还要在里面放一个红色桌子,要想放开红色桌子,问你蓝色桌子移动的最小距离 ...

  6. 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这个时候两 ...

  7. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  8. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  9. Educational Codeforces Round 37 (Rated for Div. 2) 1

    Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...

最新文章

  1. Vue 组件库 HeyUI@1.19.0 发布,新增 Icon 图标
  2. 小米澄清传闻:不存在跨境转移利润及逃避缴纳税款行为
  3. tar命令解压文件后造成目录权限更改
  4. python中math模块函数_python中math模块函数
  5. mysql主键和外键的连接_MySQL的主键和外键
  6. hikaricp mysql_HikariCP数据库连接池
  7. Intel CPU的型号漫谈
  8. 代码覆盖率、功能覆盖率分析
  9. python进行独立样本t检验
  10. openjudge666:放苹果
  11. 华为鸿蒙会适配很老的机型吗,华为鸿蒙适配机型公布 P50首发/小米10S才是真正至尊版...
  12. 【翻译】和麻美学姐一起的世界树(マミさんと世界樹スレ)第二话
  13. This application is currently offline解决办法
  14. 【记录十七】Sling JCR Resources
  15. Everything Is Generated In Equal Probability HDU-6595 期望DP
  16. 七个人生工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则
  17. 11月11日在线研讨会预热 | ODX诊断数据库转换工具 — VDC(ODX)
  18. 贝加莱学习笔记第九节常用设置
  19. 手机显示视频服务器连接异常怎么回事,荧石云视频显示服务器连接异常
  20. 《破坏之王:DDoS攻击与防范深度剖析》思维导图

热门文章

  1. PlayStation的CD格式
  2. /bin/bash^M: bad interpreter 问题解决
  3. PhoneApp.java
  4. 治理工资拖欠离不开大数据土壤
  5. 编译原理实验六比较LR(0)和SLR(1)
  6. 虚拟内存太低的罪魁祸首者!!
  7. 智慧治理 成都郫都区创新城市发展管理的有效抓手
  8. 我的世界海洋java_我的世界Java版开发者们畅聊水域更新
  9. C语言for循环语句用法
  10. 无线电波的波长、频率与传播速度的关系