考虑离散化后开权值线段树。

设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$。

那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$。

如果序列中不小于$s$的数超过了$c$个,那么直接每一次都选这些数就好了。

如果没有超过$c$个的话,这$cnt$个数每一次都要选,然后再贪心地取剩下的数中最大的就行了。

需要把询问中出现的$a, s$和$0$一起离散化。

细节没想清楚WA好久

膜Claris

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll; const int N = 1e6 + ;
const int inf = << ; int n, qn, tot = , maxn = , a[N];
ll b[N << ]; struct Querys {
int type, x, y;
} q[N]; struct Innum {
int val, id;
} in[N << ]; bool cmp(const Innum &x, const Innum &y) {
if(x.val != y.val) return x.val < y.val;
else return x.id < y.id;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void discrete() {
in[].val = -inf;
sort(in + , in + + tot, cmp);
for(int cnt = , i = ; i <= tot; i++) {
if(in[i].val != in[i - ].val) cnt++;
maxn = max(maxn, cnt);
b[cnt] = in[i].val;
q[in[i].id].y = cnt;
}
} namespace SegT {
ll s[N << ];
int cnt[N << ]; #define lc p << 1
#define rc p << 1 | 1
#define mid ((l + r) >> 1) inline void up(int p) {
if(p) {
s[p] = s[lc] + s[rc];
cnt[p] = cnt[lc] + cnt[rc];
}
} void modify(int p, int l, int r, int x, int v) {
if(x == l && r == x) {
s[p] += (ll)b[l] * v;
cnt[p] += v;
return;
} if(x <= mid) modify(lc, l, mid, x, v);
else modify(rc, mid + , r, x, v);
up(p);
} ll qSum(int p, int l, int r, int x, int y) {
if(x > y) return 0LL;
if(x <= l && y >= r) return s[p]; ll res = 0LL;
if(x <= mid) res += qSum(lc, l, mid, x, y);
if(y > mid) res += qSum(rc, mid + , r, x, y);
return res;
} int qCnt(int p, int l, int r, int x, int y) {
// if(x > y) return 0;
if(x <= l && y >= r) return cnt[p]; int res = ;
if(x <= mid) res += qCnt(lc, l, mid, x, y);
if(y > mid) res += qCnt(rc, mid + , r, x, y);
return res;
} } using namespace SegT; int main() {
read(n), read(qn);
in[++tot] = (Innum) {, };
for(int i = ; i <= qn; i++) {
char op[]; scanf("%s", op);
read(q[i].x), read(q[i].y);
if(op[] == 'U') q[i].type = , in[++tot] = (Innum) {q[i].y, i};
else q[i].type = , in[++tot] = (Innum) {q[i].y, i};
} discrete(); /* for(int i = 1; i <= maxn; i++)
printf("%lld ", b[i]);
printf("\n");
for(int i = 1; i <= qn; i++)
printf("%d %d %d\n", q[i].type, q[i].x, q[i].y);
printf("\n"); */ for(int i = ; i <= n; i++)
a[i] = , modify(, , maxn, , ); for(int i = ; i <= qn; i++) {
if(q[i].type == ) {
modify(, , maxn, a[q[i].x], -);
modify(, , maxn, q[i].y, );
a[q[i].x] = q[i].y;
} else {
int cnt = qCnt(, , maxn, q[i].y, maxn);
/* if(cnt >= q[i].x) {
puts("TAK");
continue;
} */
ll sum = qSum(, , maxn, , q[i].y - );
if(sum >= (q[i].x - cnt) * b[q[i].y]) puts("TAK");
else puts("NIE");
}
} return ;
}

Luogu 3586 [POI2015]LOG的更多相关文章

  1. [POI2015]LOG(树状数组)

    今天考试考了这题,所以来贡献\([POI2015]LOG\)的第一篇题解.代码略丑,调了快三个小时才调出来\(AC\)代码. 对于这种小清新数据结构题,所以我觉得树状数组才是这道题的正确打开方式. 首 ...

  2. luogu P3592 [POI2015]MYJ

    题目链接 luogu P3592 [POI2015]MYJ 题解 区间dp 设f[l][r][k]表示区间l到r内最小值>=k的最大收益 枚举为k的位置p,那么包含p的区间答案全部是k 设h[i ...

  3. 树状数组【洛谷P3586】 [POI2015]LOG

    P3586 [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1 ...

  4. 洛谷 P3586 [POI2015]LOG

    P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...

  5. BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...

  6. BZOJ4377 Kurs szybkiego czytania \ Luogu 3589[POI2015]KUR - 数学思维题

    Solution 我又双叒叕去看题解啦$QAQ$, 真的想不到鸭 输入 $a$ 和 $n$ 互质, 所以满足 $a \times i \ mod \ n$ $(0<=i<n)$ 肯定是不重 ...

  7. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  8. [POI2015]LOG

    题目 发现询问是针对整个区间,也就是说位置什么用都没有 发现我们需要构造出\(s\)个长度为\(c\)的数列,每个数只能在一个数列中出现一次,且一个数最多的使用次数是其大小 对于那些大于等于\(s\) ...

  9. Luogu 3594 [POI2015]WIL-Wilcze doły

    简单题. 考虑没有修改数字的条件的限制,我们直接用双指针扫描就可以计算出答案了. 然后考虑加入修改数字的条件,只要用单调队列维护出当前两个指针表示的区间中长度为$d$的一段区间的最大值,用总和减掉这个 ...

随机推荐

  1. GET请求与POST请求区别

    GET请求与POST请求区别 a:语义: GET:客户端想获取服务器资源 POST:客户端想传递数据给服务器 b:安全级: GET:不安全 POST:不安全 c:数据长度 GET:客户端发送数据最长1 ...

  2. Too Rich(贪心加搜索)

    个人心得:10月份月赛题目,很low,就过了一道水题而且是把所有猜测都提交才过的.这段时间不知道忙什么去了, 也没怎么刷题感觉自己越来越差,还不如新来的大一学弟呢,别人起码天天刷代码到半夜,比起刚在区 ...

  3. LeetCode 361. Bomb Enemy

    原题链接在这里:https://leetcode.com/problems/bomb-enemy/description/ 题目: Given a 2D grid, each cell is eith ...

  4. Erlang pool management -- Emysql pool optimize

    在上一篇关于Emysql pool (http://www.cnblogs.com/--00/p/4281938.html)的分析的最后提到 现在的emysql_conn_mgr gen_server ...

  5. My97DatePicker 和转换 数据库中日期(/Date(1351699200000)/) 的格式

    一  转换 数据库中日期(/Date(1351699200000)/) 的格式: C#中转换日期格式 var date=com.CREATEDATETIME.ToString(); JavaScrip ...

  6. ThreadPoolTaskExecutor异常收集

    ThreadPoolTaskExecutor ipFinderThreads = new ThreadPoolTaskExecutor(); ipFinderThreads.setCorePoolSi ...

  7. Mina APR传输与串口传输讲解---zhengli

    原文地址:Mina Transports(Apache Mina user guide Chapter6 Transport) 1.1.1.APR传输 1.1.1.1.介绍 APR (Apache P ...

  8. mybatis 学习三 关键文件解析

    1:  mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  9. 2015.12.24(圣诞节) 解决Oralce数据库将具有相同属性的多行合并为一行的简单方法多年想要wmsys.wm_concat

    用到Oralce10g以后增加的函数wmsys.wm_concat 例如这张表的有两个字段,要按airport_id合并成两行可用sql语句 select airport_id,   wmsys.wm ...

  10. EM算法以及推导

    EM算法 Jensen不等式 其实Jensen不等式正是我们熟知的convex函数和concave函数性质,对于convex函数,有 \[ \lambda f(x) + (1-\lambda)f(y) ...