首页 > 其他分享 >P7424 [THUPC2017] 天天爱射击

P7424 [THUPC2017] 天天爱射击

时间:2024-01-17 20:12:12浏览次数:34  
标签:二分 THUPC2017 P7424 le 木板 int 子弹 times 射击

[THUPC2017] 天天爱射击

题目描述

小 C 爱上了一款名字叫做《天天爱射击》的游戏。如图所示,这个游戏有一些平行于 \(x\) 轴的木板。现在有一些子弹,按顺序沿着 \(y\) 轴方向向这些木板射去。第 \(i\) 块木板被 \(S_i\) 个子弹贯穿以后,就会碎掉消失。一个子弹可以贯穿其弹道上的全部木板,特别的,如果一个子弹触碰到木板的边缘,也视为贯穿木板。

小 C 现在知道了游戏中 \(n\) 块木板位置,以及知道了 \(m\) 个子弹射击位置。现在问你每个子弹射出去以后,有多少木板会碎掉?

输入格式

从标准输入读入数据。

第一行两个整数 \(n\) 和 \(m\),表示木板数量和子弹数量。其中 \(1\le n,m\le 2\times 10^5\)。

接下来 \(n\) 行,每行三个整数 \(x_1,x_2,s\),表示每块木板的左端点 \(x\) 坐标、右端点 \(x\) 坐标,以及贯穿多少次会碎掉。其中保证 \(1\le x_1\le x_2\le2\times 10^5,1\le s\le 2\times 10^5\)。

接下来 \(m\) 行,每行一个整数 ,表示每个子弹的 \(x\) 坐标。子弹按照发射顺序给出。其中保证 \(1\le x\le2\times 10^5\)。

输出格式

输出到标准输出。

\(m\) 行,每行一个整数。表示每颗子弹射出去后,有多少木板碎掉。

样例 #1

样例输入 #1

3 2
1 3 1
2 4 2
3 4 1
2
3

样例输出 #1

1
2

提示

版权信息

来自 THUPC(THU Programming Contest,清华大学程序设计竞赛)2017。

\(\text{upd}2021.7.6\):感谢 @jiangbowen 提供的一组 hack 数据,不计分,但若不通过 hack 数据则不算通过此题。

第一眼很没有思路。
这怎么做?

其实还好,但是我即使知道这是整体二分的题目,第一眼还是不知道怎么做。
其实是很裸的整体二分。
考虑进行n次二分答案怎么做。
对每一个木板进行二分答案。二分它在第几次射击中碎裂。

那就知道了,确实很裸

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read() {
	char c=getchar();int a=0,b=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
	for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;return a*b;
}
int tr[200001],n,m,Maxr,ans[200001],pl[200001],Get[200001];
inline int lowbit(int x)
{
	return x&(-x);
}
inline void add(int i,int x)
{
	while(i<=Maxr)
	{
		tr[i]+=x;
		i+=lowbit(i);
	}
}
inline int ask(int i)
{
	int ans=0;
	while(i>0)
	{
		ans+=tr[i];
		i-=lowbit(i);
	}
	return ans;
}
struct board
{
	int l,r,k;
	int id;
}q[200001],ql[200001],qr[200001];
void solve(int st,int ed,int l,int r)
{
//	cout<<st<<' '<<ed<<' '<<l<<' '<<r<<endl;
	if(l>r)return;
	if(st==ed)
	{
		for(int i=l;i<=r;i++)
		{
			ans[q[i].id]=st;
		}
		return;
	}
	int mid=st+ed>>1;
	for(int i=st;i<=mid;i++)
	{
		add(pl[i],1);
	}
	int tl=0,tr=0;
	for(int i=l;i<=r;i++)
	{
		int tmp=ask(q[i].r)-ask(q[i].l-1);
		if(tmp>=q[i].k)
		{
			ql[++tl]=q[i];
		}
		else
		{
			qr[++tr]=q[i];
			qr[tr].k-=tmp;
		}
	}
	for(int i=st;i<=mid;i++)
		add(pl[i],-1);
	for(int i=l;i<=l+tl-1;i++)
		q[i]=ql[i-l+1];
	for(int i=l+tl;i<=r;i++)
		q[i]=qr[i-l-tl+1];
	solve(st,mid,l,l+tl-1);
	solve(mid+1,ed,l+tl,r);
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		q[i].l=read();q[i].r=read();q[i].k=read();
		q[i].id=i;
		Maxr=max(Maxr,q[i].r);
	}
	for(int i=1;i<=m;i++)
	{
		pl[i]=read();
	}
	solve(1,m+1,1,n);
	for(int i=1;i<=n;i++)
	{
//		cout<<ans[i]<<' ';
		Get[ans[i]]++;
	}
