mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-10-25 17:42:46 +00:00
Compare commits
3 Commits
40fbda7ec8
...
f85c0df2f1
| Author | SHA1 | Date | |
|---|---|---|---|
| f85c0df2f1 | |||
| 3f0a46735d | |||
| 7148637cb3 |
@ -1,11 +1,53 @@
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <istream>
|
||||
#include <vector>
|
||||
using ll = int64_t;
|
||||
|
||||
|
||||
ll n,ans;
|
||||
std::vector<std::vector<ll>> apos,bpos;
|
||||
std::vector<ll> a,b;
|
||||
|
||||
int main(){
|
||||
std::iostream::sync_with_stdio(false);
|
||||
std::cin.tie(nullptr);
|
||||
|
||||
std::cin>>n;
|
||||
|
||||
a.resize(n+1);
|
||||
b.resize(n+1);
|
||||
apos.resize(n+1);
|
||||
bpos.resize(n+1);
|
||||
|
||||
for(ll i=1;i<=n;i++){
|
||||
std::cin>>a[i];
|
||||
apos[a[i]].push_back(std::min(i,n-i+1));
|
||||
}
|
||||
for(ll i=1;i<=n;i++){
|
||||
std::cin>>b[i];
|
||||
bpos[b[i]].push_back(std::min(i,n-i+1));
|
||||
}
|
||||
for(ll i=1;i<=n;i++){
|
||||
if(a[i]==b[i]){
|
||||
ll N=i-1;
|
||||
ans+=N*(N+1)/2;
|
||||
N=n-i;
|
||||
ans+=N*(N+1)/2;
|
||||
}
|
||||
std::sort(apos[i].begin(),apos[i].end());
|
||||
std::sort(bpos[i].begin(),bpos[i].end());
|
||||
|
||||
ll pa=0,pb=0;
|
||||
while(pa<apos[i].size() && pb<bpos[i].size()){
|
||||
if(apos[i][pa]<bpos[i][pb]){
|
||||
ans+=apos[i][pa++]*(bpos[i].size()-pb);
|
||||
}else{
|
||||
ans+=bpos[i][pb++]*(apos[i].size()-pa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cout<<ans<<"\n";
|
||||
}
|
||||
102
src/10/22/P5835.cpp
Normal file
102
src/10/22/P5835.cpp
Normal file
@ -0,0 +1,102 @@
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <istream>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
using ll = int64_t;
|
||||
|
||||
const ll maxn = 5e4+5;
|
||||
ll n,l,allweight;
|
||||
struct P{
|
||||
ll w,x,d;
|
||||
inline bool operator<(const P&other)const{
|
||||
return x<other.x;
|
||||
}
|
||||
}c[maxn];
|
||||
struct D{
|
||||
ll d,idx;
|
||||
inline bool operator<(const D&other)const{
|
||||
return d<other.d;
|
||||
}
|
||||
}dis[maxn];
|
||||
std::vector<ll> after,rafter,tmp;
|
||||
std::unordered_set<ll> vis;
|
||||
|
||||
static inline ll merge(std::vector<ll>&num,std::vector<ll>&tmp,ll l,ll mid,ll r){
|
||||
ll cnt=0;
|
||||
ll i=l,j=mid+1,k=l;
|
||||
while(i<=mid&&j<=r){
|
||||
if(num[i]<=num[j]){
|
||||
tmp[k++]=num[i++];
|
||||
}else{
|
||||
cnt+= mid-i+1;
|
||||
tmp[k++]=num[j++];
|
||||
}
|
||||
}
|
||||
while(i<=mid)tmp[k++]=num[i++];
|
||||
while(j<=r)tmp[k++]=num[j++];
|
||||
for(ll i=l;i<=r;i++){
|
||||
num[i]=tmp[i];
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
static inline ll mergesort(std::vector<ll>&num,std::vector<ll>&tmp,ll l,ll r){
|
||||
ll cnt=0;
|
||||
if(l<r){
|
||||
ll mid=(l+r)/2;
|
||||
cnt+=mergesort(num, tmp, l, mid);
|
||||
cnt+=mergesort(num, tmp, mid+1, r);
|
||||
cnt+=merge(num,tmp,l,mid,r);
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
int main(){
|
||||
std::iostream::sync_with_stdio(false);
|
||||
std::cin.tie(nullptr);
|
||||
|
||||
std::cin>>n>>l;
|
||||
after.reserve(n+1);
|
||||
tmp.resize(n+1);
|
||||
for(ll i=1;i<=n;i++){
|
||||
std::cin>>c[i].w>>c[i].x>>c[i].d;
|
||||
allweight+=c[i].w;
|
||||
}
|
||||
std::sort(c+1,c+1+n);
|
||||
for(ll i=1;i<=n;i++){
|
||||
dis[i].idx=i;
|
||||
if(c[i].d==1){
|
||||
dis[i].d=l-c[i].x;
|
||||
}else{
|
||||
dis[i].d=c[i].x;
|
||||
}
|
||||
}
|
||||
std::sort(dis+1,dis+1+n);
|
||||
ll outweight=0;
|
||||
ll pout=0;
|
||||
for(ll i=1;i<=n;i++){
|
||||
outweight+=c[dis[i].idx].w;
|
||||
// printf("%lld is out\n",c[dis[i].idx].x);
|
||||
pout=dis[i].d;
|
||||
vis.emplace(dis[i].idx);
|
||||
if(outweight*2>=allweight){
|
||||
break;
|
||||
}
|
||||
}
|
||||
// printf("lnum=%lld, rnum=%lld\n",lnum,rnum);
|
||||
// std::cout<<"after:\n";
|
||||
// for(ll i:after){
|
||||
// std::cout<<i<<" ,";
|
||||
// }
|
||||
// std::cout<<"\n";
|
||||
after.push_back(0);
|
||||
for(ll i=1;i<=n;i++){
|
||||
after.push_back(c[i].x+c[i].d*pout);
|
||||
}
|
||||
|
||||
std::cout<<mergesort(after, tmp, 1, n)<<"\n";
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user