明天就要省赛了,感觉已经寄了捏
J-甜甜圈_河南省第十三届ICPC大学生程序设计竞赛(重现赛) (nowcoder.com)
题意:

思路:
直接模拟复杂度太高,因此考虑用DS优化
我们考虑用树状数组维护
在用线段树和树状数组之前,先去考虑好我们要维护的是哪个序列,我们需要维护的是序列的什么值
对于这道题,首先需要构造序列
因为他有两根,因此考虑把两根棒合并成一根,然后维护这一根就行
那就是把这两根棒头对头放着就行
每次操作我们找出最大值的位置,贡献加上该最大值头上有几个,然后把它删除
删除其实就是把1变成0
至于怎么去维护贡献,只需要记录上一次删除的位置即可
对于第一次删除,上一次删除的位置在n
这样就可以直接维护了,这题用线段树和也可以做!
Code:
#include <bits/stdc++.h>
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<y;
	}
}a[mxn];
int n,m;
int bitree[mxe<<2];
void init(){
	for(int i=0;i<=n+m;i++) bitree[i]=0;
}
int sum(int x){
	int res=0;
    for(int i=x;i;i-=low(i)) res+=bitree[i];
    return res;
}
void insert(int pos,int x){
	for(int i=pos;i<=n+m;i+=low(i)) bitree[i]+=x;
}
void solve(){
	cin>>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<<sum(a[i].x)<<'\n';
		ans+=abs(sum(a[i].x)-sum(a[i-1].x));
	}
	cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}#include <bits/stdc++.h>
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<y;
	}
}a[mxn];
int n,m;
int bitree[mxe<<2];
void init(){
	for(int i=0;i<=n+m;i++) bitree[i]=0;
}
int sum(int x){
	int res=0;
    for(int i=x;i;i-=low(i)) res+=bitree[i];
    return res;
}
void insert(int pos,int x){
	for(int i=pos;i<=n+m;i+=low(i)) bitree[i]+=x;
}
void solve(){
	cin>>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<<sum(a[i].x)<<'\n';
		ans+=abs(sum(a[i].x)-sum(a[i-1].x));
	}
	cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}



















