codeforces 576 div2 A-D题解
A题
Description
- 题目链接: https://codeforces.com/contest/1199/problem/A
- 题意:
- 给定长度为n(1≤n≤100000)的一个序列a,以及两个整数x,y(0≤x,y≤7)。要求在序列里最靠前的一个索引d满足a[j]>=a[d] (d−x≤j<d,d<j<d+y)。
- 简单说就是找出一天使它的权值小于之前x天和之后y天,超出[1,n]的不考虑
Solution
- 思路:
- 模拟从前往后遍历一遍,找到满足条件就输出。
#include <bits/stdc++.h>
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pa = pair<int, int>;
using ld = long double;
int n, m, k;
const int maxn = 1e6 + ;
template <class T>
inline T read(T &ret)
{
int f = ;
ret = ;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -;
ch = getchar();
}
while (isdigit(ch))
{
ret = (ret << ) + (ret << ) + ch - '';
ch = getchar();
}
ret *= f;
return ret;
}
template <class T>
inline void write(T n)
{
if (n < )
{
putchar('-');
n = -n;
}
if (n >= )
{
write(n / );
}
putchar(n % + '');
}
int a[maxn];
int main(int argc, char const *argv[])
{
read(n);
int x, y;
read(x);
read(y);
for (int i = ; i <= n; i++)
read(a[i]);
for (int i = ; i <= n; i++)
{
int f = ;
for (int j = i - x; j > && j < i; j++)
if (a[j] <= a[i])
{
f = ;
break;
}
if (f)
{
for (int j = i + ; j <= n && j <= i + y; j++)
if (a[j] <= a[i])
{
f = ;
break;
}
}
if (f)
{
cout << i << "\n";
break;
}
}
return ;
}
B题
Description
- 题目链接: https://codeforces.com/contest/1199/problem/B
- 题意:
- 有一朵荷花长在水面上,高出水面的部分为H,往右拉了长度L后刚好露出水面,
- 求水的深度
Solution:
- 思路:
- 勾股定理推出公式水面高H=(L2 - H2) / (2H)
#include <bits/stdc++.h>
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pa = pair<int, int>;
using ld = long double;
int n, m, k;
const int maxn = 1e6 + ;
template <class T>
inline T read(T &ret)
{
int f = ;
ret = ;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -;
ch = getchar();
}
while (isdigit(ch))
{
ret = (ret << ) + (ret << ) + ch - '';
ch = getchar();
}
ret *= f;
return ret;
}
template <class T>
inline void write(T n)
{
if (n < )
{
putchar('-');
n = -n;
}
if (n >= )
{
write(n / );
}
putchar(n % + '');
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
ld h, l;
cin >> h >> l;
ld ans = (l * l - h * h) / (h * );
cout << fixed << setprecision() << ans << '\n';
return ;
}
C题
Description
- 题目链接: https://codeforces.com/contest/1199/problem/C
- 题意:
- 给一个长度为n的序列代表数字信号长度和一个I表示存储Ibyte,(1byte=8bit)。对于数字信号,每个信号需要花费k bits存储,k由序列内不同元素个数K决定,k=log2K向上取整,为了满足存储要求,我们可以将存储信号长度划定在一个区间[L,R]内
- 小于L的变为L,大于R的变为R。问如何选取L,R使得改变的数字信号最少。输出最少改变次数。
Solution:
- 思路:
- 阅读理解实锤了,看题看了半天没搞明白。首先我们可以将总共的字节数bits算出来,即8*I,用bits除以序列长度n得到每个数字信号的存储字节数m。这时候我们会发现2^m就是序列里的不同数字信号长度的上限,
- 如果2^m≥序列长度n,那么肯定不用修改长度,此时答案为0。否则的话就需要我们对序列进行遍历判断了,我这里采用的是尺取法(?还是单调队列,我一直分不清,感觉差不多)。
- 嗯还有就是在判断上限时不能采用直接取幂的方式,应该以对数来判断,不然存不下这个数会wa掉
- 还wa了一个log,log是自然对数,log2才是2的对数,qaq
//注意数据范围
//log是自然对数 log2才是!!!
#include <bits/stdc++.h>
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pa = pair<int, int>;
using ld = long double;
ll n, m, k;
const int maxn = 4e5 + ;
const int inf = 0x3f3f3f3f;
template <class T>
inline T read(T &ret)
{
int f = ;
ret = ;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -;
ch = getchar();
}
while (isdigit(ch))
{
ret = (ret << ) + (ret << ) + ch - '';
ch = getchar();
}
ret *= f;
return ret;
}
template <class T>
inline void write(T n)
{
if (n < )
{
putchar('-');
n = -n;
}
if (n >= )
{
write(n / );
}
putchar(n % + '');
}
vector<int> a(maxn);
map<int, int> mp;
set<int> s;
struct node
{
int x, tot;
node() {}
node(int x, int tot)
{
this->x = x;
this->tot = tot;
}
};
int main(int argc, char const *argv[])
{
read(n);
read(m);
ll bits = m * ; //总的字节数
m = bits / n; //一个元素可以占的字节数
ld tmp = log2(n);
for (int i = ; i < n; i++)
{
read(a[i]);
++mp[a[i]];
s.insert(a[i]);
}
ll ans = ;
if (m >= tmp)
{
write();
putchar('\n');
return ;
}
ull t = << m;
auto now = s.begin();
ll cnt = ;
ull tot = ;
deque<int> dq;
dq.clear();
for (auto x : s)
{
++tot; //不同元素个数
dq.emplace_back(x); //保存状态
cnt += mp[x]; //不同元素总的个数
if (tot > t)
{
if (!ans)
ans = inf;
--tot;
cnt -= mp[dq.front()];
dq.pop_front();
ans = min(n - cnt, ans);
}
}
write(ans);
return ;
}
D题
Description:
- 题目链接: https://codeforces.com/contest/1199/problem/D
- 题意:
- 给一个长为n的序列,q次操作,操作分为两种,一是将区间l,r内所有小于v的数改为v,二是将索引l位置的数改为x。q次操作后输出最后的序列。
Solution:
- 思路:
- 赛场上t了,赛后重写了遍lazytag才过(哭了)。(感觉和前两天做的2018杭电多校有个题挺像,直接改了改交然后就t)
- 回到主题,首先这个题区间操作,上线段树,区间修改加个懒标记,单点修改直接update,不过这个题在单点修改的时候需要将当前点的lazy标记清空,防止在查询答案时混淆。
//线段树区间更新
//对于单点,线段树维护下更新并将lazy赋值为0
//对于区间,加上lazy标记
#include <algorithm>
#include <cstring>
#include <iostream>
#define lson rt << 1
#define rson rt << 1 | 1
using namespace std;
using ll = long long;
const int mod = << ;
const int maxn = 2e5 + ;
int n, m;
template <class T>
inline T read(T &ret)
{
int f = ;
ret = ;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -;
ch = getchar();
}
while (isdigit(ch))
{
ret = (ret << ) + (ret << ) + ch - '';
ch = getchar();
}
ret *= f;
return ret;
}
template <class T>
inline void write(T n)
{
if (n < )
{
putchar('-');
n = -n;
}
if (n >= )
{
write(n / );
}
putchar(n % + '');
}
struct node
{
int lazy, val, l, r;
} tr[maxn << ];
int a[maxn];
void pushdown(int rt)
{
if (tr[rt].lazy)
{
tr[lson].val = max(tr[lson].val, tr[rt].lazy);
tr[rson].val = max(tr[rson].val, tr[rt].lazy);
tr[lson].lazy = max(tr[rt].lazy, tr[lson].lazy);
tr[rson].lazy = max(tr[rt].lazy, tr[rson].lazy);
tr[rt].lazy = ;
}
}
void build(int rt, int l, int r)
{
tr[rt].l = l;
tr[rt].r = r;
tr[rt].lazy = ;
if (l == r)
{
read(tr[rt].val);
a[l] = tr[rt].val;
return;
}
int mid = l + r >> ;
build(rt << , l, mid);
build(rt << | , mid + , r);
}
void update(int rt, int L, int v)
{
int l = tr[rt].l;
int r = tr[rt].r;
if (l == r)
{
tr[rt].val = v;
tr[rt].lazy = ; //此题单点更新优先级大于懒标记
return;
}
int mid = l + r >> ;
pushdown(rt); //没有返回代表不是完全包含于待查询区间,需要先下放懒标记再向左右区间查询
if (L <= mid)
update(rt << , L, v);
else
update(rt << | , L, v);
}
void query(int rt, int L, int R)
{
int l = tr[rt].l;
int r = tr[rt].r;
if (l == r)
{
a[l] = max(tr[rt].val, tr[rt].lazy);
return;
}
pushdown(rt); //同update
int mid = l + r >> ;
if (L <= mid)
query(rt << , L, R);
if (R > mid)
query(rt << | , L, R);
}
int main(int argc, char const *argv[])
{
read(n);
build(, , n);
read(m);
for (int i = ; i < m; i++)
{
int op, x, y;
read(op);
if (op == )
{
read(x);
read(y);
update(, x, y);
}
else
{
read(x);
tr[].lazy = max(tr[].lazy, x);
}
}
query(, , n);
for (int i = ; i <= n; i++)
{
write(a[i]);
putchar(' ');
}
return ;
}
codeforces 576 div2 A-D题解的更多相关文章
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
- Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)
Problem Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)
Problem Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces #180 div2 C Parity Game
// Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
随机推荐
- springboot-redis-crda example
springboot-redis-crda example 1. 从 https://github.com/XLuffyStory/springboot-redis-crdu 拿到源码之后,导入到ST ...
- app兼容测试选择哪些机型才够全面呢?
- tensorflow 离线使用 fashion_mnist 数据集
在tensflow中加载 fashion_mnist 数据集时,由于网络原因.可能会长时间加载不到或报错 此时我们可以通过离线的方式加载 1.首先下载数据集:fashion_mnist (下载后解压) ...
- POJ 3581:Sequence(后缀数组)
题目链接 题意 给出n个数字的序列,现在让你分成三段,使得每一段翻转之后拼接起来的序列字典序最小.保证第一个数是序列中最大的数. 例如样例是{10, 1, 2, 3, 4},分成{1, 10}, {2 ...
- HDU 5618:Jam's problem again(CDQ分治+树状数组处理三维偏序)
http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意:…… 思路:和NEUOJ那题一样的.重新写了遍理解了一下,算作处理三维偏序的模板了. #includ ...
- 从零开始实现放置游戏(十)——实现战斗挂机(1)hessian服务端搭建
前面实现RMS系统时,我们让其直接访问底层数据库.后面我们在idlewow-game模块实现游戏逻辑时,将不再直接访问底层数据,而是通过hessian服务暴露接口给表现层. 本章,我们先把hessia ...
- PCB 板边倒圆角的实现方法(基本算法一)
PCB外形是直角时外形时,通常工程制作时,外是直角或尖角的地方倒圆角,主要是为了防止板边容易划伤板且容易扎伤人 所以当客户没有特殊要求时,PCB外形是直角时一般会默认倒角0.5mm圆角(如下图所示) ...
- Akka-CQRS(16)- gRPC用JWT进行权限管理
前面谈过gRPC的SSL/TLS安全机制,发现设置过程比较复杂:比如证书签名:需要服务端.客户端两头都设置等.想想实际上用JWT会更加便捷,而且更安全和功能强大,因为除JWT的加密签名之外还可以把私密 ...
- 用JavaScript做一個簡單的計算器
今天繼續學習JavaScript,視頻講的確實挺差勁的.還是只能跟著W3School自己慢慢摸索著弄了.自己百度了一下,參考了一個大佬寫的一個簡單的計算器代碼.代碼能跑通,但是做出來的樣子實在是感覺太 ...
- EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构
目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...