Submission #750846

# Submission time Handle Problem Language Result Execution time Memory
750846 2023-05-30T11:44:30 Z josanneo22 Cyberland (APIO23_cyberland) C++17
Compilation error
0 ms 0 KB
#include <bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
using namespace std;
template <typename T>
T inverse(T a, T m) {
	T u = 0, v = 1;
	while (a != 0) {
		T t = m / a;
		m -= t * a; swap(a, m);
		u -= t * v; swap(u, v);
	}
	assert(m == 1);
	return u;
}

template <typename T>
class Modular {
public:
	using Type = typename decay<decltype(T::value)>::type;

	constexpr Modular() : value() {}
	template <typename U>
	Modular(const U& x) {
		value = normalize(x);
	}

	template <typename U>
	static Type normalize(const U& x) {
		Type v;
		if (-mod() <= x && x < mod()) v = static_cast<Type>(x);
		else v = static_cast<Type>(x % mod());
		if (v < 0) v += mod();
		return v;
	}

	const Type& operator()() const { return value; }
	template <typename U>
	explicit operator U() const { return static_cast<U>(value); }
	constexpr static Type mod() { return T::value; }

	Modular& operator+=(const Modular& other) { if ((value += other.value) >= mod()) value -= mod(); return *this; }
	Modular& operator-=(const Modular& other) { if ((value -= other.value) < 0) value += mod(); return *this; }
	template <typename U> Modular& operator+=(const U& other) { return *this += Modular(other); }
	template <typename U> Modular& operator-=(const U& other) { return *this -= Modular(other); }
	Modular& operator++() { return *this += 1; }
	Modular& operator--() { return *this -= 1; }
	Modular operator++(int) { Modular result(*this); *this += 1; return result; }
	Modular operator--(int) { Modular result(*this); *this -= 1; return result; }
	Modular operator-() const { return Modular(-value); }

	template <typename U = T>
	typename enable_if<is_same<typename Modular<U>::Type, int>::value, Modular>::type& operator*=(const Modular& rhs) {
		value = normalize(static_cast<int64_t>(value) * static_cast<int64_t>(rhs.value));
		return *this;
	}
	template <typename U = T>
	typename enable_if<is_same<typename Modular<U>::Type, int64_t>::value, Modular>::type& operator*=(const Modular& rhs) {
		int64_t q = static_cast<int64_t>(static_cast<long ld>(value) * rhs.value / mod());
		value = normalize(value * rhs.value - q * mod());
		return *this;
	}
	template <typename U = T>
	typename enable_if<!is_integral<typename Modular<U>::Type>::value, Modular>::type& operator*=(const Modular& rhs) {
		value = normalize(value * rhs.value);
		return *this;
	}

	Modular& operator/=(const Modular& other) { return *this *= Modular(inverse(other.value, mod())); }

	template <typename U>
	friend const Modular<U>& abs(const Modular<U>& v) { return v; }

	template <typename U>
	friend bool operator==(const Modular<U>& lhs, const Modular<U>& rhs);

	template <typename U>
	friend bool operator<(const Modular<U>& lhs, const Modular<U>& rhs);

	template <typename U>
	friend std::istream& operator>>(std::istream& stream, Modular<U>& number);

private:
	Type value;
};

template <typename T> bool operator==(const Modular<T>& lhs, const Modular<T>& rhs) { return lhs.value == rhs.value; }
template <typename T, typename U> bool operator==(const Modular<T>& lhs, U rhs) { return lhs == Modular<T>(rhs); }
template <typename T, typename U> bool operator==(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) == rhs; }

template <typename T> bool operator!=(const Modular<T>& lhs, const Modular<T>& rhs) { return !(lhs == rhs); }
template <typename T, typename U> bool operator!=(const Modular<T>& lhs, U rhs) { return !(lhs == rhs); }
template <typename T, typename U> bool operator!=(U lhs, const Modular<T>& rhs) { return !(lhs == rhs); }

template <typename T> bool operator<(const Modular<T>& lhs, const Modular<T>& rhs) { return lhs.value < rhs.value; }

template <typename T> Modular<T> operator+(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) += rhs; }
template <typename T, typename U> Modular<T> operator+(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) += rhs; }
template <typename T, typename U> Modular<T> operator+(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) += rhs; }

template <typename T> Modular<T> operator-(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) -= rhs; }
template <typename T, typename U> Modular<T> operator-(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) -= rhs; }
template <typename T, typename U> Modular<T> operator-(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) -= rhs; }

template <typename T> Modular<T> operator*(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) *= rhs; }
template <typename T, typename U> Modular<T> operator*(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) *= rhs; }
template <typename T, typename U> Modular<T> operator*(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) *= rhs; }

