首页 > 其他分享 >P9571 Horizon Blue

P9571 Horizon Blue

时间:2023-08-22 19:47:10浏览次数:28  
标签:Blue P9571 TLE 删除 int scanf Horizon 操作 op

思路

首先分析一下操作 \(2,3\)。

对于操作 \(2\),容易发现如果 \(k\) 相等,就只可能是平行或者重合,显然不满足,那么答案就是总剩余直线数减去 \(k\) 相同的直线数。

对于操作 \(3\),发现只有平行的直线不会被删去,也就是只有 \(k\) 相同而 \(b\) 不同的直线不会被删去。

如此一来,这道题核心做法就很明显了,但是具体实现有点麻烦。

首先,我想到的是拿个 map 存,但是很快发现这样做,前两个操作还好,但是对于操作 \(3\) 的删除,实在是太慢了,会 TLE。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,op,k,b,sum;
map<pair<int,int>,int>m;
map<int,int>m1;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d%d%d",&op,&k,&b);
		if(op==1) m[make_pair(k,b)]++,m1[k]++,sum++;//统计这个k,b出现的次数和k出现的次数以及总直线数
		else if(op==2) printf("%d\n",sum-m1[k]);
		else
		{
			int t=m1[k]-m[make_pair(k,b)];
			m1.clear(),sum=m1[k]=t;//只有同k不同b的能留下来
			for(auto j:m) if(j.first.first!=k||j.first.second==b) m[j.first]=0;//m中存的只能挨个遍历删除了
		}
	}
	return 0;
}

已提交,果然 TLE 了两个点,但是一看 subtask 5 也有个点 TLE 了,这代表什么?这代表我们可以用特殊性质偷奸耍滑多拿一点部分分。

subtask 5 的特殊性质是第 \(i\) 此操作 \(k=i\)。

这样显然没有直线会 \(k\) 相同,所以每次删除都必然全部删完,就不用去遍历了。

但是我们怎么直到这个是 subtask 5 的数据了,我们只需要每次判断是否 \(k=i\),如果都是的话,就特殊处理,这样的话我们就可以多获得 \(14\) 分了。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,op,k,b,sum,flag;
map<pair<int,int>,int>m;
map<int,int>m1;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d%d%d",&op,&k,&b),flag=(k==i&&!flag)?0:1;//判断是否满足特殊性质
		if(op==1) m[make_pair(k,b)]++,m1[k]++,sum++;
		else if(op==2) printf("%d\n",sum-m1[k]);
		else
		{
			if(!flag) m.clear(),m1.clear(),sum=0;//满足就特殊处理
			else
			{
				int t=m1[k]-m[make_pair(k,b)];
				m1.clear(),sum=m1[k]=t;
				for(auto j:m) if(j.first.first!=k||j.first.second==b) m[j.first]=0;
			}
		}
	}
	return 0;
}

但是最后一个点 TLE 了,这种办法实在是无能为力了,\(75\) 分大概就是极限了。

这样的话,我们就需要改改思路了。

显然,这个方法最慢的就是删除了,那么我们可以考虑延迟删除操作,直到每次需要调用或者修改的时候再进行删除。

我们可以用一个数组存它们进行了第几轮的删除操作,再拿个变量储存目前是第几轮删除操作,如果调用这个 \(k\) 的数据,就判断记录的是否等于目前的删除操作次数。

这样的话时间复杂度一下子就降下来了,但是还有个问题就是 \(k\) 相同 \(b\) 相同的直线如何删除。

如果还是用 map 来存的话,一定没办法快速删除,所以我们只能换一种储存方式。

首先想到 multiset,这是一个集合,但是允许相同元素出现,我们只需要直到它的一个功能 erase 就行。

它可以把这个集合所有等于参数的数全部删除,如此一来,我们成功地把时间复杂度降下来了。

剩下的,就是敲代码拿下 AC 了!

AC 代码

#include<bits/stdc++.h>
using namespace std;
int n,op,k,b,num[200005],sum,dfn[200005],cnt;
multiset<int>s[200005];
int main()
{
    scanf("%d",&n);
	while(n--)
	{
        scanf("%d%d%d",&op,&k,&b);
        if(k<0) k+=200001;//因为用了数组,所以需要把负值k板正,只要不重复就好,所以就加成正数好了。
        if(dfn[k]!=cnt) dfn[k]=cnt,num[k]=0,s[k].clear();//判断当前k有没有执行删除操作
		if(op==1) ++num[k],++sum,s[k].insert(b);//记录
		else if(op==2) printf("%d\n",sum-num[k]);
		else dfn[k]=++cnt,num[k]-=s[k].count(b),s[k].erase(b),sum=num[k];//删除
	}
	return 0;
}

