n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物;查询熟食中编号最小的并删除之;查询是否有编号为id的食物,如果有查询是否有编号为id的熟食,如果有熟食删除之,否则输出其离煮熟的最小时间;查询编号在[L,R]的熟食有多少。保证操作时间递增。

可以发现:针对某种食物的信息维护只需要知道其未煮熟的食物中煮熟时间的最小值,而所有的熟食都可以一起维护。为此可以:对每个食物开个队列存未熟食物,对所有食物开个优先队列以便及时把熟食从队列中提出来,并开个以编号为下标的“东西”来维护每个编号的数量和区间信息。

由于只需要单点修改、区间查询,可以用BIT。至于查熟食中的编号最小可以用BIT上倍增。

这里比较脑残就写了线段树。。然而被卡常卡死了。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 #include<stdlib.h>
  5 #include<queue>
  6 //#include<queue>
  7 //#include<math.h>
  8 //#include<time.h>
  9 //#include<iostream>
 10 using namespace std;
 11
 12 int T,n,m;
 13 #define maxn 200011
 14 #define maxq 500011
 15
 16 struct SMT
 17 {
 18     struct Node
 19     {
 20         int sum;
 21         int ls,rs;
 22     }a[maxn<<1];
 23     int size;
 24     void build(int &x,int L,int R)
 25     {
 26         x=++size; a[x].sum=0;
 27         if (L==R) {a[x].ls=a[x].rs=0; return;}
 28         const int mid=(L+R)>>1;
 29         build(a[x].ls,L,mid); build(a[x].rs,mid+1,R);
 30     }
 31     void build() {size=0; int x; build(x,1,n);}
 32     void up(int x) {a[x].sum=a[a[x].ls].sum+a[a[x].rs].sum;}
 33     int ql,qr,v;
 34     bool Add(int x,int L,int R)
 35     {
 36         if (L==R)
 37         {
 38             if (v==-1 && a[x].sum==0) return 0;
 39             a[x].sum+=v; return 1;
 40         }
 41         else
 42         {
 43             const int mid=(L+R)>>1;bool ans;
 44             if (ql<=mid) ans=Add(a[x].ls,L,mid);
 45             else ans=Add(a[x].rs,mid+1,R);
 46             up(x); return ans;
 47         }
 48     }
 49     bool add(int x,int v) {ql=x; this->v=v; return Add(1,1,n);}
 50     int Find(int x,int L,int R)
 51     {
 52         if (L==R) return L;
 53         const int mid=(L+R)>>1;
 54         if (a[a[x].ls].sum>0) return Find(a[x].ls,L,mid);
 55         return Find(a[x].rs,mid+1,R);
 56     }
 57     int find() {return Find(1,1,n);}
 58     int Query(int x,int L,int R)
 59     {
 60         if (ql<=L && R<=qr) return a[x].sum;
 61         int mid=(L+R)>>1,ans=0;
 62         if (ql<=mid) ans+=Query(a[x].ls,L,mid);
 63         if (qr> mid) ans+=Query(a[x].rs,mid+1,R);
 64         return ans;
 65     }
 66     int query(int L,int R) {ql=L; qr=R; return Query(1,1,n);}
 67 }smt;
 68
 69 struct qnode
 70 {
 71     int v,id;
 72     bool operator > (const qnode &b) const {return v>b.v;}
 73 };
 74 priority_queue<qnode,vector<qnode>,greater<qnode> > qtot;
 75 queue<int> q[maxn];
 76
 77 int a[maxn];
 78 int qread()
 79 {
 80     char c;int s=0; while (!((c=getchar())>='0' && c<='9'));
 81     do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s;
 82 }
 83 void write(int x)
 84 {
 85     if (!x) {putchar('0');putchar('\n');return;}
 86     char buf[15]; int lb=0;
 87     while (x) {buf[++lb]=x%10; x/=10;}
 88     for (;lb;lb--) putchar(buf[lb]+'0'); putchar('\n');
 89 }
 90 int main()
 91 {
 92     scanf("%d",&T);
 93 while (T--)
 94 {
 95     scanf("%d",&n);
 96     for (int i=1;i<=n;i++) a[i]=qread();
 97     for (int i=1;i<=n;i++) while (!q[i].empty()) q[i].pop();
 98     while (!qtot.empty()) qtot.pop();
 99     smt.build();
100     scanf("%d",&m);
101     int t,op,id,x,y;
102     while (m--)
103     {
104         t=qread(),op=qread();
105         while (!qtot.empty() && qtot.top().v<=t) smt.add(qtot.top().id,1),q[qtot.top().id].pop(),qtot.pop();
106         if (op==0)
107         {
108             id=qread();
109             q[id].push(t);
110             qtot.push((qnode){t+a[id],id});
111         }
112         else if (op==1)
113         {
114             if (smt.a[1].sum==0) puts("Yazid is angry.");
115             else
116             {
117                 int ans=smt.find();
118                 write(ans);
119                 smt.add(ans,-1);
120             }
121         }
122         else if (op==2)
123         {
124             id=qread();
125             if (smt.add(id,-1)) puts("Succeeded!");
126             else if (q[id].empty()) puts("YJQQQAQ is angry.");
127             else write(q[id].front()+a[id]-t);
128         }
129         else
130         {
131             x=qread(),y=qread();
132             write(smt.query(x,y));
133         }
134     }
135 }
136     return 0;
137 }

