QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#546446#8038. Hammer to FallqwqpmpRE 0ms0kbC++173.9kb2024-09-04 02:52:412024-09-04 02:52:41

Judging History

This is the latest submission verdict.

  • [2024-09-04 02:52:41]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2024-09-04 02:52:41]
  • Submitted

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

output:


result: