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

设序列中不小于$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. 网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue

    1 concurrent.futures 模块: # from abc import abstractmethod,ABCMeta # # class A(metaclass=ABCMeta): # ...

  2. rpy2的安装问题?【解决】

    https://www.zhihu.com/question/46555829 http://blog.sciencenet.cn/blog-365459-901335.html

  3. LeetCode Max Consecutive Ones II

    原题链接在这里:https://leetcode.com/problems/max-consecutive-ones-ii/ 题目: Given a binary array, find the ma ...

  4. redis设置为null问题

    查看源码后发现,redis没有删除方法,本想给他设置为null,但是redis报错,所有仔细想了一下,发现redis提供了一个时间限制方法,所有可以让redis的时间限制为1s,就想当于删除redis ...

  5. 【转】JVM可视化工具插件---Visual GC

    Visual GC是一个Java 内存使用分析与GC收集的可视化工具插件 <插件下载> 一:整个区域分为三部分:spaces.graphs.histogram 1 spaces区域:代表虚 ...

  6. 从内存中直接运行PE程序

    效果是这样的,假设一个PE数据在内存里面了,我们利用下面我讲的技术可以直接建立一个进程并运行这个PE,当然直接在本进程运行在可以,这两钟技术在前些时日我都有实现,今天我只说关于建立进程并运行的,当然, ...

  7. linux 定时备份mysql

    定时备份:1.创建备份文件存放目录2.创建备份脚本backup.sh #!/bin/bash DBUser=db_backDBPasswd=passwordDBName=db_nameSERVER=l ...

  8. Oracle之into

    ), NVL() INTO SALE_ID, STORE_ID FROM SALEFROMSTORE WHERE ORDERID = IN_ORDER_ID; 这里要注意,into的时候是一个sele ...

  9. (转)NHibernate之Generator主键生成方式

    本文转载自:http://www.cnblogs.com/lemon-love/archive/2010/03/10/1683058.html (1) assigned主键由外部程序负责生成,无需NH ...

  10. 二 Istio设计的核心原则

    Istio架构关键目标 最大化透明度:Istio将自身自动注入到服务间所有的网络路径中.Istio使用sidecar代理来捕获流量,并且在尽可能的地方自动编程网络层,通过代理来路由流量,无需改动应用程 ...