結果
| 問題 |
No.1103 Directed Length Sum
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-07-03 21:56:23 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,706 bytes |
| コンパイル時間 | 2,062 ms |
| コンパイル使用メモリ | 205,912 KB |
| 最終ジャッジ日時 | 2025-01-11 14:36:06 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 WA * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long int llint;
typedef unsigned long long int ullint;
std::string YesNo[] = {"No","Yes"};
#define loop(i,N) for(int i=0; i<(N); i++)
template<typename T>
auto sort_all(T& v) { return std::sort(v.begin(),v.end()); }
template<typename T>
auto sum_all(const T& v) { auto z = v[0]; z = 0;
return std::accumulate(v.begin(),v.end(),z); }
template<typename T>
auto input( std::size_t N,
const std::vector<T>& head={},
const std::vector<T>& tail={}) {
auto s = head.size();
auto t = tail.size();
std::vector<T> v;
v.reserve(s+N+t);
v.insert(v.end(), head.begin(), head.end());
v.resize(s+N);
loop(i,N) std::cin >> v[s+i];
v.insert(v.end(), tail.begin(), tail.end());
return std::move(v);
}
class range {
typedef int Int;
Int start, stop, step;
void initialize() {
auto sign = (step >= 0) ? 1 : -1;
stop = start + ((stop-start-sign)/step + 1) * step;
if ((stop-start) * step <= 0) stop = start;
}
public:
range(Int start, Int stop, Int step=1) : start(start), stop(stop), step(step) {
initialize();
}
range(Int stop) : start(0), stop(stop), step(1) { initialize(); }
struct iterator {
Int i, step;
Int& operator*() { return i; }
iterator& operator++() { i += step; return *this; }
bool operator!=(const iterator& v) { return i != v.i; }
};
iterator begin() { return {start, step}; }
iterator end() { return {stop, step}; }
};
template<typename T1, typename T2>
std::pair<T1,T2> operator-(const std::pair<T1,T2>& x)
{
return std::make_pair(-x.first, -x.second);
}
template<typename T1, typename T2>
std::pair<T1,T2> operator+(
const std::pair<T1,T2>& x,
const std::pair<T1,T2>& y)
{
return std::make_pair(x.first+y.first, x.second+y.second);
}
template<typename T1, typename T2>
std::pair<T1,T2> operator-(const std::pair<T1,T2>& x, const std::pair<T1,T2>& y)
{
return x + (-y);
}
template<typename T1, typename T2>
std::pair<T1,T2>& operator+=(std::pair<T1,T2>& x, const std::pair<T1,T2>& y)
{
x.first += y.first;
x.second += y.second;
return x;
}
template<typename T1, typename T2>
std::pair<T1,T2>& operator-=(std::pair<T1,T2>& x, const std::pair<T1,T2>& y)
{
return x += (-y);
}
template<typename T1, typename T2>
std::ostream& operator<<(std::ostream& cout, const std::pair<T1,T2>& data)
{
cout << "(" << data.first << ", " << data.second << ")";
return cout;
}
template<typename T>
std::ostream& operator<<(std::ostream& cout, const std::vector<T>& data)
{
cout << "[";
if (data.size() == 0) {}
else if (data.size() == 1) { cout << data[0]; }
else {
cout << data[0];
for (auto itr=data.begin()+1; itr!=data.end(); ++itr) {
cout << ", " << *itr;
}
}
cout << "]";
return cout;
}
typedef llint Int;
Int MOD = 1000000000 + 7;
int main(void)
{
Int N;
cin >> N;
auto children = vector<set<int>>(N);
auto parent = vector<int>(N,-1);
for (auto i : range(N-1)) {
int A, B;
cin >> A >> B;
A -= 1; B -= 1;
children[A].insert(B);
parent[B] = A;
}
auto root = distance(parent.begin(), find(parent.begin(),parent.end(),-1));
Int ans = 0;
vector<pair<int,int>> pool({{root,0}});
while (pool.size()) {
auto p = pool.back();
pool.pop_back();
auto node = p.first;
auto d = p.second;
ans += d * (d+1) / 2;
ans %= MOD;
for (auto c : children[node]) {
pool.push_back({c, d+1});
}
}
cout << ans << endl;
return 0;
}