Codeforces Round #576 (Div. 2)
题意:给n,x,y和数组a[n],求最小的下标d,使得有a[d-x,d-x+1,……d-1,d+1,d-1,d+1,……d+y-1,d+y]都比a[d]小,若d-x<=0则从1开始,若d+y>n,则从n为结尾。
分析:对于a[i],要在左端找到比a[i]大的且最近的数,在右端找到比a[i]大且最近的数,用单调栈。然后从1开始看到n,看到哪个符合条件就作为答案输出。
1 #include <bits/stdc++.h>
2
3 #define maxn 100005
4 #define mod 1000000007
5 #define inf 0x3f3f3f3f
6 #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
7 #define ll long long
8 #define LL long long
9 using namespace std;
10 int a[maxn];
11 int l[maxn];
12 int r[maxn];
13
14 int main() {
15 start;
16 int n, x, y;
17 cin >> n >> x >> y;
18 int t = 0;
19 for (int i = 1; i <= n; ++i)
20 cin >> a[i];
21 stack<int> s;
22 s.push(0);
23 for (int i = 1; i <= n; ++i) {
24 while (a[s.top()] > a[i])
25 s.pop();
26 l[i] = s.top();
27 s.push(i);
28 }
29 stack<int> tmp;
30 tmp.push(n + 1);
31 for (int i = n; i > 0; --i) {
32 while (a[tmp.top()] > a[i])
33 tmp.pop();
34 r[i] = tmp.top();
35 tmp.push(i);
36 }
37 for (int i = 1; i <= n; ++i) {
38 if ((i - l[i] - 1 >= x || l[i] == 0) && (r[i] - i - 1 >= y || r[i] == n + 1)) {
39 cout << i << endl;
40 return 0;
41 }
42 }
43 return 0;
44 }
题意:离水面高H的花,走了L触及水面,问水深。
分析:勾股定理。设答案为X,X*X+L*L=(X+H)*(X+H)。(cin和printf同用的不良风格)
1 #include <bits/stdc++.h>
2
3 #define maxn 100005
4 #define mod 1000000007
5 #define inf 0x3f3f3f3f
6 #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
7 #define ll long long
8 #define LL long long
9 using namespace std;
10
11 int main() {
12 start;
13 ll h, l;
14 cin >> h >> l;
15 printf("%.13lf",(l * l - h * h) * 1.0 / (2 * h));
16 return 0;
17 }
题意:给定n个数,假设有K个不同的数,就要使用k=ceil(log2(K)) bits去存储每个数,总共需要n*k bits,一个大小为i bytes(1 byte=8 bits)的磁盘。对于一个区间[l,r]我们可以将小于l的数变成l,将大于r的数变成r,问最少变多少数使得磁盘能存下这些数。
分析:能存i bytes,即能存8*i bits,则k=8*i/n,则K=2^(8*i/n),此即能存下的不同种类的数字(认为是l到r区间长度共有K,wa了一个小时,看到别人代码才发现),可表示为(1<<k)。
(1)排序,可先找K个不同的数,然后滑动区间,左端点将所有等于左端点的数去掉,右端点加上右方下一组相等的数。同时要找最少的变化数,即找区间内最多的数。
1 #include <bits/stdc++.h>
2
3 #define maxn 400005
4 #define mod 1000000007
5 #define inf 0x3f3f3f3f
6 #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
7 #define ll long long
8 #define LL long long
9 using namespace std;
10 ll a[maxn];
11
12 int main() {
13 start;
14 int n, I;
15 cin >> n >> I;
16 for (int i = 1; i <= n; ++i)
17 cin >> a[i];
18 sort(a + 1, a + n + 1);
19 int sum = 0;
20 int maxt = 0;
21 ll k = 8 * I / n;
22 if (k >= 30) {//(1<<30)>1e9
23 cout << 0 << endl;
24 return 0;
25 }
26 int K = (1 << k);
27 int l = 1, r = 1;
28 a[n + 1] = (1ll << 31);
29 a[0] = -1;//两个哨兵
30 int count = 1;
31 for (; r <= n; ++r) {
32 if (a[r] != a[r + 1]) {
33 if (count == K)
34 break;
35 ++count;
36 }
37 }
38 if (r >= n) {//如果一整段区间都符合条件,且还可以存数,r会到n+1处
39 cout << 0 << endl;
40 return 0;
41 }
42 maxt = sum = r - l + 1;
43 for (; l + maxt - 1 <= n;) {
44 int t = l;
45 for (; t <= n; ++t)
46 if (a[t] != a[l])
47 break;
48 if (t == n + 1)
49 break;
50 sum -= (t - l);
51 l = t;
52 ++r;
53 ++sum;
54 for (; r <= n; ++r) {
55 if (a[r + 1] != a[r])
56 break;
57 ++sum;
58 }
59 maxt = max(maxt, sum);
60 if (r == n)
61 break;
62 }
63 cout << n - maxt << endl;
64 return 0;
65 }
(2)排序,记录每一个相同的数有多少种,记为一组,然后找K组,然后滑动区间每次保证K组,找到区间内最多的数。
1 #include <bits/stdc++.h>
2
3 #define maxn 400005
4 #define mod 1000000007
5 #define inf 0x3f3f3f3f
6 #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
7 #define ll long long
8 #define LL long long
9 using namespace std;
10 ll a[maxn];
11
12 int main() {
13 start;
14 int n, I;
15 cin >> n >> I;
16 for (int i = 1; i <= n; ++i)
17 cin >> a[i];
18 sort(a + 1, a + n + 1);
19 ll k = 8 * I / n;
20 if (k >= 30) {//(1<<30)>1e9
21 cout << 0 << endl;
22 return 0;
23 }
24 a[n + 1] = -1;//哨兵
25 int K = (1 << k);
26 vector<int> num;
27 int cnt = 1;
28 for (int i = 1; i <= n; ++i) {
29 if (a[i] == a[i + 1])
30 ++cnt;
31 else {
32 num.push_back(cnt);
33 cnt = 1;
34 }
35 }
36 if (num.size() < K) {
37 cout << 0 << endl;
38 return 0;
39 }
40 int sum = 0;
41 int l = 0, r = K - 1;
42 for (int i = 0; i <= r; ++i)
43 sum += num[i];
44 int maxt = sum;
45 for (; r + 1 < num.size();) {
46 sum -= num[l];
47 ++l;
48 ++r;
49 sum += num[r];
50 maxt = max(maxt, sum);
51 }
52 cout << n - maxt << endl;
53 return 0;
54 }
题意:给n个数,有两种操作,第一种操作输入p和x,将第p个数变为x;第二种操作输入x,将所有小于x的数变成x。
分析:对于a[i],最后的第一种操作一定是有效的,假设变为x,如果在该操作后出现了大于第二种操作输入的y,且y>x,则该数变成y。我们将q种操作编号为1~q。记录一个p[n]数组,一个t[n]数组,对于第i个数,p[i]表示最后的第一种操作,t[i]表示这个操作的编号。再记录一个maxi[n]数组,maxi[i]表示在第i个操作(包括第i个操作)之后的第二个操作变成的最大的数。
1 #include <bits/stdc++.h>
2
3 #define maxn 400005
4 #define mod 1000000007
5 #define inf 0x3f3f3f3f
6 #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
7 #define ll long long
8 #define LL long long
9 using namespace std;
10 ll a[maxn];
11 ll p[maxn];
12 ll t[maxn];
13 ll maxi[maxn];
14
15 int main() {
16 start;
17 memset(p, -1, sizeof(p));
18 int n;
19 cin >> n;
20 for (int i = 1; i <= n; ++i)
21 cin >> a[i];
22 int q;
23 cin >> q;
24 for (int i = 0; i < q; ++i) {
25 int x;
26 cin >> x;
27 if (x == 1) {
28 int y, z;
29 cin >> y >> z;
30 p[y] = z;
31 t[y] = i;
32 } else {
33 cin >> maxi[i];
34 }
35 }
36 /*后缀操作,对于第i次操作,假设是第二种操作,如果后续有比该操作更大的值,则该操作可被后续操作覆盖*/
37 /* 假设是第一种操作,假设后续有比该操作更大的第二次操作的值,同样可被覆盖*/
38 for (int i = q - 2; i >= 0; --i)
39 maxi[i] = max(maxi[i], maxi[i + 1]);
40 for (int i = 1; i <= n; ++i) {
41 int maxt = t[i];//a[i]最后进行第一次操作的编号
42 if (p[i] == -1)//如果a[i]没有进行第一次操作,t[i]为0
43 cout << max(a[i], maxi[maxt]) << ' ';//如果第0次操作后进行的第二种操作的x比a[i]大则输出x,反之亦反。
44 else if (maxi[maxt] > p[i])//a[i]在最后一次(maxt次)第一种操作变成了x,在第maxt次后有一个第二种操作,该操作的值大于x,则输出该值
45 cout << maxi[maxt] << ' ';
46 else//第maxt操作将a[i]变成了p[i]且后续无有效操作
47 cout << p[i] << ' ';
48 }
49 return 0;
50 }
E和F我这种菜鸡估计是A不出来的。
(如有问题,请在评论区和我说)
Codeforces Round #576 (Div. 2)的更多相关文章
- Codeforces Round #576 (Div. 2) D. Welfare State
http://codeforces.com/contest/1199/problem/D Examples input1 output1 input2 output2 Note In the firs ...
- Codeforces Round #576 (Div. 1)
Preface 闲来无事打打CF,就近找了场Div1打打 这场感觉偏简单,比赛时艹穿的人都不少,也没有3000+的题 两三个小时就搞完了吧(F用随机水过去了) A. MP3 题意不好理解,没用翻译看了 ...
- Codeforces Round #576 (div.1 + div.2)
Div2 A 长度为\(n(n≤10^5)\)的数组,每个元素不同,求有多少个位置\(d\)满足\(d - x \le j < d \And d < j \le d + y a_d< ...
- Codeforces Round #576 (Div. 1) 简要题解 (CDEF)
1198 C Matching vs Independent Set 大意: 给定$3n$个点的无向图, 求构造$n$条边的匹配, 或$n$个点的独立集. 假设已经构造出$x$条边的匹配, 那么剩余$ ...
- Codeforces Round #576 (Div. 2) 题解
比赛链接:https://codeforc.es/contest/1199 A. City Day 题意:给出一个数列,和俩个整数\(x,y\),要求找到序号最靠前的数字\(d\),使得\(d\)满足 ...
- [快速幂]Codeforces Round #576 (Div. 2)-C. MP3
C. MP3 time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
随机推荐
- UCOS-II 任务栈空间合理分配
最近利用空闲时间跑了一下正点原子的stm32f4开发板的实时操作系统demo,发现了一个比较有意思的东西,分享如下: 硬件平台:正点原子stm32f4开发板 软件开发平台:MDK uVision v5 ...
- 越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI
大语言模型 (LLM) 正在席卷整个机器学习世界.得益于其 transformer 架构,LLM 拥有从大量非结构化数据 (如文本.图像.视频或音频) 中学习的不可思议的能力.它们在 多种任务类型 上 ...
- vue cli3 整合Cesium,处理build 时内存溢出问题
一直使用cesium,但是都是使用script直接引入的,但是在将其放置在增加路由的子页面中中时会出现一个问题,刷新后提示cesium is undefined 看直接引入cesium.js < ...
- 为teamcity的代码语法检查工具pyflakes增加支持python2和python3
TeamCity和pyflakes TeamCity是一款由JetBrains公司开发的持续集成和部署工具,它提供了丰富的功能来帮助团队协作进行软件开发.其中包括代码检查.自动化构建.测试运行.版本控 ...
- 基于Elasticsearch 为电商提供商品数据大数据查询
基于Elasticsearch 为电商提供商品数据大数据查询 前言 对于现代电商的产品,维度的多员花,与一套强大的搜索引擎,那是非常必要的.今天我们主要是描述我们在从事电商搜索引擎过程中的遇到的一些问 ...
- CKS 考试题整理 (11)-沙箱运行容器gVisor
Context 该 cluster使用 containerd作为CRI运行时.containerd的默认运行时处理程序是runc. containerd已准备好支持额外的运行时处理程序runsc (g ...
- 韩顺平Spring体系化笔记(内含ioc,aop,动态代理等底层原理)
Spring Spring 核心学习内容 IOC.AOP. JdbcTemplate.声明式事务 1.Spring 几个重要概念 Spring 可以整合其他的框架(Spring 是管理框架的框架) S ...
- Java 递归的小练习,累加、累乘、斐波那契兔子、文件递归
递归的小练习, public static void main(String[] args) { System.out.println(sum(10)); System.out.println(mul ...
- 一篇随笔学会CSS
CSS3 1.CSS介绍 HTML+CSS+JS 结构+表现+交互 2.CSS发展史 Cascading Style Sheet 层叠级联样式表 表现层:美化网页(字体.颜色.边距.宽高.网页定位.网 ...
- PHP生成随机中文姓名
<?phpfunction &xingming(){ for ($i = 0; $i < 1; $i++) { $xing = "赵,钱,孙,李,周,吴,郑,王,冯,陈, ...