//	cout<<endl;
	for(int i=1;i<=m;i++)
	{
		cout<<Get[i]<<endl;
	}
	return 0;
}
/*
5 3
1 4 2
2 3 1
3 4 1
1 5 3
3 5 2
1
3
2
*/

一个细节,就是整体二分的值域要开大一些。

像上面,如果我solve里面的m+1是m的话,就会错,这个其实是在考虑如果有板子没被打碎的情况。
如果不开到m+1,它就会默认在m停下,事实上不可以。

还好我这次试了一个例子,不然要wa一次了。

标签:二分,THUPC2017,P7424,le,木板,int,子弹,times,射击
From: https://www.cnblogs.com/HLZZPawa/p/17971067

相关文章

  • Python从入门到实践project飞船射击外星人3
    完善记分系统1确保难度升级分值跟着升级2将分值显示为10的整数倍3显示最高分4显示等级5显示剩余飞船数确保难度升级分值跟着升级self.alien_points=int(self.alien_points*self.score_scale)print(self.alien_points)print确保分值变化,确保后删除将分值显示为10的整数倍......
  • Python从入门到实践project飞船射击外星人2
    project飞船射击外星人1加入play按钮创建button文件importpygame.font#能在游戏里添加文本classButton:def__init__(self,ai_game,msg):"""初始化按钮的属性"""self.screen=ai_game.screenself.screen_rect=self.screen.get_rect......
  • 坦克主动射击模拟训练系统软件
    智慧华盛恒辉坦克主动射击模拟训练系统是一种用于模拟坦克射击训练的计算机系统。该系统通过模拟真实的战场环境和射击场景,提供坦克射击训练的模拟体验。智慧华盛恒辉系统通常由以下几个部分组成:硬件部分:包括计算机、显示器、操纵杆等硬件设备,用于模拟坦克的操纵和射击......
  • 代码战场:用Python射击游戏开启程序员的创造之旅
    目录前言代码演示总结前言大家好,我是辣条哥!昨天在家点开好久没打开的游戏菜单,突然看到好久没有玩过的某F,玩了几把发现时代是真的变了!于是今天辣条有感而发写了这么一个简陋的射击类小游戏在这个项目中,我们将使用Python编写一个射击类游戏。这个游戏不仅具有高难度,还可以进行......
  • P7424 [THUPC2017] 天天爱射击
    传送门我们发现,考虑每个子弹击碎哪些木板是不现实的,所以我们要转换问题:考虑每个木板被哪个子弹击碎考虑可持久化线段树,转换问题成求区间\(l\simr\)的第s早发射的子弹,模板题上代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constllN=2e5+50,M=2e5......
  • 射击比赛
    1.题目给定一个射击比赛成绩单包含多个选手若干次射击的成绩分数请对每个选手按其最高三个分数之和进行降序排名输出降序排名后的选手ID序列条件如下:一个选手可以有多个射击成绩的分数且次序不固定如果一个选手成绩小于三个则认为选手的所有成绩无效排名忽略该选手......
  • Unreal5 第三人称射击游戏 角色基础制作2
    接上一篇Unreal5第三人称射击游戏角色基础制作1角色蹲伏效果上面是需要的操作映射,蹲伏实现,首先要开启相应功能,你需要在角色移动组件上面开启可蹲伏蹲伏还有一些其它设置,比如蹲下角色高度,蹲下以后行走的速度中英文截图这里我设置的移动速度,蹲伏时可以走出平台,就为了防止在物体......
  • mac太空射击游戏:Nova Drift (新星漂移)中文版
    NovaDrift是一款激动人心的太空射击游戏。NovaDriftMac整合了现代独立游戏风格和游戏历史上最深的根源。它不仅具有时尚和性感的外观,而且具有平稳的控制功能。玩家控制着一艘不断开发的生物机械船,面对敌人的大量奇怪而致命的疲劳,将垂死的星星驱逐出空隙。NovaDriftMac游戏介......
  • 使用python完成一个射击类游戏“小黄人保卫战”
    1.项目开发环境下载Python且保证能够正常工作,为了能用Python来写一个游戏,需要安装PyGame。PyGame是一个Python的库,能够让我们容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进你的游戏里。2.项目功能介绍通过设计一款塔防游戏“小黄......
  • PAT Basic 1082. 射击比赛
    PATBasic1082.射击比赛1.题目描述:本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。2.输入格式:输入在第一行中给出一个正整数N(≤10......