CFEducational Codeforces Round 66题解报告

感觉丧失了唯一一次能在CF上超过wqy的机会QAQ

A

不管

B

不能直接累计乘法打\(tag\),要直接跳

C

考虑二分第\(k\)小的值

那么问题就变成了

每一个数变成了\([x-mid,x+mid]\)的一段区间,如果有一个位置被覆盖了超过\(k\)次

那么\(mid\)一定合法

类似括号匹配

每次碰到左端点就贡献+1

右端点就统计答案然后-1

维护答案的同时顺便维护位置就好了

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 4e5 + 3;
int a[N];
int n,k,ans;
vector <pii> G;
inline int read(){int v = 0,c = 1;char ch = getchar();while(!isdigit(ch)){if(ch == '-') c = -1;ch = getchar();}while(isdigit(ch)){v = v * 10 + ch - 48;ch = getchar();}return v * c;
}
inline bool check(int mid){G.clear();for(int i = 1;i <= n;++i) G.push_back(mk(a[i] - mid,0)),G.push_back(mk(a[i] + mid,1));sort(G.begin(),G.end());int now = 0;for(int i = 0;i < (int)G.size();++i){if(G[i].se == 0) now++;else{if(now >= k){ans = G[i].fi;return 1;}now--;  }}return 0;
}
int main(){int T = read();while(T--){n = read(),k = read() + 1;for(int i = 1;i <= n;++i) a[i] = read();int l = 0,r = 1e9;while(l <= r){int mid = (l + r) >> 1;if(check(mid)) r = mid - 1;else l = mid + 1;}   printf("%d\n",ans);}return 0;
}

D

DP方法非常显然

但是时间复杂度不对

又没有凸性,无法优化(至少我不会)

只能考虑别的方法

发现每一次分段其实就是加上某一个后缀的值

很显然某个后缀只能加一次

所以题目变成了求\([2,n]\)的前\(k - 1\)大的后缀的和

