Educational Codeforces Round 54 (Rated for Div.2)

Educational Codeforces Round 54 (Rated for Div.2)


D. Edge Deletion

题意:一张n个点的无向图,保留其中k条边,使得有尽可能多的点与1的最短路长度不变。

做法:求出最短路树,然后自底向上删边即可。

#include <bits/stdc++.h>
#define pb push_back
#define P pair<ll,int>
typedef long long ll;
const ll inf = 1e18;
const int N = 3e5 + 7;
using namespace std;
int n, m , k;
struct edge{int e,nxt,id; ll w;
}E[N<<1],E2[N<<1];
int h[N], cc, h2[N],cc1;
void add(int u,int v,ll w,int d) {E[cc].e = v; E[cc].w = w; E[cc].id = d;E[cc].nxt = h[u]; h[u] = cc; ++cc;
}
void add2(int u,int v,ll w,int d) {E2[cc1].e = v; E2[cc1].w = w; E2[cc1].id = d;E2[cc1].nxt = h2[u]; h2[u] = cc1; ++cc1;
}
struct node{int x;ll d;node(){}node(int a,ll b){x=a;d=b;}bool operator < (const node a)const {return a.d < d;}
};
ll dis[N];
int vis[N], fa[N], fr[N];
void dij() {for(int i=1;i<=n;++i)dis[i]=inf;priority_queue<node> q;q.push(node(1,0));dis[1]=0; fa[1] = 0; fr[1] = -1;while(!q.empty()) {node tmp = q.top(); q.pop();int u=tmp.x;if(vis[u])continue;vis[u]=1;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(dis[v]>dis[u]+E[i].w) {dis[v]=dis[u]+E[i].w;fa[v] = u;fr[v] = E[i].id;q.push(node(v,dis[v]));}}}return;
}
struct node2{int u,v,id; ll w;node2(){}node2(int a,int b,ll c, int d) {u=a; v = b; w = c; id = d;}
};
node2 A[N];int dep[N];
void bfs() {queue<int> q;memset(dep,-1,sizeof(dep));q.push(1); dep[1] = 0;while(!q.empty()) {int u = q.front(); q.pop();for(int i = h2[u]; ~i ; i = E2[i].nxt) {int v = E2[i].e;if(dep[v] == -1) {dep[v] = dep[u] + 1;q.push(v);}}}
}vector< P > B;
int vis2[N];
int main() {scanf("%d%d%d",&n,&m,&k);memset(h,-1,sizeof(h));memset(h2,-1,sizeof(h2));for(int i = 1; i <= m; ++i) { int u,v; ll w;scanf("%d%d%lld",&u,&v,&w);A[i] = node2(u,v,w,i);add(u,v,w,i); add(v,u,w,i);}dij();for(int i = 2; i <= n; ++i) {int p = fr[i];vis2[p] = 1;add2(A[p].u,A[p].v,A[p].w,A[p].id);add2(A[p].v,A[p].u,A[p].w,A[p].id);}int e = n-1;bfs();for(int i = 2; i <= n; ++i) B.pb(P(dep[i],i));sort(B.begin(),B.end());for(int i = (int)B.size()-1; i >= 0; --i) {if(e > k) {vis2[fr[B[i].second]] = 0;--e;}}printf("%d\n",e);for(int i = 1; i <= m; ++i) if(vis2[i]) printf("%d ",i); puts("");
}

E. Vasya and a Tree

题意:给定一颗树,进行m个操作,每次将节点v子树中向下d+1层,的点全部加x,操作完成后询问每个点的值。

做法:dfs这棵树的同时,树状数组维护对应深度的影响,退出递归时,还原现场即可,类似于树上逆序对,因为操作的总和为m所以复杂度有保证。kd-tree和二维树状数组,都没卡过去。。。