View Code

转载于:https://www.cnblogs.com/Blue233333/p/8107732.html

「CodePlus 2017 12 月赛」火锅盛宴相关推荐

  1. 「CodePlus 2017 11 月赛」可做题

    题目描述 qmqmqm 希望给 sublinekelzrip 出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai​​,你需要计算其异或前缀和bi,满足条件b1=a1​​,bi=b ...

  2. loj6300 「CodePlus 2018 3 月赛」博弈论与概率统计

    link 题意: A和B玩游戏,每轮A赢的概率为p.现在有T组询问,已知A赢了n轮输了m轮,没有平局,赢一局A得分+1,输一局得分-1,问A得分期望值? $n+m,T\leq 2.5\times 10 ...

  3. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

  4. 「CodePlus 2018 3 月赛」白金元首与克劳德斯

    所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...

  5. 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯

    [题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...

  6. 【线段树】「CodePlus 2018 3 月赛」白金元首与克劳德斯

    题意: 分析: 题意好鬼扯... 非常傻逼的线段树动态开点题. 横向移动的矩形和纵向移动的矩形,看起来非常麻烦. 由于速度均相等,所以可以以所有纵向移动的矩形为参考系,那么所有纵向移动的矩形都是相对静 ...

  7. LOJ6299:「CodePlus 2018 3 月赛」白金元首与克劳德斯 (离散化+前缀和)

    题目传送门:https://loj.ac/problem/6299 题目分析:一道不难的题目,然而比赛的时候只有90pts.由于所有克劳德斯(clouds)一开始都不相交,所以答案不是1就是2.用O( ...

  8. [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)

    [CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...

  9. 「ROI 2017 Day 2」反物质(单调队列优化dp)

    problem LOJ2772 solution 这道题求的是"保证最多",这个"保证"真的屑啊! 因为我们无法确定实验生成的克数,所以我们应当计算的是最坏情况 ...

最新文章

  1. css限制字体三行_CSS美化网页
  2. 计算机考试字字处理重点,计算机等级考试一级B上机试题:字表处理题(1)
  3. Oracle提议将G1作为Java 9的默认垃圾收集器
  4. 茶苑机器人怎么看出来_小儿脑瘫怎么看出来?出现4个异常,该早点去看医生...
  5. Algs4-1.4.38 3-sum的初级算法与ThreeSum性能比较
  6. LIMS实验室系统无纸化管理给实验室带来的帮助
  7. RabbitMQ Federation 插件使用
  8. 网吧用计算机性能配件清单,网吧组装电脑配置清单
  9. java分类Kdd99数据集_【数据】主题分类数据集
  10. 第二十二章 独自早餐(枯木雕之秘)
  11. uniapp添加阿里字体图标库图标
  12. 【2013年度CSDN博客之星】评奖:全文五言句,俺也拉个票
  13. 直面中国市场的新挑战,律商风险数据赋能车险智慧决策踏上新征程
  14. AutoCAD Mac如何安装?看完这篇你就会了~
  15. java文件太大 上传不了怎么办_上传文件(200M)过大失败,想提高成800M
  16. 程序员为什么热衷造轮子
  17. 时间和日期函数 now 的作用
  18. SpringAop面向切面编程使用详解
  19. 爬取中国工程院院士的信息
  20. leetcode 字母异位词分组(js实现)

热门文章

  1. android 展示星期方式,Android显示从一周到另一周的日期(星期四至星期四)
  2. linux 广播命令,Linux基础命令---ping
  3. php 状态码302,HTTP状态码302、303和307的故事
  4. php超强后门在任意位置创建文件,php大马:.user.ini文件构成的超强PHP后门
  5. C语言开发笔记(五)字符串常量
  6. C++基础知识点整理
  7. scala中何时使用下划线_在Scala中使用下划线
  8. java bitset_Java BitSet clone()方法及示例
  9. python selenium post请求_工作随笔——selenium支持post请求,支持自定义header
  10. excel去重怎么操作_excel数据技巧:不用公式如何快速去重