哎,这个写的很痛苦,思路并不复杂,但是有一些细节总是出现莫名奇妙的问题,经常与自己的预期不符,另外利用滚动数组的优化很有意思,值得学习。这一版是卡着时间过的,并且代码并不优雅,啥时候再改进吧。
还有一点令我疑惑的是这个题,关了流同步反而更慢了,不理解。
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX = 1e3 + 10;
int N,S,P,T;
int RN;
double dt;
double v,u,a,b,c,d;
double vMax=-INF,vMin=INF;
int cntMax=-INF,cntMin=INF;
int maxd;
int idx;
int rArg[MAX];
vector<int> edges[MAX << 1];
struct NeuralNode {
double v,u,a,b,c,d;
int activeTimes;
}neuralNodes[MAX];
struct edge {
int s,t;
double w;
int D;
}msc[MAX];
static unsigned long nxt = 1;
int myrand(void) {
nxt = nxt * 1103515245 + 12345;
return((unsigned)(nxt/65536) % 32768);
}
int main() {
//read
idx = 0;
cin >> N >> S >> P >> T;
cin >> dt;
while (idx < N) {
cin >> RN >> v >> u >> a >> b >> c >> d;
for (int i = idx; i < idx + RN; i++) {
neuralNodes[i].v = v;
neuralNodes[i].u = u;
neuralNodes[i].a = a;
neuralNodes[i].b = b;
neuralNodes[i].c = c;
neuralNodes[i].d = d;
neuralNodes[i].activeTimes = 0;
}
idx += RN;
}
for (int i = 0; i < P; i++) {
cin >> rArg[i];
}
for (int i = 0; i < S; i++) {
cin >> msc[i].s >> msc[i].t >> msc[i].w >> msc[i].D;
maxd = max(maxd,msc[i].D);
edges[msc[i].s].push_back(i);
}
int MOD = maxd + 1;
//开始处理
vector<vector<double>> I(MOD,vector<double>(N));
for (int k = 0; k < T; k++) {
for (int i = 0; i < N; i++) {
I[(k + maxd) % MOD][i] = 0;
}
for (int i = 0; i < P; i++) {
int myRnad = myrand();
if (rArg[i] > myRnad) {
for (int j = 0; j < edges[i + N].size(); j++) {
edge mc = msc[edges[i + N][j]];
I[(k + mc.D) % MOD][mc.t] += mc.w;
}
}
}
for (int i = 0; i < N; i++) {
double uk_ = neuralNodes[i].u;
double vk_ = neuralNodes[i].v;
double a_ = neuralNodes[i].a;
double b_ = neuralNodes[i].b;
neuralNodes[i].v = vk_ + dt * (0.04 * vk_ * vk_ + 5 * vk_ + 140 - uk_) + I[k % MOD][i];
neuralNodes[i].u = uk_ + dt * a_ * (b_ * vk_ - uk_);
if (neuralNodes[i].v >= 30) {
neuralNodes[i].activeTimes++;
for (int j = 0; j < edges[i].size(); j++) {
edge mc = msc[edges[i][j]];
I[(k + mc.D) % MOD][mc.t] += mc.w;
}
neuralNodes[i].v = neuralNodes[i].c;
neuralNodes[i].u += neuralNodes[i].d;
}
}
}
for (int i = 0; i < N; i++) {
vMin = min(vMin, neuralNodes[i].v);
vMax = max(vMax, neuralNodes[i].v);
cntMin = min(cntMin, neuralNodes[i].activeTimes);
cntMax = max(cntMax, neuralNodes[i].activeTimes);
}
cout<<fixed<<setprecision(3)<<vMin<<" "<<vMax<<endl;
cout<<cntMin<<" "<<cntMax<<endl;
}