1 solutions
-
0
先统计元素的可以检查的数目,然后根据枚举区间的贡献进行答案更新,为了方便,这里我们可以从区间的中点开始往两边扩展。
#include<bits/stdc++.h> using namespace std; const int N=7510; int a[N],b[N],ans[N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } int cnt=0; for(int i=1;i<=n;i++) //初始数目 { cin>>b[i]; if(a[i]==b[i]) { cnt++; } } for(int i=1;i<=n;i++) { for(int j=0;j<2;j++) { int sum=cnt; for(int l=i,r=i+j;l>=1&&r<=n;l--,r++) //往两边扩展 { //去掉原始的影响 if(a[l]==b[l]) sum--; if(a[r]==b[r]) sum--; //假设已经交换完成 //加上交换的影响 if(a[r]==b[l]) sum++; if(b[r]==a[l]) sum++; ans[sum]++; } } } for(int i=0;i<=n;i++) { cout<<ans[i]<<endl; } return 0; }
- 1
Information
- ID
- 2581
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 1
- Accepted
- 1
- Uploaded By