template <typename T> Modular<T> operator/(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) /= rhs; }
template <typename T, typename U> Modular<T> operator/(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) /= rhs; }
template <typename T, typename U> Modular<T> operator/(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) /= rhs; }

template<typename T, typename U>
Modular<T> power(const Modular<T>& a, const U& b) {
	assert(b >= 0);
	Modular<T> x = a, res = 1;
	U p = b;
	while (p > 0) {
		if (p & 1) res *= x;
		x *= x;
		p >>= 1;
	}
	return res;
}

template <typename T>
bool IsZero(const Modular<T>& number) {
	return number() == 0;
}

template <typename T>
string to_string(const Modular<T>& number) {
	return to_string(number());
}

template <typename T>
std::ostream& operator<<(std::ostream& stream, const Modular<T>& number) {
	return stream << number();
}

template <typename T>
std::istream& operator>>(std::istream& stream, Modular<T>& number) {
	typename common_type<typename Modular<T>::Type, int64_t>::type x;
	stream >> x;
	number.value = Modular<T>::normalize(x);
	return stream;
}

/*
using ModType = int;

struct VarMod { static ModType value; };
ModType VarMod::value;
ModType& md = VarMod::value;
using Mint = Modular<VarMod>;
*/

constexpr int md = 998244353;
using Mint = Modular<std::integral_constant<decay<decltype(md)>::type, md>>;

vector<Mint> fact(1, 1);
vector<Mint> inv_fact(1, 1);

Mint C(int n, int k) {
	if (k < 0 || k > n) {
		return 0;
	}
	while ((int)fact.size() < n + 1) {
		fact.push_back(fact.back() * (int)fact.size());
		inv_fact.push_back(1 / fact.back());
	}
	return fact[n] * inv_fact[k] * inv_fact[n - k];
}
#define mp make_pair
#define pb push_back
#define fi first
#define se second 
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define out(x) cout<<x<<'\n'

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pair<int, int> > vpii;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
typedef vector<ll> vll;
#define pii pair<int,int>

int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int dx8[8] = { 0,0,-1,1,-1,1,-1,1 };
int dy8[8] = { -1,1,0,0,-1,1,1,-1 };

#include "cyberland.h"

struct dsu{
	vector<int> par,sz;
	int total_groups;
	void init(int n){
		par.resize(n); sz.resize(n);
		for(int i=0;i<n;i++){
			par[i]=i;
			sz[i]=1;
		}
	}
	int find(int x){
		if(par[x]==x) return x;
		else return par[x]=find(par[x]);
	}
	void unite(int x, int y) {
		x = find(x);
		y = find(y);
		if (x == y) return;
		if (sz[x] < sz[y]) swap(x, y);
		par[y] = x;
		sz[x] += sz[y];
		total_groups--;
	}
	bool same(int x,int y){
		x = find(x);
		y = find(y);
		if(x==y) return true;
		else return false;
	}
};
#defeint ld long double
double solve(int N, int M, int K, int H, vi fir, vi sec, vi co, vi arr) {
	vector<vpii> g(N);
	dsu ds; ds.init(N);
	for(int i=0;i<M;i++){
		if(fir[i]!=H && sec[i]!=H) ds.unite(fir[i],sec[i]);
		g[fir[i]].pb(mp(co[i],sec[i]));
		g[sec[i]].pb(mp(co[i],fir[i]));
	}
	vector<ld> pwr(K+1,1);
	for(int i=1;i<=K;i++){
		pwr[i]=pwr[i-1]/2;
	}
	arr[0]=0;
	vector<vector<ld>> dist(K+1,vector<ld>(N,1e18));
	using node=tuple<ld,int,int>;
	priority_queue<node,vector<node>,greater<node>> pq;
	auto enq=[&](int k,int x,ld d){
		if(dist[k][x]>d){
			dist[k][x]=d;
			pq.push({d,k,x});
		}
	};
	enq(K,H,0);
	while(pq.size()){
		auto [d,k,x]=pq.top(); pq.pop();
		if (dist[k][x] < d) continue;
		if (arr[x] == 0) return (double)d;
		for(auto&[c,v]:g[x]){
			if(ds.find(v)!=ds.find(0)) continue;
			enq(k,v,d+c*pwr[K-k]);
			if(arr[x]==2 && k>0) enq(k-1,v,d+c*pwr[K-k+1]);
		}
	}
	return (double)-1;
}

Compilation message

cyberland.cpp:231:2: error: invalid preprocessing directive #defeint; did you mean #define?
  231 | #defeint ld long double
      |  ^~~~~~~
      |  define
