AtCoder Regular Contest 098
学姐让我打这个锻炼思维,就做了一下,每四轮发一篇总结吧,也可以自己回忆一下,多吸取些经验。
大概的状况就是C,D秒切,E想一会儿,F做不来,但095F竟然想出来了。。
看英文题解结合lj谷歌翻译真的鬼火气
098
C - Attention
题意:有一些人面朝东方,一些人面朝西方站成一排,选一个人作为中点,反转一些人,使所有人都面向中点,问最少反转多少人
题解:就是记录一下面朝东方or西方的前缀和,O(n)枚举每一个人作为中点的代价就好
代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
# include <iostream> # include <cstdio> using namespace std; const int N = 3e5 + 12; int sum[N],n; char str[N]; int main() {scanf("%d",&n);scanf("%s",str + 1);for(int i = 1;i <= n;i++)sum[i] = str[i] == 'E',sum[i] += sum[i - 1];int mx = N;for(int i = 1;i <= n;i++)mx = min(mx,i - 1 - sum[i - 1] + sum[n] - sum[i]);printf("%d\n",mx); }
098C
D - Xor Sum 2
题意:一个数列,选一个区间[l,r]使al ^ al + 1 ^ …… ^ ar == al + al + 1 + …… + ar,问满足的区间右多少个
题解:预处理每个位置开始往后第一次数里有2^k的位置,然后就可以每次枚举左端点,并且对于每一位的右端点为第二次出现2^k的位置 - 1,取min即可
代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
# include <iostream> # include <cstdio> using namespace std; const int N = 3e5 + 12; int nex[N][22],a[N],n;long long ans; int main() {scanf("%d",&n);for(int i = 1;i <= n;i++)scanf("%d",&a[i]);for(int j = 0;j <= 20;j++)nex[n + 1][j] = nex[n + 2][j] = n + 1;for(int i = n;i >= 1;i--)for(int j = 0;j <= 20;j++)nex[i][j] = (a[i] >> j & 1) ? i : nex[i + 1][j];for(int i = 1;i <= n;i++){int mx = N;for(int j = 0;j <= 20;j++)mx = min(nex[nex[i][j] + 1][j],mx);ans += mx - i;}printf("%lld\n",ans); }
098D
E - Range Minimum Queries
题意:一个数列,每次可以选择长度为K的区间,删掉其中最小值,可以删至少Q次,使删除数中最大值 - 最小值最小,输出这个数
题解:枚举删除最小值,那么比它还小的就一定不删,这样把数列分成了t个区间,找到t个区间所有能删除的数中第Q小即可,复杂度O(n^2logn)
代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
# include <iostream> # include <cstdio> # include <algorithm> using namespace std; const int N = 3e5 + 12; const int inf = 0x7fffffff; int a[N],n,k,q,ans = inf,b[N],c[N]; int solve(int w) {int l,r;c[0] = 0;for(int i = 1;i <= n;i = r + 1){l = i;while(l <= n && a[l] < w)l++;r = l;while(r <= n && a[r] >= w)r++;r--;b[0] = 0;for(int j = l;j <= r;j++)b[++b[0]] = a[j];if(b[0] < k)continue;sort(b + 1,b + b[0] + 1);for(int j = 1;j <= b[0] - k + 1;j++)c[++c[0]] = b[j];}if(c[0] < q)return inf;sort(c + 1,c + c[0] + 1);return c[q] - w; } int main() {scanf("%d %d %d",&n,&k,&q);for(int i = 1;i <= n;i++)scanf("%d",&a[i]);for(int i = 1;i <= n;i++)ans = min(ans,solve(a[i]));printf("%d\n",ans); }
098E
F - Donation
题意:一个简单无向图,每个点有Ai和Bi两个权值,当到达第i个点,所携带钱必须>=Ai,我们可以在第i个点捐赠Bi的钱,任意起点和终点,问把所有点都捐赠一次Bi所携带的最小初始金额
题解:
令Ci = max(Ai - Bi,0),即表示任意时刻在该点所携带的最少价钱为ai(包括已捐赠完毕时)
考虑Ci最大的点x,如果从图中删掉x后,图变成了k个联通块,G1,G2……Gk
我们贡献的顺序一定是从中挑选出一个Gi,然后按G1,G2 ……Gi-1 ,Gi + 1 ……Gk ,x,Gi,这样贡献
(因为如果一个点要经过多次,我们可以在最后一次再贡献它,这样可以为之前的贡献提供更大的可能。)
然后我们发现这是一个树的结构,把当前Ci最大点作为根节点,然后剩下各个联通块中ci最大的点和当前点连边。
考虑把每个点按Ci升序排序,倒向从叶子节点构造树,用dp和并查集,构造到根节点
设s[i]为以i为根的子树内bi和,f[i]为携带初始价钱最少要比s[i]多多少。
因为我们要对每一个点贡献,携带最少肯定是有s[i]的。考虑f[i]初始值,如果最后贡献x,那么携带最少金钱得为Cx + sx。所以fi初始值为Cx
然后考虑把x贡献提前到一个叶子节点之前,此时dp转移式子为f[x] = min(f[x],max(f[v],C[x] - s[v]));
首先在x捐完除了v以外的所有子树后,所剩钱肯定要≥C[x]
如果f[v] + s[v] > C[x],一开始要带s[x] + f[v]的钱,因为这样捐完x后剩下钱刚好为s[y] + f[v]。
如果f[v] + s[v] <= C[x],一开始要带s[x] + C[x] − s[y]的钱,这样捐完x后剩下C[x]的钱,是一定够的
最后输出f[root] + s[root]即可
代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
# include <iostream> # include <cstdio> # include <algorithm> using namespace std; const int N = 3e5 + 12; const int inf = 0x7fffffff; int a[N],b[N],id[N],n,m,head[N],dt,fa[N];bool vis[N]; long long f[N],s[N]; int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);} struct Edge{int to,nex;}edge[N << 2]; void AddEdge(int u,int v){edge[++dt] = (Edge){v,head[u]};head[u] = dt;} bool cmp(int x,int y){return a[x] < a[y];} int main() {scanf("%d %d",&n,&m);for(int i = 1;i <= n;i++)scanf("%d %d",&a[i],&b[i]),a[i] = max(a[i] - b[i],0),id[i] = fa[i] = i;sort(id + 1,id + n + 1,cmp);int u,v;for(int i = 1;i <= m;i++)scanf("%d %d",&u,&v),AddEdge(u,v),AddEdge(v,u);for(int t = 1;t <= n;t++){u = id[t];vis[u] = true;f[u] = a[u];s[u] = b[u];for(int i = head[u];i;i = edge[i].nex)if(vis[edge[i].to]){v = find(edge[i].to);if(u == v)continue;fa[v] = u;s[u] += s[v];f[u] = min(f[u],max(f[v],a[u] - s[v])); }}printf("%lld\n",f[id[n]] + s[id[n]]); }
098F
转载于:https://www.cnblogs.com/lzdhydzzh/p/9178429.html
AtCoder Regular Contest 098相关推荐
- AtCoder Regular Contest 065
AtCoder Regular Contest 065 C - Daydream Score : 300300300 points 倒着来就行了,正着来会产生歧义匹配,dreamer,dreamdre ...
- AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和
传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你要将其分成四份,让这四份中和的最大值−-−最小值最小,输出这个最小值. n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2 ...
- AtCoder Regular Contest 100 E - Or Plus Max Sos dp
传送门 文章目录 题意: 思路: 题意: 给你一个长度为2n2^n2n的数组,让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的ai+aj,0≤i<j≤2n−1 ...
- AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)
AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...
- NOMURA Programming Contest 2021(AtCoder Regular Contest 121)
文章目录 A - 2nd Greatest Distance B - RGB Matching C - Odd Even Sort D - 1 or 2 E - Directed Tree F - L ...
- AtCoder题解——AtCoder Regular Contest 107——B - Quadruple
题目相关 题目链接 AtCoder Regular Contest 107 B 题,https://atcoder.jp/contests/arc107/tasks/arc107_b. Problem ...
- AtCoder Regular Contest 071 D - 井井井 / ###
题目:http://arc071.contest.atcoder.jp/tasks/arc071_b 题意: 有一个二维的平面,给你xn根竖线和ym根横线,问这些线围成的长方形(正方形)的面积和(要求 ...
- AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer
题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号 ...
- AtCoder Regular Contest 058
这个应该是第一场有英文的atcoder吧??不过题解却没有英文的... 从前往后慢慢做... C こだわり者いろはちゃん / Iroha's Obsession 数据范围这么小,直接暴力 #inclu ...
最新文章
- python数据分析实训大纲,数据分析大赛考纲:(二)Python数据分析应会部分
- C 语言字符串分割函数 p = strtok(NULL, );
- UVA 11990 ``Dynamic'' Inversion 动态逆序对
- macOs下全局安装npm包的设置问题
- jQuery Mobile Slider Widget 使用js控制
- 数据中心的“维稳之道”
- 博士申请 | ​麦吉尔大学智能自动化实验招收2022年秋季入学全奖博士生
- Asp.Net Core EndPoint 终结点路由工作原理解读
- CCF CSP 201403-1 相反数(C++)
- 【React 基础】之 React 基本介绍、jsx 规则、模块与组件
- 计算机基础判断试题及答案,计算机基础知识试题及答案判断题
- Luogu P2827 蚯蚓
- 2017蓝桥杯C++B:等差素数列(枚举优化)
- mysql 并发锁_MySQL的并发控制与加锁分析
- Mongodb(芒果DB)之服务搭建
- Linux ❉ iptables详解
- 关于华为宣讲的一些感悟
- 医咖会免费SPSS免费教程学习笔记—灵敏度和特异度
- data协议,好玩,好用
- mac - 让焦点迅速定位到分屏显示中
热门文章
- Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)...
- 20162313苑洪铭 第二周作业
- 使用Git向GitHub上传代码
- [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
- Ubuntu解压缩zip,tar,tar.gz,tar.bz2
- sql server 的 money类型
- list vue 删除后页面渲染_浅谈Vue项目实战(页面渲染+事件绑定)
- CentOS 6.3开机自动挂载磁盘和文件夹
- 双指针找链表中点多种写法
- [译]学习IPython进行交互式计算和数据可视化(四)