#include <bits/stdc++.h>
#define pb push_back
#define fr first
#define sc second
#define P pair<int,ll>
typedef long long ll;
const int N = 300100;
using namespace std;
int n, m;
int dep[N],MX;
vector<int> G[N];
vector< P > A[N];
ll B[N], ans[N<<1];
void add(int x,ll v) {x += 10;for(int i=x;i;i-=(i&-i)) B[i] += v;
}
ll ask(int x) {ll ans = 0;x += 10;for(int i = x; i <= MX+20; i+=(i&(-i))) ans += B[i];return ans;
}
void dfs(int u,int fa) {dep[u] = dep[fa] + 1;MX = max(dep[u],MX);for(int i = 0; i < G[u].size(); ++i) {int v = G[u][i];if(v != fa) dfs(v,u);}
}
void dfs2(int u,int fa) {for(int i = 0; i < A[u].size(); ++i) add(A[u][i].fr,A[u][i].sc);ans[u] = ask(dep[u]);for(int i = 0; i < G[u].size(); ++i) {int v = G[u][i];if(v != fa) {dfs2(v,u);}}for(int i = 0; i < A[u].size(); ++i) add(A[u][i].fr,-A[u][i].sc);
}
int main() {scanf("%d",&n);for(int i = 1; i <= n-1; ++i) { int u,v;scanf("%d%d",&u,&v);G[u].pb(v); G[v].pb(u);}dep[0] = -1;dfs(1,0);scanf("%d",&m);for(int i = 1; i <= m; ++i) { int v,d; ll x;scanf("%d%d%lld",&v,&d,&x);A[v].pb(P(min(dep[v]+d,MX),x));}dfs2(1,0);for(int i = 1; i <= n; ++i)printf("%lld ",ans[i]);puts("");return 0;
}

F. Summer Practice Report

题意:有\(n\)页纸,第\(i\)页包含\(a[i]\)\(T\), \(b[i]\)\(F\),要求将所有的\(n\)页纸并起来后,不能有连续的\(k\)\(T\)\(F\),问是否有解。

做法:贪心构造dp。\(dp[i][0/1]\) 表示前\(i\)页纸放完,最后几个字符是\(T\)\(F\)时,\(T\)\(F\)最小的数目。如果\(min(dp[n][0], dp[n][1]) <= k\) 则满足条件。考虑如何\(dp\),设上一张末尾的\(T\)\(pa\)张或\(F\)\(pb\)张,当前这一张有\(a\)\(T\)\(b\)\(F\)
先确定\(dp[i][0]\)的转移,考虑放满\(T\)然后向其中插入\(F\),用\(pa\)更新答案,那么如果\(pa<=k\)时,\(num\)即是需要插入的最少的\(F\)的个数,如果\(b == num\), 那么用最后剩下的\(T\)更新答案,同时可以知道\(b\)的上界就是每个\(T\)之间都插入\(k\)\(F\),如果\(b>num\)\(b <= k*a\),就可以在最后一个\(T\)之前插入一个\(F\),使得答案为\(1\)。用\(pb\)更新答案,思路类似,需要修改一下限制条件。\(dp[i][1]\) 也可以同样的转移。注意过程中会爆\(int\)

这道题在\(dp\)的同时贪心的转移,感觉思路十分清奇,看懂官方题解感觉自己dp烂的不要不要的。。。

#include <bits/stdc++.h>
typedef long long ll;
const int N = 300000+5;
const ll inf = 0x3f3f3f3f3f3f3f3f3f3f;
using namespace std;
int n, k, a[N], b[N];
int dp[N][2];
int cal(int pa, int pb, int a, int b) {ll ans = inf;if(pa <= k) {int num = (a + pa) / k + !!((a + pa) % k) - 1;if(b == num)ans = min(ans, pa + a - (ll)num*k);else if(b > num && (ll)b <= (ll)a*k)ans = min(ans, 1ll);}if(pb <= k) {int num = a / k + !!(a % k) - 1;if(b == num)ans = min(ans, a - (ll)num*k);else if(b > num && (ll)b <= (ll)(a-1)*k + (k-pb))ans = min(ans, 1ll);}return (int)ans;
}
int main() {scanf("%d %d", &n, &k);for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);for(int i = 1; i <= n; ++i) scanf("%d", &b[i]);for(int i = 1; i <= n; ++i) dp[i][0] = dp[i][1] = inf;for(int i = 1; i <= n; ++i) {dp[i][0] = cal(dp[i-1][0], dp[i-1][1], a[i], b[i]);dp[i][1] = cal(dp[i-1][1], dp[i-1][0], b[i], a[i]);}if(dp[n][0] <= k || dp[n][1] <= k) puts("YES");else puts("NO");return 0;
}

