送花

思路:

  线段树;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct TreeNodeType {
int l,r,ci,sum,num,mid;
};
struct TreeNodeType tree[maxn<<];
struct OperationType {
int op,w,c;
};
struct OperationType ai[maxn];
int n,m,bi[maxn],cnt,size;
bool if_[maxn];
inline void in(int &now)
{
int if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
}
void build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r;
if(l==r) return;tree[now].mid=l+r>>;
build(now<<,l,tree[now].mid);
build(now<<|,tree[now].mid+,r);
}
void updata0(int now,int to,int x)
{
if(tree[now].l==tree[now].r)
{
if_[tree[now].l]=true;
tree[now].num++;
tree[now].sum+=x;
tree[now].ci+=bi[tree[now].l];
return;
}
if(to<=tree[now].mid) updata0(now<<,to,x);
else updata0(now<<|,to,x);
tree[now].num=tree[now<<].num+tree[now<<|].num;
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
tree[now].ci=tree[now<<].ci+tree[now<<|].ci;
}
void updata1(int now)
{
if(tree[now].l==tree[now].r)
{
if_[tree[now].l]=false;
tree[now].num=;
tree[now].sum=;
tree[now].ci=;
return;
}
if(tree[now<<|].num)updata1(now<<|);
else updata1(now<<);
tree[now].num=tree[now<<].num+tree[now<<|].num;
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
tree[now].ci=tree[now<<].ci+tree[now<<|].ci;
}
void updata2(int now)
{
if(tree[now].l==tree[now].r)
{
if_[tree[now].l]=false;
tree[now].num=;
tree[now].sum=;
tree[now].ci=;
return;
}
if(tree[now<<].num)updata2(now<<);
else updata2(now<<|);
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
tree[now].num=tree[now<<].num+tree[now<<|].num;
tree[now].ci=tree[now<<].ci+tree[now<<|].ci;
}
int main()
{
int now=;
in(ai[now].op);
while(ai[now].op!=-)
{
if(ai[now].op==)
{
in(ai[now].w);
in(ai[now].c);
bi[++cnt]=ai[now].c;
}
in(ai[++now].op);
}
m=now,sort(bi+,bi+cnt+);
size=unique(bi+,bi+cnt+)-bi-;
build(,,size);
for(int i=;i<=m;i++)
{
if(ai[i].op==)
{
ai[i].c=lower_bound(bi+,bi+size+,ai[i].c)-bi;
if(!if_[ai[i].c]) updata0(,ai[i].c,ai[i].w);
}
if(ai[i].op==) if(tree[].num)updata1();
if(ai[i].op==) if(tree[].num)updata2();
}
printf("%d %d\n",tree[].sum,tree[].ci);
return ;
}

最新文章

  1. 一个ubuntu phper的自我修养(杂记)
  2. Robot Test Framework + Selenium 的几个坑
  3. oracle创建密码文件的语句
  4. 增强for循环
  5. PDF数据提取------3.解析Demo
  6. selenium python 定位一组对象
  7. 求教jsp 问题,能在一台电脑上运行,不能在另外一台上运行?
  8. struts项目中添加的jar包
  9. JavaFX学习之路:详细解释JavaFX架构和框架
  10. Linux中iptables设置详细
  11. 关于对ProgressBar定义模板的一些总结
  12. Excel表列名称(给定一个正整数,返回它在 Excel 表中相对应的列名称。)
  13. Tips_方格拼图效果
  14. java面试多线程问题
  15. HDU 4780 Candy Factory(拆点费用流)
  16. TCP/IP协议--TCP的超时和重传
  17. asp.net 简单记录请求的客户端和服务端 处理时间
  18. Emacs的sr-speedbar中使能Go-mode
  19. SQL Server -&gt;&gt; 查询添加XLOCK表提示不阻塞其他线程
  20. poj1077

热门文章

  1. UVA10766:Organising the Organisation(生成树计数)
  2. TCP/UDP HTTP
  3. dns随笔(部分转载)
  4. mac os x之解决npm安装包失败,或者nodejs工程缺少依赖
  5. 从samsung提供内核进行移植
  6. C# 枚举的初始化
  7. Chromedriver 的安装与配置
  8. JavaScript知识递归实现数组中指定后代元素的查找
  9. ZooKeeper食谱(八)
  10. LightOJ 1161 - Extreme GCD 容斥