最后将答案加上权值总和

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
#define pii pair<LL,LL>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 5e5 + 3;
const LL INF = 1e15;
LL a[N];
LL sum[N];
LL maxx[N];
int n,k;
int tag[N];
priority_queue <pii> q;
inline int read(){int v = 0,c = 1;char ch = getchar();while(!isdigit(ch)){if(ch == '-') c = -1;ch = getchar();}while(isdigit(ch)){v = v * 10 + ch - 48;ch = getchar();}return v * c;
}
int main(){n = read(),k = read();for(int i = 1;i <= n;++i) a[i] = read(),maxx[i] = -INF;maxx[n] = sum[n] = a[n];q.push(mk(sum[n],n));for(int i = n - 1;i >= 1;--i){//  cout << i << endl;sum[i] = sum[i + 1] + a[i];maxx[i] = max(maxx[i + 1],sum[i]);if(i != 1) q.push(mk(sum[i],i));}LL ans = sum[1];//cout << "GG" << endl;for(int i = 1;i < k;++i,q.pop()){ans += q.top().fi;}cout << ans;return 0;
}

F

方法一;考虑分治

题目中要求的区间转化一下就是下面两个条件

区间\([l,r]\)合法当且仅当

\(1\) 区间最大值为\(r - l + 1\)

\(2\) 区间无重复元素

我们考虑每次按照最大值去分治

考虑跨过最大值的贡献

接下来要满足第二个条件

我们设\(pre_i\)为\(a_i\)上一次出现的位置

\(max_i\)为\(pre_i\)的前缀max

发现区间\([l,r]\)无重复元素的意思是

\(max_r < l\)

就是每个数上一次出现的位置都在\(l\)左边

由于区间最大值就是区间长度

我们就可以通过枚举一边寻找另一边的方式求解

方法二;

我们给每一个数随机分配一个\(128\)位的数字

所以区间\([L,R]\)符合条件

就可以用前缀异或去表示

由于合法区间一定包含\(1\)

我们就从一个\(1\)开始到下一个\(1\)为止去寻找最大值在右边的贡献

之后把数组反过来再来一遍

这样\(1\)可能会被计算两边,特判就好。

转载于:https://www.cnblogs.com/wyxdrqc/p/11385714.html

CFEducational Codeforces Round 66题解报告相关推荐

  1. Educational Codeforces Round 95题解

    Educational Codeforces Round 95题解 题目链接 代码链接 A. Buying Torches 题目大意: 你手上现在有一个木棍.有以下两种交换方式: 1.用一个木棍交换x ...

  2. Educational Codeforces Round 66 (Rated for Div. 2) B. Catch Overflow!

    链接:https://codeforces.com/contest/1175/problem/B 题意: You are given a function ff written in some bas ...

  3. CF-Educational Codeforces Round 44 (Rated for Div. 2)-A-Chess Placing

    ACM模版 描述 题解 凑等差数列,一种是 a1=1a1=1a_1 = 1,一种是 a1=2a1=2a_1 = 2,取凑成这两种等差数列的代价中较小的,注意序列并没有保证有序,所以需要先排序. 代码 ...

  4. CF-Educational Codeforces Round 44 (Rated for Div. 2)-D-Sand Fortress

    ACM模版 描述 题解 题不是很容易理解,求满足题中所给三个条件的最少建立沙堡的方案.可以用二分解,不过这个题需要注意的是,会爆掉 longlonglonglonglong long,需要用到 dou ...

  5. codeforces round #827题解(完整)

    Problem - A - Codeforces 大致意思就是说给定三个数,判断是否存在一个数是另外两个数之和. #include<bits/stdc++.h> using namespa ...

  6. Codeforces 967 C 题解报告

    一.题目 http://codeforces.com/contest/967/problem/C 二.思路 (一)如果是同一楼层,则直接走过去,不用爬楼梯也不用乘电梯. (二)如果是不同楼层,分别计算 ...

  7. Educational Round 66 题解

    作为橙名来水了一发-- 这次题目就比上次良心多了.7题有5题会做. 然而风格仍然很怪异--还是练少了? A 水题.不过一开始没注意细节挂了几发,罚时罚的真痛-- 明显是能除以 $k$ 就除以 $k$, ...

  8. Codeforces Round #621题解

    A. CowandHaybalesCow\ and\ HaybalesCow and Haybales 贪心模拟题. #include<iostream> #include<ioma ...

  9. Educational Codeforces Round 66 (Rated for Div. 2)

    题意:求最小操作数 使得归零   两种操作 1 减一   2能被k整除的时候除k 签到题: 记得开ll即可 #include<bits/stdc++.h> using namespace ...

  10. CF- Educational Codeforces Round 97 (Rated for Div. 2)-1437B. Reverse Binary Strings【思维/贪心】

    题目链接 题意:给定一个01数量相等的二进制字符串,每次操作可以旋转一段子串,问至少多少次操作可以使得所有相邻字符都不一样. 思路:对于某个"00"开头(结尾),"11& ...

最新文章

  1. python自动翻译小工具_Python实现翻译小工具
  2. 关于跨域请求的二三事
  3. c语言uint赋值给int,如何在C#中将uint转换为int?
  4. 改变Android ProgressBar样式颜色
  5. 反思沟通交流对象:与善人居 不明着懒 更不暗着懒
  6. JavaScript对UNIX时间戳的转换
  7. 帮助你驾驭 Kubernetes 的 4 个工具 | Linux 中国
  8. Sysfs_linux设备底层模型
  9. 爱因斯坦求和约定在Python扩展库Numpy中的实现
  10. 无人驾驶(如何自己构建hdmap)
  11. 分布式消息中间件之kafka设计思想及基本介绍(一)
  12. NUC980 DIY项目大挑战 - EtherCAT实现
  13. 使用Python连接谷歌邮箱发送邮件
  14. PHP8.0正式版的编译安装与使用
  15. 【C++005】结构体(值传递,地址传递,数组)
  16. 遥感或DEM像素深度如何降为8bit
  17. 在Godot中制作杀戮尖塔的箭头
  18. C/C++:计算N的N次方的个位数(火眼金睛找规律,解决此题数据问题)
  19. 怎么让win10隐藏任务栏不会在程序有消息时自动弹出
  20. vue -V 执行失败 檔案名稱、目錄名稱或磁碟區標籤語法錯誤。

热门文章

  1. gpg: verify signatures failed: 文件打开错误
  2. 近期面试了三个人之感想
  3. 通过朋友间推广APP,根本不可行
  4. 教训:LINUX复制文件到U盘丢失
  5. 遇到ffmpeg错误:non monotonically increasing dts to muxer in stream
  6. 如何判断NSMutableDictionary是否有某个key
  7. IP转发的最长前缀匹配
  8. MySQL开发医药管理系统_医药管理系统struts+hibernat+mySql,内含需求分析,详细设计文档...
  9. mysql variables详解_MySQL information_schema详解 GLOBAL_VARIABLES和SESSION_VARIABLES
  10. linux更换内核后无法上网,ubuntu 系统升级内核版本后网络不能正常启动问题