【DS】河南省第十三届ICPC大学生程序设计竞赛 J-甜甜圈

明天就要省赛了,感觉已经寄了捏

J-甜甜圈_河南省第十三届ICPC大学生程序设计竞赛(重现赛) (nowcoder.com)

题意:

【DS】河南省第十三届ICPC大学生程序设计竞赛 J-甜甜圈_第1张图片

思路:

直接模拟复杂度太高,因此考虑用DS优化

我们考虑用树状数组维护

在用线段树和树状数组之前,先去考虑好我们要维护的是哪个序列,我们需要维护的是序列的什么值

对于这道题,首先需要构造序列

因为他有两根,因此考虑把两根棒合并成一根,然后维护这一根就行

那就是把这两根棒头对头放着就行

每次操作我们找出最大值的位置,贡献加上该最大值头上有几个,然后把它删除

删除其实就是把1变成0

至于怎么去维护贡献,只需要记录上一次删除的位置即可

对于第一次删除,上一次删除的位置在n

这样就可以直接维护了,这题用线段树和也可以做!

Code:

#include 
using namespace std;
#define int long long
#define low(x) ((x)&(-x))
const int mxn=1e5+10;
const int mxe=1e5+10;
struct ty{
	int x,y;
	bool operator<(const ty&a)const{
		return a.y>n>>m;
	for(int i=n;i>=1;i--){
		insert(i,1);
		cin>>a[i].y;
		a[i].x=i;
	}
	for(int i=n+1;i<=n+m;i++){
		insert(i,1);
		cin>>a[i].y;
		a[i].x=i;
	}
	a[0].x=n;
	sort(a+1,a+1+n+m);
	int ans=0;
	for(int i=1;i<=n+m;i++){
		insert(a[i].x,-1);
		//cout<>__;
	while(__--)solve();return 0;
}#include 
using namespace std;
#define int long long
#define low(x) ((x)&(-x))
const int mxn=1e5+10;
const int mxe=1e5+10;
struct ty{
	int x,y;
	bool operator<(const ty&a)const{
		return a.y>n>>m;
	for(int i=n;i>=1;i--){
		insert(i,1);
		cin>>a[i].y;
		a[i].x=i;
	}
	for(int i=n+1;i<=n+m;i++){
		insert(i,1);
		cin>>a[i].y;
		a[i].x=i;
	}
	a[0].x=n;
	sort(a+1,a+1+n+m);
	int ans=0;
	for(int i=1;i<=n+m;i++){
		insert(a[i].x,-1);
		//cout<>__;
	while(__--)solve();return 0;
}

 

你可能感兴趣的:(线段树与树状数组,算法,图论,c++)