转载于:https://www.cnblogs.com/RRRR-wys/p/9969644.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回顾4180天在腾讯使用C#的历程,开启新的征途

今天是2018年8月8日&#xff0c;已经和腾讯解除劳动关系&#xff0c;我的公司正式开始运营&#xff0c;虽然还有很多事情需要理清&#xff0c;公司官网也没有做&#xff0c;接下来什么事情都需要自己去完成了&#xff0c;需要一步一个脚印去完善&#xff0c;开启一个新的征途。…

【dfs】【拓扑排序】组合树

组合树 题目大意&#xff1a; 有一棵树&#xff0c;每个点都有自己的原颜色和目标颜色&#xff08;黑或白&#xff09;&#xff0c;现在深度不小于k的点可以让自己祖宗k代k个点的颜色全部取反&#xff0c;现在问当前树是否能变成目标树 输入样例 2 3 2 1 2 2 3 0 0 0 1 0 1…

P5906-[模板]回滚莫队不删除莫队

正题 题目链接:https://www.luogu.com.cn/problem/P5906 题目大意 nnn个数字&#xff0c;mmm个询问[l,r][l,r][l,r]中最远的相同数字对。 解题思路 我们考虑如何用莫队维护&#xff0c;对于一个询问[l,r][l,r][l,r]&#xff0c;我们先按照lll的块排再按照rrr排&#xff0c;定…

Secret Code(原题和变形题)

洛谷传送 牛客网题一 牛客网题二 没错牛客网有两个题&#xff0c;牛客网题一和洛谷是一样的题&#xff0c;牛客网题二是题一的变形 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 链…

Codeforces Round #520 (Div. 2)

Codeforces Round #520 (Div. 2) D. Fun with Integers 题意&#xff1a;a与b之间有边&#xff0c;当且仅当存在一个\(x\)使得\(a*b x\)或 \(a*x b\)&#xff0c;这条边的边权为\(|x|\)&#xff0c;保证\(|a|,|b|,|x|<n\)&#xff0c;问一条最长的不走重复边的路径的长度是…

稳定工作和创业之间的抉择

早上写的文章《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》是我在腾讯写的最后一篇对过往10年在腾讯使用C#语言的总结&#xff0c;今天收到反馈有人在造谣腾讯开始去.net&#xff0c;我被迫辞职了。这非常的不负责任&#xff0c;我必须写这篇文章来辟谣。要说腾讯…

初二模拟赛总结(2019.8.7)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky180180180100100100808080000000222lyflyflyf170170170100100100707070000000333tjhtjhtjh160160160100100100404040000202020444fyfyfy160160160606060100100100000000555cyzcy…

牛客2020年愚人节比赛

欢乐的一晚上 题目链接 其实做做也挺好&#xff0c;脑筋急转弯&#xff0c;不需要算法不需要数据结构&#xff0c;纯娱乐 还有不知道是哪位哥的&#xff0c;心疼一下 题解 注&#xff1a;一下题解没必要较劲&#xff0c;欢乐局而已 对不对无所谓&#xff0c;换了最重要奥 A题ra…

P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4655 题目大意 nnn座桥&#xff0c;删除第iii座会产生wiw_iwi​的代价&#xff0c;相邻的两座桥i,ji,ji,j会产生(hi−hj)2(h_i-h_j)^2(hi​−hj​)2的代价&#xff0c;要求代价最小。 解题思路 设fif_ifi​表示留到第iii座桥…

Codefroces1077F2. Pictures with Kittens (hard version)

