Compare commits

...

3 Commits

Author SHA1 Message Date
f85c0df2f1 feat: 添加P5835题解实现,计算最小碰撞次数
21/100pts
实现了一个算法来计算在特定条件下粒子碰撞的最小次数。主要包含以下功能:
1. 读取输入数据并初始化粒子信息
2. 根据粒子运动方向计算碰撞时间
3. 使用归并排序统计逆序对数作为碰撞次数
2025-10-23 00:10:19 +08:00
3f0a46735d refactor(P11670.cpp): 优化计算逻辑并重命名变量以提高可读性
- 将变量anumcnt重命名为apos和bpos以更清晰表达用途
- 重构计算逻辑,使用双指针方法替代原有循环
- 添加排序操作以提高计算效率
2025-10-22 16:53:29 +08:00
7148637cb3 feat: 实现P11670题目的解法
添加算法逻辑来计算题目要求的答案,包括输入处理和结果计算
2025-10-22 16:29:14 +08:00
2 changed files with 145 additions and 1 deletions

View File

@ -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
View 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";
}