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

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题解的更多相关文章

  1. Codeforces #541 (Div2) - E. String Multiplication(动态规划)

    Problem   Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...

  2. Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)

    Problem   Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...

  3. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...

  4. Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)

    Problem   Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...

  5. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  6. Codeforces #180 div2 C Parity Game

    // Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...

  7. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  8. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  9. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

随机推荐

  1. 【静态NAT】 为什么子网可以ping父网,但是父网ping不通子网?

    为什么子网可以ping父网,但是父网ping不通子网? 这就好比在公网中ping一个192.168.0.x的子网,roter无法找到这个子网的地址,所以会把package丢掉. 如何解决呢,可以在路由 ...

  2. GO代码生成代码小思小试

    推进需求 GO 项目,可整体生成一个运行文件到处跑,是极爽之事.但如果有资源文件要得带着跑,则破坏了这种体验. 例如下边这个项目结构,resource 目录下为资源文件,main.go 中会通过路径引 ...

  3. .Net Core 学习依赖注入自定义Service

    1. 定义一个服务,包含一个方法 public class TextService { public string Print(string m) { return m; } } 2. 写一个扩展方法 ...

  4. Bzoj 3131 [Sdoi2013]淘金 题解

    3131: [Sdoi2013]淘金 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 733  Solved: 363[Submit][Status][ ...

  5. Ray-基础部分目录

    基础部分: 引言 Actor编写-ESGrain与ESRepGrain 消息发布器与消息存储器 Event编写 Handler之CoreHandler编写 Handler之ToReadHandler编 ...

  6. Kafka部署

    Kafka依赖Zookeeper,虽然Kafka自带zookeeper,但是建议单独部署,所以先部署Zookeeper. 测试环境 citus1,citus2,citus3三台机器.对主机名和ip在/ ...

  7. ISTQB TTA大纲中提到的参考书目

    在2012版大纲(可以点击这里下载查看)第12页"2.2条件测试"标题上方有这样一句话: 参考[Bath08],[Beizer90],[Beizer95],[Copeland03] ...

  8. Netty-Pipeline深度解析

    首先我们知道,在NIO网络编程模型中,IO操作直接和channel相关,比如客户端的请求连接,或者向服务端发送数据, 服务端都要从客户端的channel获取这个数据 那么channelPipeline ...

  9. spring boot 整合lombok+tkmapper+mybatis-generator

      1.lombok <dependency>    <groupId>org.projectlombok</groupId>    <artifactId& ...

  10. 小白之入口即化——十分钟看懂while循环,字符串格式化,运算符

    while循环 while循环-死循环 while空格+条件+冒号 缩进+循环体 3.打断死循环 break--终止当前循环 while True: print(123) print(234) bre ...