Codefroces1077F2. Pictures with Kittens (hard version) 做法&#xff1a;裸的单调队列优化dp #include <bits/stdc.h> #define P pair<ll,ll> #define fr first #define sc second typedef long long ll; using namespace std; int n, m, x; ll dp[5002][5002],…

IdentityServer4 知多少

1. 引言现在的应用开发层出不穷&#xff0c;基于浏览器的网页应用&#xff0c;基于微信的公众号、小程序&#xff0c;基于IOS、Android的App&#xff0c;基于Windows系统的桌面应用和UWP应用等等&#xff0c;这么多种类的应用&#xff0c;就给应用的开发带来的挑战&#xff0c;…

【线段树】矮人排队(jzoj(gz) 3236)

矮人排队 jzoj &#xff08;gz&#xff09;3236 题目大意&#xff1a; 有n个人&#xff0c;高度分别为1,2……n&#xff08;高度按输入来看&#xff09;&#xff0c;现在有两种操作 1&#xff1a;把第x个人和第y个人换一下 2&#xff1a;询问高度为A&#xff0c;A1……B这B-…

牛客网【每日一题】4月2日 月月查华华的手机

牛客网链接 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 月月和华华一起去吃饭了。期间华华有事出去了一会儿&#xff0c;没有带手机。月月出于人类最单纯的好奇心&#…

P3466-[POI2008]KLO-Building blocks【Treap】

正题 题目链接:https://www.luogu.com.cn/problem/P3466 题目大意 nnn个数&#xff0c;每次可以让一个111或−1-1−1&#xff0c;要求操作次数最少使得有连续kkk个相同的。 解题思路 枚举是哪kkk个&#xff0c;然后用平衡树&#xff08;或对顶堆&#xff09;维护中位数和比中…

Codeforces1080F. Katya and Segments Sets

Codeforces1080F. Katya and Segments Sets 题意&#xff1a;给定n个集合&#xff0c;每个集合里有一些区间\([l_i,r_i]\)&#xff0c;有m次询问&#xff0c;每次询问区间\([x,y]\)中&#xff0c;是否包含了集合a到集合b中每个集合至少一个区间。 做法&#xff1a;按区间右端点…

【二分】Best Cow Fences(poj 2018)

Best Cow Fences poj 2018 题目大意&#xff1a; 给出一个正整数数列&#xff0c;要你求平均数最大&#xff0c;长度不小于M的字串&#xff0c;结果乘1000取整 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽N⩽100,0001\leqslant N \leqslant 100,0001⩽…

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习 说在前边 最近复习\(DSP\)的时候&#xff0c;发现了一个号称专门针对离散实序列的变换&#xff0c;经分析总运算量为普通\(FFT\)的几乎一半&#xff0c;而且完全没有复数。这么强的吗&#xff1f;于是花了一个下午&#xff0c;去…

P2495-[SDOI2011]消耗战【虚树,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2495 题目大意 nnn个点的一棵树&#xff0c;mmm次给出一些点&#xff0c;要求割掉最小权值的边使得这些点不和111号点联通。 解题思路 根据这些给出的点构造一棵虚树&#xff0c;然后直接dpdpdp求解即可。 codecodecode #i…

【贪心】Sunscreen(poj 3614/luogu 2887)

Sunscreen poj 3614 luogu 2887 题目大意&#xff1a; 有n个人&#xff0c;每个人要求选一个价值在minniminn_iminni​到maxximaxx_imaxxi​的物品&#xff0c;现在有m件物品&#xff0c;每件的价值是spfispf_ispfi​&#xff0c;可以选covericover_icoveri​次&#xff0c…

.NET Core 2.1中的分层编译(预览)

如果您是.NET性能的粉丝&#xff0c;最近有很多好消息&#xff0c;例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1&#xff0c;但我们还有更多的好消息。分层编译是一项重要的新特性功能&#xff0c;我们可以作为预览供任何人试用&#xff0c;从.NET Core 2.1开始。在我们测…