cyberland.cpp: In member function 'typename std::enable_if<std::is_same<typename Modular<U>::Type, long int>::value, Modular<T> >::type& Modular<T>::operator*=(const Modular<T>&)':
cyberland.cpp:60:53: error: expected '>' before 'ld'
   60 |   int64_t q = static_cast<int64_t>(static_cast<long ld>(value) * rhs.value / mod());
      |                                                     ^~
cyberland.cpp:60:53: error: expected '(' before 'ld'
   60 |   int64_t q = static_cast<int64_t>(static_cast<long ld>(value) * rhs.value / mod());
      |                                                     ^~
      |                                                     (
cyberland.cpp:60:53: error: 'ld' was not declared in this scope
   60 |   int64_t q = static_cast<int64_t>(static_cast<long ld>(value) * rhs.value / mod());
      |                                                     ^~
cyberland.cpp:60:84: error: expected ')' before ';' token
   60 |   int64_t q = static_cast<int64_t>(static_cast<long ld>(value) * rhs.value / mod());
      |                                                                                    ^
      |                                                                                    )
cyberland.cpp: In function 'double solve(int, int, int, int, vi, vi, vi, vi)':
cyberland.cpp:240:9: error: 'ld' was not declared in this scope; did you mean 'll'?
  240 |  vector<ld> pwr(K+1,1);
      |         ^~
      |         ll
cyberland.cpp:240:11: error: template argument 1 is invalid
  240 |  vector<ld> pwr(K+1,1);
      |           ^
cyberland.cpp:240:11: error: template argument 2 is invalid
cyberland.cpp:240:22: error: expression list treated as compound expression in initializer [-fpermissive]
  240 |  vector<ld> pwr(K+1,1);
      |                      ^
cyberland.cpp:240:18: warning: left operand of comma operator has no effect [-Wunused-value]
  240 |  vector<ld> pwr(K+1,1);
      |                 ~^~
cyberland.cpp:242:6: error: invalid types 'int[int]' for array subscript
  242 |   pwr[i]=pwr[i-1]/2;
      |      ^
cyberland.cpp:242:13: error: invalid types 'int[int]' for array subscript
  242 |   pwr[i]=pwr[i-1]/2;
      |             ^
cyberland.cpp:245:16: error: template argument 2 is invalid
  245 |  vector<vector<ld>> dist(K+1,vector<ld>(N,1e18));
      |                ^~
cyberland.cpp:245:18: error: template argument 1 is invalid
  245 |  vector<vector<ld>> dist(K+1,vector<ld>(N,1e18));
      |                  ^~
cyberland.cpp:245:18: error: template argument 2 is invalid
cyberland.cpp:245:39: error: template argument 2 is invalid
  245 |  vector<vector<ld>> dist(K+1,vector<ld>(N,1e18));
      |                                       ^
cyberland.cpp:245:48: error: expression list treated as compound expression in initializer [-fpermissive]
  245 |  vector<vector<ld>> dist(K+1,vector<ld>(N,1e18));
      |                                                ^
cyberland.cpp:247:17: error: 'node' was not declared in this scope
  247 |  priority_queue<node,vector<node>,greater<node>> pq;
      |                 ^~~~
cyberland.cpp:247:33: error: template argument 2 is invalid
  247 |  priority_queue<node,vector<node>,greater<node>> pq;
      |                                 ^
cyberland.cpp:247:47: error: template argument 1 is invalid
  247 |  priority_queue<node,vector<node>,greater<node>> pq;
      |                                               ^~
cyberland.cpp:247:47: error: template argument 2 is invalid
cyberland.cpp:247:47: error: template argument 3 is invalid
cyberland.cpp:248:27: error: 'ld' is not a type
  248 |  auto enq=[&](int k,int x,ld d){
      |                           ^~
cyberland.cpp: In lambda function:
cyberland.cpp:249:10: error: invalid types 'int[int]' for array subscript
  249 |   if(dist[k][x]>d){
      |          ^
cyberland.cpp:250:8: error: invalid types 'int[int]' for array subscript
  250 |    dist[k][x]=d;
      |        ^
cyberland.cpp:251:7: error: request for member 'push' in 'pq', which is of non-class type 'int'
  251 |    pq.push({d,k,x});
      |       ^~~~
cyberland.cpp: In function 'double solve(int, int, int, int, vi, vi, vi, vi)':
cyberland.cpp:255:11: error: request for member 'size' in 'pq', which is of non-class type 'int'
  255 |  while(pq.size()){
      |           ^~~~
cyberland.cpp:256:19: error: request for member 'top' in 'pq', which is of non-class type 'int'
  256 |   auto [d,k,x]=pq.top(); pq.pop();
      |                   ^~~
cyberland.cpp:256:29: error: request for member 'pop' in 'pq', which is of non-class type 'int'
  256 |   auto [d,k,x]=pq.top(); pq.pop();
      |                             ^~~