788 逆序对的个数
1.题意:
2.题解:
用归并求,就很妙
T(n) = 2T(n/2)+O(n) = O(nlogn)
3.ac代码:
#include<bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll a[N];
ll tmp[N];
ll merge_sort(int l,int r){
if(l>=r)
return 0;
ll mid=l+r>>1;
ll res=merge_sort(l,mid)+merge_sort(mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
tmp[k++]=a[i++];
}else{
tmp[k++]=a[j++];
res+=mid-i+1;
}
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for(int i=l,j=0;i<=r;i++,j++){
a[i]=tmp[j];
}
return res;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
ll ans=merge_sort(0,n-1);
cout<<ans<<endl;
}
789 数的范围
1.题意:
2.题解:
关于二分,还是得再练习
3.ac代码:
#include<bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int b_search1(int l,int r,int c){
while(l<r){
int mid=l+r>>1;
if(a[mid]>=c) r=mid;
else l=mid+1;
}
return l;
}
int b_search2(int l,int r,int c){
while(l<r){
int mid=l+r+1>>1;
if(a[mid]<=c) l=mid;
else r=mid-1;
}
return l;
}
int main(){
int n;
int q;
cin>>n>>q;
for(int i=0;i<n;i++){
cin>>a[i];
}
int m;
for(int i=1;i<=q;i++){
cin>>m;
int l=b_search1(0,n-1,m);
if(a[l]==m){
int r=b_search2(0,n-1,m);
cout<<l<<" "<<r<<endl;
}else{
cout<<"-1 -1"<<endl;
}
}
}
802 区间和
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long ll;
vector<int> all;
vector<pair<int,int>> add;
vector<pair<int,int>> query;
int a[N],s[N];
int n,m,x,c,l,r;
int find(int x){
int l=0,r=all.size()-1;
while(l<r){
int mid=l+r>>1;
if(all[mid]>=x) r=mid;
else l=mid+1;
}
return r+1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x>>c;
all.push_back(x);
add.push_back({x,c});
}
for(int i=1;i<=m;i++){
cin>>l>>r;
all.push_back(l);
all.push_back(r);
query.push_back({l,r});
}
sort(all.begin(),all.end());
all.erase(unique(all.begin(),all.end()),all.end());
for(auto item:add){
int x=find(item.first);
a[x]+=item.second;
}
for(int i=1;i<=all.size();i++){
s[i]=s[i-1]+a[i];
}
for(auto item:query){
int l=find(item.first);
int r=find(item.second);
cout<<s[r]-s[l-1]<<endl;
}
}