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

设序列中不小于$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. Nhibernate系列学习之(四) 数据操作

    数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...

  2. uva11729 - Commando War(贪心)

    贪心法,执行任务的时间J越长的应该越先交待.可以用相邻交换法证明正确性.其实对于两个人,要让总时间最短,就要让同一时间干两件事的时间最长. #include<iostream> #incl ...

  3. Shiro-Session

    概述 Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的 ...

  4. 如何重启mysql服务

    window下: 在cmd中,键入services.msc,找到mysql,右键重启mysql

  5. 基于Python语言使用RabbitMQ消息队列(一)

    介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...

  6. Maven错误之 Check $M2_HOME environment variable

    Eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  7. 深入理解http/https之缓存 2

    1:web缓存的实现 web缓存: WEB缓存(cache)位于Web服务器和客户端之间. 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL, ...

  8. (转)C#正则表达式Regex类的用法

    原文地址如下:http://www.studyofnet.com/news/297.html 一.C#正则表达式符号模式 字 符 描 述 \ 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反 ...

  9. 布同:使用ghost备份或者还原的往事

    我大学的时候经常折腾电脑,安装了不少莫名其妙的东西.当时对各种小软件特别感兴趣,本着毕业后可以做客户端开发的初衷去做事情.不过很多小软件会恶意安装各种东西,修改注册表,时间一长就会导致C盘很臃肿,必须 ...

  10. (转)C#用Linq实现DataTable的Group by数据统计

    本文转载自:http://www.cnblogs.com/sydeveloper/archive/2013/03/29/2988669.html 1.用两层循环计算,前提条件是数据已经按分组的列排好序 ...