明天就要省赛了,感觉已经寄了捏
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;
}