【LOJ2402】「THUPC 2017」天天爱射击 / Shooting(整体二分)
大致题意: 有\(n\)个区间,每个区间有一个权值,当权值变成\(0\)时消失。每个时刻将覆盖某一位置的所有区间权值减\(1\),求每个时刻有多少个区间在这一刻消失。
前言
整体二分裸题啊,太久没写过,就当练手吧。
整体二分
我们把木板和子弹放在一起,然后以时间为关键字二分。
每次先枚举所有时间小于等于\(mid\)的子弹,在树状数组上把它对应的位置单点修改值加\(1\)。
然后,枚举木板,区间查询它所覆盖区间有多少子弹,如果子弹个数大于等于它的权值,就扔到左区间,否则将它权值减去子弹个数,然后扔到右区间。
注意二分上界为\(m+1\),因为可能有木板到最后都没有消失。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
using namespace std;
int n,m,ans[N+5];struct data {int x,y,k;}s[2*N+5],p1[2*N+5],p2[2*N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C==E&&(clear(),0),*C++=c)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI,C=FO,E=FO+FS;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
}F;
class TreeArray//树状数组
{
private:
int v[N+5];
public:
I void Upt(RI x,CI y) {W(x<=n) v[x]+=y,x+=x&-x;}
I int Qry(RI x) {RI t=0;W(x) t+=v[x],x-=x&-x;return t;}
}T;
I void Solve(CI L,CI R,CI l,CI r)//整体二分
{
if(l==r) {for(RI i=L;i<=R;++i) s[i].y&&(++ans[l]);return;}RI i,t,t1=0,t2=0;int mid=l+r>>1;//边界统计答案
for(i=L;i<=R;++i) if(!s[i].y) s[i].k<=mid?(T.Upt(s[i].x,1),p1[++t1]=s[i]):p2[++t2]=s[i];else break;//枚举子弹
for(;i<=R;++i) s[i].k<=(t=T.Qry(s[i].y)-T.Qry(s[i].x-1))?p1[++t1]=s[i]:(s[i].k-=t,p2[++t2]=s[i]);//枚举木板
for(i=1;i<=t1;++i) !p1[i].y&&(T.Upt(p1[i].x,-1),0),s[L+i-1]=p1[i];for(i=1;i<=t2;++i) s[L+t1+i-1]=p2[i];//重新填充数组,同时注意清空树状数组
Solve(L,L+t1-1,l,mid),Solve(L+t1,R,mid+1,r);//继续递归求解
}
int main()
{
RI i;for(F.read(n),F.read(m),i=1;i<=n;++i) F.read(s[m+i].x),F.read(s[m+i].y),F.read(s[m+i].k);//读入木板
for(i=1;i<=m;++i) F.read(s[i].x),s[i].k=i;//读入子弹
for(Solve(1,n+m,1,m+1),i=1;i<=m;++i) F.writeln(ans[i]);return F.clear(),0;//输出答案
}
【LOJ2402】「THUPC 2017」天天爱射击 / Shooting(整体二分)的更多相关文章
- soj#2402 「THUPC 2017」天天爱射击 / Shooting
分析 按照被穿过多少次整体二分即可 代码 #include<bits/stdc++.h> using namespace std; #define lb(x) x&(-x) ],r ...
- 【LOJ#2402】[THUPC2017]天天爱射击(整体二分)
[LOJ#2402][THUPC2017]天天爱射击(整体二分) 题面 LOJ 题解 显然对于每块木板可以二分被打烂的时间. 那么直接上整体二分处理就行了. #include<iostream& ...
- LOJ 2409「THUPC 2017」小 L 的计算题 / Sum
思路 和玩游戏一题类似 定义\(A_k(x)=\sum_{i=0}^\infty a_k^ix^i=\frac{1}{1-a_kx}\) 用\(\ln 'x\)代替\(\frac{1}{x}\), 所 ...
- LOJ#2409. 「THUPC 2017」小 L 的计算题 / Sum(生成函数)
题意 给定一个长为 \(n\) 的序列 \(\{a_i\}\) 对于 \(k \in [1, n]\) 求 \[ f_k = \sum_{i = 1}^{n} a_i^k \pmod {9982443 ...
- 「THUPC 2017」机场 / Airport
https://loj.ac/problem/2403 题解 神仙题. 练习赛的时候想了个假建图. 正解太神仙了. 先把不合法情况判掉. 先对时间离散化,每个时间点开一个点. 然后把他们一次串起来,中 ...
- 题解 「THUPC 2017」小 L 的计算题 / Sum
题目传送门 题目大意 给出 \(a_{1,2,...,n}\),对于 \(\forall k\in [1,n]\) ,求出: \[\sum_{i=1}^{n}a_i^k \] \(n\le 2\tim ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
- 「THUWC 2017」随机二分图
「THUWC 2017」随机二分图 解题思路 : 首先有一个 \(40pts\) 的做法: 前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \ ...
- LOJ 2288「THUWC 2017」大葱的神力
LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...
随机推荐
- vue引入ElementUI库
element国内网站:https://element.eleme.cn/#/zh-CN 引入ElementUI命令:npm install element-ui --save (网速不好用cnp ...
- CSS学习笔记-过渡模块
过渡模块: 1.过渡三要素 1.1必须要有属性发生变化 1.2必须告诉系统哪个属性需要执行过渡效果 1.3必须告诉系统过渡效果持续时长 2.格式: ...
- LRC歌词原理和实现高仿Android网易云音乐
大家好,我们是爱学啊,今天给大家带来一篇关于LRC歌词原理和在Android上如何实现歌词逐行滚动的效果,本文来自[Android开发项目实战我的云音乐]课程:逐字滚动下一篇文章讲解. 效果图 相信大 ...
- C# WPF 解决方案MineRealms启动器 自动随机播放音乐的代码
//Nothing //Nothing string[] files = Directory.GetFiles(Path.GetDirectoryName(App.config.MainConfigP ...
- Leaving Google for a couple of devices-Kasper Lund
原文链接https://medium.com/@kasper.lund/building-for-billions-bcb48814d864 一年多以前,我辞去了我在Google的出色工作,离开了一群 ...
- JavaScript-----7.循环
1.循环 在JS中主要有以下三种类型的循环 for循环 while循环 do...while循环 2. for循环 2.1 语法结构如下: for (初始化变量: 条件表达式: 操作表达式) { // ...
- vue_04day 路由初始
目录 vue_04 项目初始: vue 文件构造: vue项目目录结构: 项目入口(main.js): vue项目启动生命周期: 根组件(vue.js): router.js: 创建的页面: 全局样式 ...
- ubuntu下面安装nodejs
对于刚接触ubuntu的同学来说,一切都是新的,一切都是那么熟悉而又不熟悉的.不管是作为一个前端工程师还是一个后端工程师,我相信大家知道nodejs,但是如果希望自己能够在ubuntu上面使用node ...
- 一篇文章看懂angularjs component组件
壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中详细介绍了directive基本用法与完整属性介绍.directive是个很神奇的存在,你可以不设置templa ...
- 5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array
本文首发于个人博客https://kezunlin.me/post/b82753fc/,欢迎阅读最新内容! 5 methods for c++ shared_ptr point to an array ...