QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#546446 | #8038. Hammer to Fall | qwqpmp | RE | 0ms | 0kb | C++17 | 3.9kb | 2024-09-04 02:52:41 | 2024-09-04 02:52:41 |
Judging History
answer
// 日丽风和, 希望大家可以平安归来;
#include <bits/stdc++.h>
using namespace std;
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("inline")
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define endl '\n'
#define ayy(x) array<int,x>
#define ys(x) (x?"Yes":"No")
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand()%x; }
const ll mod=1000000007,off=5;
const int MAXN=1e5+10,B=500;
ll powmod(ll a,ll b) {ll res=1;a%=mod;assert(b>=0);for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
// head
template<int MOD, int RT> struct mint {
static const int mod = MOD;
static constexpr mint rt() { return RT; } // primitive root for FFT
int v; explicit operator int() const { return v; } // explicit -> don't silently convert to int
mint():v(0) {}
mint(ll _v) { v = int((-MOD < _v && _v < MOD) ? _v : _v % MOD);
if (v < 0) v += MOD; }
bool operator==(const mint& o) const {
return v == o.v; }
friend bool operator!=(const mint& a, const mint& b) {
return !(a == b); }
friend bool operator<(const mint& a, const mint& b) {
return a.v < b.v; }
mint& operator+=(const mint& o) {
if ((v += o.v) >= MOD) v -= MOD;
return *this; }
mint& operator-=(const mint& o) {
if ((v -= o.v) < 0) v += MOD;
return *this; }
mint& operator*=(const mint& o) {
v = int((ll)v*o.v%MOD); return *this; }
mint& operator/=(const mint& o) { return (*this) *= inv(o); }
friend mint pow(mint a, ll p) {
mint ans = 1; assert(p >= 0);
for (; p; p /= 2, a *= a) if (p&1) ans *= a;
return ans; }
friend mint inv(const mint& a) { assert(a.v != 0);
return pow(a,MOD-2); }
mint operator-() const { return mint(-v); }
mint& operator++() { return *this += 1; }
mint& operator--() { return *this -= 1; }
friend mint operator+(mint a, const mint& b) { return a += b; }
friend mint operator-(mint a, const mint& b) { return a -= b; }
friend mint operator*(mint a, const mint& b) { return a *= b; }
friend mint operator/(mint a, const mint& b) { return a /= b; }
};
const int MOD=998244353;
using mi = mint<MOD,5>; // 5 is primitive root for both common mods
struct edge{
int v,w;
};
vector<edge> e[MAXN];
multiset<int> pa[MAXN];
vector<pii> ls[MAXN];
int a[MAXN],b[MAXN];
mi f[MAXN];
int n,m,q;
signed main(){
freopen("qwq.in","r",stdin);
freopen("qwq.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
rep(i,1,n+1) scanf("%d",&a[i]);
rep(i,1,m+1) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[u].pb((edge){v,w});
e[v].pb((edge){u,w});
}
rep(i,1,q+1) scanf("%d",&b[i]);
rep(i,1,n+1) {
if (SZ(e[i])<B) continue;
for (auto [x,y] : e[i]) {
pa[i].insert(y);
ls[x].eb(i,y);
}
}
// for (auto [a,b] : ls[1]) printf("%d %d\n",a,b);
// puts("");
// for (auto [a,b] : ls[2]) printf("%d %d\n",a,b);
// puts("");
per(i,1,q+1) {
if (SZ(e[b[i]])>=B) {
for (auto [x,y] : ls[b[i]]) {
pa[x].erase(pa[x].find(f[b[i]].v+y));
}
f[b[i]]=*(pa[b[i]].rend());
for (auto [x,y] : ls[b[i]])
pa[x].insert(f[b[i]].v+y);
}
else {
for (auto [x,y] : ls[b[i]]) {
pa[x].erase(pa[x].find(f[b[i]].v+y));
}
mi ans=0;
for (auto [x,y] : e[b[i]]) {
if (ans.v==0) ans=f[x]+y;
else ans=min(ans,f[x]+y);
}
f[b[i]]=ans;
for (auto [x,y] : ls[b[i]])
pa[x].insert(ans.v+y);
}
}
mi ans=0;
rep(i,1,n+1) ans+=f[i]*a[i];
printf("%d",ans.v);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Dangerous Syscalls
input:
3 2 2 1 1 1 2 3 10 1 2 1 3 2