正经题解|得分游戏
2024-06-11 12:53:59
发布于:广东
38阅读
0回复
0点赞
思维水题,太水了,随便想想都知道,上代码!!
#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
const int N=5e5+5;
long long num[N];
int a[N],val[N],l[N],idx;
map<int,bool> v;
long long A(int n,int t,int Sx) {
for (int i=0;i<=2*n+1;i++) num[i]=0LL,l[i]=0;
idx=0;
v.clear();
for (int i=Sx;1;i=a[i]) {
l[++idx]=i;
if (v[a[i]]==1) {
break;
}
v[i]=1;
}
for (int i=1;i<=idx;i++) {
l[i+idx]=l[i];
num[i]=val[l[i]];
num[i+idx]=num[i];
}
idx*=2;
int sx;
for (int i=1;i<=idx;i++) {
num[i]+=num[i-1];
}
for (int i=1;i<=idx;i++) {
if (l[i]==Sx) {
sx=i;
break;
}
}
long long sum=0;
for (int i=sx;i<=idx;i++) {
if (t-i+sx>0) sum=max(sum,num[i-1]-num[sx-1]+val[l[i]]*(t-i+sx));
else break;
}
return sum;
}
int main() {
int n,t,sx1,sx2;
scanf("%d %d %d %d",&n,&t,&sx1,&sx2);
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
for (int i=1;i<=n;i++) {
scanf("%d",&val[i]);
}
long long sum1=A(n,t,sx1),sum2=A(n,t,sx2);
if (sum1==sum2) {
printf("Okay,fine.");
}else if (sum1>sum2) {
printf("YuiliceSeko!");
}else {
printf("Nononononomeo~");
}
return 0;
}
这里空空如也
有帮助,赞一个