洛谷 P8048 题解
DaiRuiChen007 · · 题解
洛谷 P8048 题解
思路分析
很好的思维题
首先考虑一个经典的 trick,假设两只相遇后的变色龙没有掉头,而是使用对方的颜色继续向前走,那么效果如下:
我们发现:此时向右走的变色龙相当于没变色,而向左走的变色龙的颜色加上了向右走的变色龙的颜色
所以每个向右走的变色龙对答案的贡献都能够快速统计,问题转化成统计每个向左走的变色龙对答案的贡献
注意到所有变色龙的速度都是相等的,因此考虑一次性维护当前向右走的所有变色龙可以让某一条向左走的变色龙对每种颜色的贡献,为了方便,假设在
那么再加入一条颜色为
那么此时实际出现了一只颜色为
然后模拟即可,时间复杂度
代码呈现
#include<bits/stdc++.h>
#define int long long
using namespace std;
double cnt[50],ans[50];
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,k,l;
cin>>n>>k>>l;
int lst=0,del=0;
for(int i=1;i<=n;++i) {
int d,col;
char op;
cin>>d>>col>>op;
if(op=='L') {
ans[col]+=(d-lst)/2.0;
ans[(col+del)%k]+=d/2.0;
for(int i=0;i<k;++i) ans[(i+col)%k]+=cnt[i];
} else {
ans[col]+=l-d;
rotate(cnt,cnt+k-col,cnt+k);
cnt[col]+=(d-lst)/2.0;
del=(del+col)%k;
lst=d;
}
}
for(int i=0;i<k;++i) cout<<fixed<<setprecision(1)<<ans[i]<<'\n';
return 0;
}