个人题目思路库
2026-06-04 20:20:08
发布于:浙江
原题(部分可开)
方法1:
#include<bits/stdc++.h>
using namespace std;
int n,t;
string s;
long long ans;
struct aaa
{
int x;
int v;
}a[200005];
int main()
{
cin>>n>>t;
cin>>s;
for (int i=1;i<=n;i++)
{
cin>>a[i].x;
if (s[i-1]-'0') a[i].v=1;
else a[i].v=-1;
}
int T=t;
while(T--)
{
for (int i=1;i<=n;i++) a[i].x+=a[i].v;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&(a[i].x==a[j].x||a[i].x>a[j].x)&&a[i].x-a[i].v<a[j].x-a[j].v) ans++;
}
cout<<ans;
return 0;
//方法1:模拟
//time:O(t*n*n)
}
华丽超时
方法2:
#include<bits/stdc++.h>
using namespace std;
int n,t;
string s;
long long ans;
struct aaa
{
int x;
int v;
}a[200005];
int main()
{
cin>>n>>t;
cin>>s;
for (int i=1;i<=n;i++)
{
cin>>a[i].x;
if (s[i-1]-'0') a[i].v=1;
else a[i].v=-1;
}
int T=t;
for (int i=1;i<=n;i++) a[i].x+=t*a[i].v;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&(a[i].x==a[j].x||a[i].x>a[j].x)&&a[i].x-a[i].v*t<a[j].x-a[j].v*t) ans++;
cout<<ans;
return 0;
//方法2:优化模拟
//time:O(n*n)
}
略有提升,但依旧超时
方法3:
#include<bits/stdc++.h>
using namespace std;
int n,t;
string s;
long long ans;
struct aaa
{
int x;
int v;
};
aaa l[200005];
aaa r[200005];
int e,sr,sl;
int main()
{
cin>>n>>t;
cin>>s;
for (int i=1;i<=n;i++)
{
cin>>e;
if (s[i-1]-'0')
{
sr++;
r[sr].x=e;
r[sr].v=1;
}
else
{
sl++;
l[sl].x=e;
l[sl].v=-1;
}
}
int T=t;
for (int i=1;i<=sl;i++) l[i].x+=t*l[i].v;
for (int i=1;i<=sr;i++) r[i].x+=t*r[i].v;
for (int i=1;i<=sl;i++)
{
for (int j=1;j<=sr;j++)
if ((l[i].x==r[j].x||l[i].x<r[j].x)&&l[i].x-l[i].v*t>r[j].x-r[j].v*t) ans++;
}
cout<<ans;
return 0;
//方法3:优化思路,加入贪心算法
//贪心:速度一致,只有正负异向才有可能相遇
//time:O(n*n)不到,此处为最坏
}
改进较小,但快了一点
方法4:
#include<bits/stdc++.h>
using namespace std;
int n,t;
string s;
long long ans;
struct aaa
{
long long x;
int v;
};
aaa l[200005];
int e,sr,sl;
long long a[200005];
int main()
{
cin>>n>>t;
cin>>s;
for (int i=1;i<=n;i++)
{
cin>>e;
if (s[i-1]-'0')
{
sr++;
a[sr]=e;
}
else
{
sl++;
l[sl].x=e;
l[sl].v=-1;
}
}
sort(a+1,a+sr+1);
for(int i=1;i<=sl;++i)
{
int l1=l[i].x;
int l2=l1-2*t;
int L=lower_bound(a+1,a+sr+1,l2)-a;
int R=lower_bound(a+1,a+sr+1,l1)-a-1;
if(R>=L) ans+=R-L+1;
}
cout<<ans;
return 0;
//方法4:强化思路,加入二分算法
//二分:将左行点排序,查找相遇右行点区间收尾,利用区间求数个数公式,求出相遇点个数
//time:O(nlogn)
}
成功不超时,butWA……
方法5:
#include<bits/stdc++.h>
using namespace std;
int n;
long long t;
string s;
long long ans;
long long l[200005];
long long r[200005];
int sr,sl;
long long x;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>t>>s;
for (int i=0;i<n;i++)
{
cin>>x;
if (s[i]-'0') r[++sr]=x;
else l[++sl]=x;
}
sort(r+1,r+sr+1);
for(int i=1;i<=sl;i++)
{
long long l1=l[i];
long long l2=l1-2*t;
int L=lower_bound(r+1,r+sr+1,l2)-r;
int R=lower_bound(r+1,r+sr+1,l1)-r-1;
if(R>=L) ans+=R-L+1;
}
cout<<ans;
return 0;
//方法5:方法4细节强化
//time:O(nlogn)
}
恁猜那结果怎么着




完结撒花
全部评论 2
- 置顶
有好的意见欢迎提出

2026-06-04 来自 浙江
0 爱看看,不看走,勿喷
2026-06-01 来自 浙江
0




















有帮助,赞一个