学姐让我打这个锻炼思维,就做了一下,每四轮发一篇总结吧,也可以自己回忆一下,多吸取些经验。

大概的状况就是C,D秒切,E想一会儿,F做不来,但095F竟然想出来了。。

看英文题解结合lj谷歌翻译真的鬼火气

098


C - Attention

题意:有一些人面朝东方,一些人面朝西方站成一排,选一个人作为中点,反转一些人,使所有人都面向中点,问最少反转多少人

题解:就是记录一下面朝东方or西方的前缀和,O(n)枚举每一个人作为中点的代价就好

代码:

# 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即可

代码:

# 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)

代码:

# 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]即可

代码:

# 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相关推荐

  1. AtCoder Regular Contest 065

    AtCoder Regular Contest 065 C - Daydream Score : 300300300 points 倒着来就行了,正着来会产生歧义匹配,dreamer,dreamdre ...

  2. AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你要将其分成四份,让这四份中和的最大值−-−最小值最小,输出这个最小值. n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2 ...

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

  4. AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

    AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...

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

  6. AtCoder题解——AtCoder Regular Contest 107——B - Quadruple

    题目相关 题目链接 AtCoder Regular Contest 107 B 题,https://atcoder.jp/contests/arc107/tasks/arc107_b. Problem ...

  7. AtCoder Regular Contest 071 D - 井井井 / ###

    题目:http://arc071.contest.atcoder.jp/tasks/arc071_b 题意: 有一个二维的平面,给你xn根竖线和ym根横线,问这些线围成的长方形(正方形)的面积和(要求 ...

  8. AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer

    题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号 ...

  9. AtCoder Regular Contest 058

    这个应该是第一场有英文的atcoder吧??不过题解却没有英文的... 从前往后慢慢做... C こだわり者いろはちゃん / Iroha's Obsession 数据范围这么小,直接暴力 #inclu ...

最新文章

  1. python数据分析实训大纲,数据分析大赛考纲:(二)Python数据分析应会部分
  2. C 语言字符串分割函数 p = strtok(NULL, );
  3. UVA 11990 ``Dynamic'' Inversion 动态逆序对
  4. macOs下全局安装npm包的设置问题
  5. jQuery Mobile Slider Widget 使用js控制
  6. 数据中心的“维稳之道”
  7. 博士申请 | ​麦吉尔大学智能自动化实验招收2022年秋季入学全奖博士生
  8. Asp.Net Core EndPoint 终结点路由工作原理解读
  9. CCF CSP 201403-1 相反数(C++)
  10. 【React 基础】之 React 基本介绍、jsx 规则、模块与组件
  11. 计算机基础判断试题及答案,计算机基础知识试题及答案判断题
  12. Luogu P2827 蚯蚓
  13. 2017蓝桥杯C++B:等差素数列(枚举优化)
  14. mysql 并发锁_MySQL的并发控制与加锁分析
  15. Mongodb(芒果DB)之服务搭建
  16. Linux ❉ iptables详解
  17. 关于华为宣讲的一些感悟
  18. 医咖会免费SPSS免费教程学习笔记—灵敏度和特异度
  19. data协议,好玩,好用
  20. mac - 让焦点迅速定位到分屏显示中

热门文章

  1. Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)...
  2. 20162313苑洪铭 第二周作业
  3. 使用Git向GitHub上传代码
  4. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
  5. Ubuntu解压缩zip,tar,tar.gz,tar.bz2
  6. sql server 的 money类型
  7. list vue 删除后页面渲染_浅谈Vue项目实战(页面渲染+事件绑定)
  8. CentOS 6.3开机自动挂载磁盘和文件夹
  9. 双指针找链表中点多种写法
  10. [译]学习IPython进行交互式计算和数据可视化(四)