[Luogu] 送花
https://www.luogu.org/problemnew/show/2073
自己yy,明显错
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + ;
- const int oo = ;
- #define gc getchar()
- struct Node{
- int w, b, bef;
- }flower[N];
- int Ans1, Ans2, opt, W, B, Max, Min;
- map<int, bool> Map;
- int js = , tot = ;
- inline int read(){
- int x = , f = ; char c = gc;
- while(c < '' || c > '') {if(c == '-') f = -; c = gc;}
- while(c >= '' && c <= '') x = x * + c - '', c = gc;
- return x * f;
- }
- int main()
- {
- Max = ;
- Min = ;
- opt = read();
- while(opt != ) opt = read();
- flower[Max].w = read(); flower[Max].b = read(); Map[flower[Max].w] = ;
- flower[Max].bef = ;
- while(true){
- opt = read();
- if(opt == -) break;
- if(opt == ){
- flower[++ js].w = read(); flower[js].b = read();
- W = flower[js].w; B = flower[js].b;
- if(Map[W]) {js --; continue ;} else tot ++, Map[W] = ;
- if(W > flower[Max].w || ! flower[Max].w) {flower[js].bef = Max; Max = js;}
- if(W < flower[Min].w || ! flower[Min].w) {flower[js].bef = Min; Min = js;}
- }
- else if(opt == ){
- if(tot <= ) continue;
- int ma = Max;
- Map[flower[Max].w] = ;
- flower[Max].w = ; flower[Max].b = ;
- Max = flower[ma].bef; flower[ma].bef = ;
- tot --;
- }
- else {
- if(tot <= ) continue;
- int mi = Min;
- Map[flower[Min].w] = ;
- flower[Min].w = ; flower[Min].b = ;
- Min = flower[mi].bef; flower[mi].bef = ;
- tot --;
- }
- }
- for(int i = ; i<= N - ; i ++)
- Ans1 += flower[i].w, Ans2 += flower[i].b;
- cout << Ans1 << " " << Ans2;
- return ;
- }
- /*
- 1 2 2
- 1 7 20
- 3
- 1 16 3
- 1 2 16
- 2
- -1
- */
以权值为下标建立权值线段树
- #include<cmath>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define ls jd<<1
- #define rs jd<<1|1
- using namespace std;
- const int N = 1e6 + ;
- const int inf = 0x7f7f7f7f;
- int opt;
- bool vis[N];//用来判重;
- struct Tree {int l, r, sumw, sumc, Min,Max;} T[N<<];
- void build(int jd, int ll, int rr) {
- T[jd].l = ll, T[jd].r = rr, T[jd].Min = inf;
- if(ll == rr) return;
- int m = ll + rr >> ;
- build(ls, ll, m), build(rs, m + , rr);
- }
- void update(int jd, int pos, int val1, int val2, int val3, int val4) {
- if(T[jd].l == pos && T[jd].r == pos) {
- T[jd].sumc = val1;
- T[jd].sumw = val2;
- T[jd].Min = val3;
- T[jd].Max = val4;
- return;
- }
- if(T[ls].r >= pos) update(ls, pos, val1, val2, val3, val4);
- else update(rs, pos, val1, val2, val3, val4);
- T[jd].sumc = T[ls].sumc + T[rs].sumc;
- T[jd].sumw = T[ls].sumw + T[rs].sumw;
- T[jd].Min = min(T[ls].Min, T[rs].Min);
- T[jd].Max = max(T[ls].Max, T[rs].Max);
- }
- int main()
- {
- int n = N - ;
- build(, , n);
- while(scanf("%d", &opt) == && opt != -) {
- int w, c;
- if(opt == ) {
- scanf("%d %d", &w, &c);
- if(vis[c]) continue;
- update(, c, c, w, c, c);
- vis[c] = true;
- }
- if(opt == ) {
- if(T[].Min == inf) continue;//此时无花,下同;
- vis[T[].Min] = false, update(, T[].Min, , , inf, );
- }
- if(opt == ) {
- if(T[].Max == ) continue;
- vis[T[].Max] = false, update(, T[].Max, , , inf, );
- }
- }
- printf("%d %d",T[].sumw, T[].sumc);
- }
[Luogu] 送花的更多相关文章
- 【题解】Luogu P2073 送花
原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...
- luogu P2073 送花 线段树
思路&心路 一眼认定沙比提 写的比较慢,写了1小时吧 开心的交上去 卧槽,只有20? 不服不服,拿着题解的代码去对拍 Emma,<100没问题 100000数据错了,还只是错了一个数据 ...
- [Luogu 2073] 送花
很容易想到的平衡树,加个维护区间和. 只需要插入和删除操作即可. kth其实都不用的,最小和最大可以从根节点log n一直向左/一直向右跑到叶子节点而求得. 记得每插入完一个点一定要更新区间和!!更新 ...
- Luogu P2073 送花 set
这题...一眼set...但是打了一会儿.. 记录一下每个价格对应的美丽度,顺便充当vis数组,如果美丽度不为0,说明set里已经有了... 删除好说,删*s.begin()和*--s.end()就好 ...
- Luogu P2073 送花
权值线段树的模板题 然而AC后才发现,可以用\(\tt{set}\)水过-- 权值线段树类似于用线段树来实现平衡树的一些操作,代码实现还是比较方便的 #include<iostream> ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- [luogu P2647] 最大收益(贪心+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...
随机推荐
- MGR安装记录
装好所有MySQL5.7, 打开GTID 修改my.cnf文件: ## group replication transaction_write_set_extraction = XXHASH64 ## ...
- idea代码提示快捷键设置
代码提示快捷键设置: keymap--Main Menu--Code--Completion--Basic
- vue 写一个炫酷的轮播图
效果如上图: 原理: 1.利用css 的 transform 和一些其他的属性,先选五张将图片位置拍列好,剩余的隐藏 2.利用 js 动态切换类名,达到切换效果 css代码如下 .swiper-cer ...
- ubuntu配置fastdfs+Nginx
全程参考主线来自:https://blog.csdn.net/xiaoxie762457/article/details/80690841(文中图片失效不造成影响) Nginx安装主要参考:https ...
- kafka的生产者配置以及发送信息的三种方式
1.Fire-and-forget 这种方式是不管发送成功与否,客户端都会返回成功.尽管大多数的时候Kafka 在发送失败后,会自己重新自动再一次发送消息,但是也会存在丢失消息的风险 Producer ...
- Asp.Net Mvc 整站Https
网站要使用https需要如下几个步骤 1.申请https证书,现在已经有很多免费的https证书申请了 2.服务器中安装证书 3.网站的连接全部改为https连接 Asp.Net Mvc网站中整站改为 ...
- iOS - Scenekit3D引擎初探之 - 导入模型+上传服务器+下载并简单设置
SceneKit是ios8之后苹果推出了一个3D模型渲染框架. SceneKit现在可以支持有限的几种模型,截止到我写这篇文章为止似乎只有.dae和.abc后一种模型我没有使用过.这篇文章只针对.da ...
- 这个一个对ES6多个异步处理的并发继发思想的总结和理解
1.首先我们需要理解的是js中for循环.forEach循环.map循环的一些差异性,直接说了为后面说到的提供一些依据 1.1 for循环最基本,也是最容易理解的. 1.2 forEach和map用法 ...
- java利用反射打印出类的结构
1 输入一个类名:java.lang.String将打印出String类定义的结构,例如: public final class java.lang.String { public java.lang ...
- Qt布局
常用的布局方法 1. 水平布局类 QHBoxLayout 2. 垂直布局类 QVBoxLayout 3. 网格布局类 QGridLayout QHBoxLayout 对象横向排列开 QVBoxLayo ...