https://codeforces.com/problemset/problem/1070/C

题意:

有很多活动,每个活动可以在天数为$[l,r]$时,提供$C$个价格为$P$的商品

现在从第一天起,每天恰好买$K$个,到第$N$天的花费为多少?

题解:

首先考虑维护区间,即第$i$天还需要多少个,然后尝试区间求和区间更新

但是稍加思考就知道,"需要的数量"并不满足区间加法

于是改变思考方向,

显然,一个暴力的$O(n^2)$算法就是每天保存能买的所有价格和对应的数量,

这样时间和空间都是$O(n^2)$

但是同时注意到,价格的区间的值域只是$10^6$

于是转换思维,离线化活动,使用权值线段树去不断的维护第$i$天时,对应的价格上可以买多少个

这显然是满足区间加法的

然后再用类似差分数组的方法,去打标记

然后按天数跑一边即可

#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e6+7;
int casn,n,m,k;
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<"="<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl class segtree{public:
#define nd node[now]
#define ndl node[now<<1]
#define ndr node[now<<1|1]
struct segnode {
int l,r;ll cnt,sum;
int mid(){return (r+l)>>1;}
int len(){return r-l+1;}
void update(ll x){cnt+=x;sum+=l*x;}
};
vector<segnode> node;
int cnt;
segtree(int n) {node.resize(n*4+10);maketree(1,n);}
void pushup(int now){nd.cnt=ndl.cnt+ndr.cnt;nd.sum=ndl.sum+ndr.sum;}
void pushdown(int now){}
void maketree(int s,int t,int now=1){
nd={s,t,0,0};
if(s==t) return ;
maketree(s,nd.mid(),now<<1);
maketree(nd.mid()+1,t,now<<1|1);
pushup(now);
}
void update(int pos,ll x,int now=1){
if(pos>nd.r||pos<nd.l) return ;
if(nd.len()==1){nd.update(x);return ;}
pushdown(now);
update(pos,x,now<<1); update(pos,x,now<<1|1);
pushup(now);
}
ll query(ll cnt,int now=1){
if(cnt<=0) return 0;
if(cnt>=nd.cnt) return nd.sum;
if(nd.len()==1) return nd.l*cnt;
pushdown(now);
return query(cnt,now<<1)+query(cnt-ndl.cnt,now<<1|1);
}
};
int main() {
IO;
cin>>n>>k>>m;
vector<vector<pii>> ww(n+2);
register int a,b,c,d;
while(m--){
cin>>a>>b>>c>>d;
ww[a].emplace_back(d,c);
ww[b+1].emplace_back(d,-c);
}
segtree tree(maxn);
ll ans=0;
rep(i,1,n){
for(auto &j:ww[i]) tree.update(j.fi,j.se);
ans+=tree.query(k);
}
cout<<ans<<endl;
return 0;
}

codeforces 1017C - Cloud Computing 权值线段树 差分 贪心的更多相关文章

  1. Codeforces 666E Forensic Examination SAM+权值线段树

    第一次做这种$SAM$带权值线段树合并的题 然而$zjq$神犇看完题一顿狂码就做出来了 $Orz$ 首先把所有串当成一个串建$SAM$ 我们对$SAM$上每个点 建一棵权值线段树 每个叶子节点表示一个 ...

  2. Codeforces 558E A Simple Task(权值线段树)

    题目链接  A Simple Task 题意  给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...

  3. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  4. D. Restore Permutation(权值线段树)

    D. Restore Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  6. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  7. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  8. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  9. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

随机推荐

  1. PHP中生成UUID

    一.什么是UUID 简单的说UUID就是一串全球唯一的(16进制)数字串. UUID的全拼为“Universally Unique Identifier”,可以译为“通用唯一识别码”.UUID由开源软 ...

  2. java将对象转map,map转对象工具类

    /** * 将map转换为一个对象 * * @param map * @param beanClass * @return * @throws Exception */ public static O ...

  3. DisplayAttribute没作用,why?

    namespace WebBulletinBoard.DataAccess { using System; using System.ComponentModel.DataAnnotations; u ...

  4. 关于childNodes的删除

    在使用childNodes时,发现需要删除的元素多于1时,会出现无法全部删除的情况.谷歌以后发现,该属性返回的子节点集合是实时更新的,也就是说,在for循环中,当删除第一个子节点之后,第二次删除的是原 ...

  5. Jquery mobile动态生成ListView调用刷新方法报错

    错误:cannot call methods on listview prior to initialization... 示例: <div data-role="page" ...

  6. 解决PHP乱码

    如果你的PHP页面出现了乱码,之需要在页面的开始处加入下面代码就可以了. <?php header("content-type:text/html;charset=utf-8" ...

  7. Jenkins与sonar扫描的集成问题

    记录本周遇到的头疼了很久的一个问题,由于公司需要使用jenkins来自动管理构建项目,然后在关联sonar对项目代码质量进行审核. 接着坑爹的问题来了,原有的技术手段为项目构建成功后通过jenkins ...

  8. 自定义组件的properties和data

    // components/epsoide/index.js Component({ /** * 组件的属性列表 */ properties: { index: { type: Number //va ...

  9. Linux查看文件以及磁盘空间大小管理(转)

    (1)查看文件大小  查看当前文件夹下所有文件大小(包括子文件夹)    du -sh   # du -h15M     ./package16K     ./.fontconfig4.0K    . ...

  10. 基于maven的spring-boot的pom文件详解

    Spring Boot 推荐的基础 POM 文件 名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-boot-s ...