AtCoder Regular Contest 075 2017年6月4日 C、D、E题解
http://arc075.contest.atcoder.jp/assignments
昨晚做的atcoder,今天写个简单题解。
F题不会做,800point的,就跪了,要等zk大佬来做。zk能做2400的
C题、我看到数据范围就直接100^3的背包,但是如果数据大点还是可以做的,贪心,首先全部值加起来,如果是%10==0的话,就需要去搭错一题,一题最少分的,而且%10 != 0的。
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 1e2 + ;
int dp[maxn * maxn];
void work() {
dp[] = true;
int n;
cin >> n;
for (int i = ; i <= n; ++i) {
int val;
cin >> val;
for (int i = ; i >= val; --i) {
if (dp[i - val]) dp[i] = true;
}
}
int ans = ;
for (int i = ; i >= ; --i) {
if (dp[i]) {
ans = max(ans, i % == ? : i);
}
}
printf("%d\n", ans);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
D题、推公式二分,
设x[i]表示在h[i]个位置投放的数量,sum表示x[i]的总和,那么sum就是答案,
对于第h[i]个,需要它死亡,条件是,h[i] - (x[i] * A + (sum - x[i]) * B) <= 0
二分答案sum,然后需要判断n个h[i]都要死亡,每个h[i]死亡,需要的x[i]继续二分,判断即可。sum是满足单调的很容易看出来,
x[i]也满足单调因为A > B,可以化简公式看看,复杂度O(n * log * log),注意不要爆LL
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
LL n, a, b;
LL all;
int hi[ + ];
LL isok(int index, LL sum) {
LL be = , en = sum;
while (be <= en) {
LL mid = (be + en) >> ;
if (a * mid + (sum - mid) * b >= hi[index]) en = mid - ;
else be = mid + ;
}
return be;
}
bool check(LL sum) {
LL need = ;
for (int i = ; i <= n; ++i) {
need += isok(i, sum);
if (need > sum) return false;
}
return true;
}
void work() {
cin >> n >> a >> b;
for (int i = ; i <= n; ++i) {
cin >> hi[i];
all += hi[i];
}
if (n == ) {
cout << (hi[] + a - ) / a << endl;
return;
}
LL be = , en = 1e9;
while (be <= en) {
LL mid = (be + en) >> ;
if (check(mid)) en = mid - ;
else be = mid + ;
}
cout << be << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
D
E题、化简公式 + BIT
设sum[i]表示前缀和,区间[L, R]满足条件,等价于sum[R] - sum[L - 1] >= (R- L + 1) * k
等价于sum[R] - R * k >= sum[L -1] - (L - 1) * k
相当于找前面有多少个数字比当前数字小,离散化 + bit即可。
复杂度 nlogn
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 2e5 + ;
LL sum[maxn];
int c[maxn];
int n, k;
int lowbit(int x) {
return x & (-x);
}
void upDate(int pos, int val) {
while (pos <= n) {
c[pos] += val;
pos += lowbit(pos);
}
}
int ask(int pos) {
int ans = ;
while (pos) {
ans += c[pos];
pos -= lowbit(pos);
}
return ans;
}
LL vc[maxn], lenvc;
void work() {
scanf("%d%d", &n, &k);
for (int i = ; i <= n; ++i) {
int val;
scanf("%d", &val);
sum[i] = sum[i - ] + val;
}
for (int i = ; i <= n; ++i) {
sum[i] -= 1LL * i * k;
vc[++lenvc] = sum[i];
// cout << sum[i] << " ";
}
// cout << endl;
sort(vc + , vc + + lenvc);
LL ans = ;
for (int i = ; i <= n; ++i) {
int pos = lower_bound(vc + , vc + + lenvc, sum[i]) - vc;
if (sum[i] >= ) {
ans++;
}
ans += ask(pos);
upDate(pos, );
}
cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
E
AtCoder Regular Contest 075 2017年6月4日 C、D、E题解的更多相关文章
- AtCoder Regular Contest 075
任意门 C - Bugged 题意:类似装箱问题,但是最后体积总和不能为10的倍数. #include<cstdio> #include<cstring> #include&l ...
- AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)
题目大意:求一个数组中,平均值不小于k的连续子序列个数 所有数减去k,算个前缀和出来,就变成二维数点问题了. 没有修改,离线的话就是CZL所说的“NOIP最喜欢的套路”了:倒着加进BIT,以权值为数组 ...
- AtCoder Regular Contest 075 D Widespread
题目传送门 这道题其实二分一下答案就okay了的 不过LL什么的有时候忘了加 被卡了下 #include<cstdio> #include<cstring> #include& ...
- AtCoder Regular Contest 075 C D E (暂时)
C - Bugged 题意 给\(n\)个数,找其中的一个子集,使得其和最大,且不是\(10\)的整数倍. 思路 先对\(n\)个数求和, 如果本身即不被\(10\)整除,则即为答案. 否则,如果本身 ...
- 【arc075f】AtCoder Regular Contest 075 F - Mirrored
题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
随机推荐
- 1139 First Contact(30 分)
Unlike in nowadays, the way that boys and girls expressing their feelings of love was quite subtle i ...
- 51Nod 1362 搬箱子 —— 组合数(非质数取模) (差分TLE)
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1362 首先,\( f[i][j] \) 是一个 \( i \) 次多项式: 如 ...
- 洛谷P2014——选课
题目:https://www.luogu.org/problemnew/show/P2014 树状DP,注意枚举当前子树中选几个时的边界. 代码如下: #include<iostream> ...
- DataGrid 显示选中的item
Datagrid或者listview 中想要把相应的项 滚动到当前可见的位置, 必须满足2个条件: 1) 必须去掉虚拟化 VirtualizingStackPanel.IsVirtualiz ...
- 分布式一致性协议之:Zab(Zookeeper的分布式一致性算法)
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...
- windows平台下新网络库RIO ( Winsock high-speed networking Registered I/O)
What's New for Windows Sockets Microsoft Windows 8 and Windows Server 2012 introduce new Windows Soc ...
- editplus怎么在前后插入字符
快捷键:ctrl+h 未编辑之前: 源: 一:行首批量添加 查找"^" 替换为“我是行首aaa” 二: 行尾批量添加 查找"\n" 替换为“'bbb我是 ...
- sorted matrix - search & find-k-th
sorted matrix ( Young Matrix ) search for a given value in the matrix: 1) starting from upper-right ...
- <c和指针>学习笔记2之数据和语句
1 语句 (1)空语句----->本身只包含一个分号 (2)表达式语句 在表达式后面加上一个分号就可以把表达式转变为语句 (3)代码块 位于一对花括号之内的可选的声明和语句列表 (4)if语句 ...
- windows64下安装MySQLdb连接数据库
MySQLdb是Python连接MySQL的模块,下面介绍一下源码方式安装MySQLdb: 1.首先要下载:http://www.codegood.com/downloads,由于我的python是2 ...