标签:Blue,P9571,TLE,删除,int,scanf,Horizon,操作,op
From: https://www.cnblogs.com/One-JuRuo/p/17649518.html

相关文章

  • SNP BLUEFIELD助力ABM集团S/4HANA数字转型
    ABM的愿景是成为一家在矿业资源、矿业服务和矿业基础设施方面进行战略投资的公司。在业务发展中,ABM努力实现各业务部门之间的整合和协同,以满足矿业业务供应链活动的需求。来百度APP畅享高清图片挑战:营造敏捷数据环境以适应发展需求2020年,ABM集团继续加强其业务部门间的整合协同,成为......
  • Vulnhub: DriftingBlues: 2靶机
    kali:192.168.111.111靶机:192.168.111.207信息收集端口扫描nmap-A-sC-v-sV-T5-p---script=http-enum192.168.111.20780端口的/blog目录为wordpresswpscan收集wordpress用户和爆破密码wpscan--urlhttp://driftingblues.box/blog-eu,ap--plugins-detectionmi......
  • P9571 Horizon Blue 题解
    P9571HorizonBlue题解这个题拿平衡树写是不是小题大做了咳咳咳进入正题。首先转化一下题意。第一个操作是加入直线,第二个操作就是求所有斜率不等于\(k\)的直线的数量,第三个操作就是删掉所有斜率不等于\(k\)的和所有与该直线重合的直线。感觉这题完全就是FHQ_Treap的......
  • P9571 Horizon Blue 题解
    原题链接题目大意:\(有三个操作,分别为\)\(操作1加入一条直线\)\(操作2查询与一条直线相交但不重合的直线条数\)\(操作3删除所有与一条直线相交或重合的直线\)\(注意:后面两个操作的直线并不需要加入\)\(显然,两条直线相交不重合,当且仅当其k值不同\)\(所以可以把所有直线按k......
  • vlunhub笔记(四)drippingblues
    (一)信息收集查询目标靶机ip,目标机:192.168.241.142arp-scan-l照常扫一下端口,发现开放21(ftp服务),22(ssh服务),80(web服务)三个端口nmap-A-T4192.168.241.142发现开放21ftp端口,尝试访问。发现一个压缩包,下载下来发现有两个加密文件是包含关系,那我们就需要解开第一层密码。ftp://......
  • Vulnhub: DriftingBlues: 3靶机
    kali:192.168.111.111靶机:192.168.111.192信息收集端口扫描nmap-A-sC-v-sV-T5-p---script=http-enum192.168.111.192查看robots.txt得到提示访问eventadmins提示littlequeenofspades.html查看littlequeenofspades.html源码base64解密后提示adminsfixit.php......
  • CF960G Bandit Blues
    半个月前做的题,这段时间一直在颓所以没写题解,今天突然想起来才准备补上。考虑枚举最大值\(n\)的位置\(i\),那么排列就被分成\(2\)个段\([1,i-1]\)和\([i+1,n]\),而且\(\forallk\in[i+1,n]\),\(k\)不可能是前缀最大值;\(\forallk\in[1,i-1]\),\(k\)不可能是后缀最大值。......
  • Android开发 Jetpack compose LazyColumn 与 LazyRow、LazyVerticalGrid、LazyHorizon
    前言  此篇博客讲解LazyColumn与LazyRow、LazyVerticalGrid、LazyHorizontalGrid,在compose里LazyColumn与LazyRow与是用来延迟加载数据的,它对标原来xml里的ListView与RecyclerView。LazyColumn纵向列表效果图代码@ComposablefunAPage(){vallistData=remembe......
  • Vulnhub: DriftingBlues: 6靶机
    kali:192.168.111.111靶机:192.168.111.180信息收集端口扫描nmap-A-sC-v-sV-T5-p---script=http-enum192.168.111.180查看robots.txt发现存在目录:/textpattern/textpattern访问后发现是textpatterncms目录爆破发现文件spammer,访问后发现是个压缩包,解压需要密码,......
  • k8s 学习笔记之 Pod 控制器——Horizontal Pod Autoscaler(HPA)
    在之前的学习中,我们已经可以实现通过手工执行kubectlscale命令实现Pod扩容或缩容,但是这显然不符合Kubernetes的定位目标——自动化、智能化。Kubernetes期望可以实现通过监测Pod的使用情况,实现pod数量的自动调整,于是就产生了HorizontalPodAutoscaler(HPA)这种控制器。......