結果
| 問題 |
No.899 γatheree
|
| コンテスト | |
| ユーザー |
leaf_1415
|
| 提出日時 | 2019-10-05 04:19:57 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,726 bytes |
| コンパイル時間 | 943 ms |
| コンパイル使用メモリ | 79,192 KB |
| 実行使用メモリ | 19,060 KB |
| 最終ジャッジ日時 | 2024-10-04 13:02:01 |
| 合計ジャッジ時間 | 8,472 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 3 WA * 20 |
ソースコード
#include <iostream>
#include <vector>
#include <queue>
#define llint long long
#define inf 1e18
using namespace std;
// range-add, range-min query
struct SegTree{
int size;
vector<llint> seg, delay;
SegTree(){}
SegTree(int size){
this->size = size;
seg.resize(1<<(size+1));
delay.resize(1<<(size+1));
}
void init()
{
for(int i = 0; i < (1<<(size+1)); i++){
seg[i] = 0;
delay[i] = -1;
}
}
void eval(int l, int r, int k)
{
if(delay[k] >= 0){
seg[k] = delay[k] * (r-l+1); //総和クエリのときは区間幅を乗じる必要がある
if(l < r){
delay[k*2] = delay[k];
delay[k*2+1] = delay[k];
}
delay[k] = -1;
}
}
void update(int i, llint val)
{
i += (1 << size);
seg[i] = val;
while(i > 1){
i /= 2;
seg[i] = (seg[i*2] + seg[i*2+1]);
}
}
void add(int a, int b, int k, int l, int r, llint val)
{
eval(l, r, k);
if(b < l || r < a) return;
if(a <= l && r <= b){
delay[k] = val;
eval(l, r, k);
return;
}
add(a, b, k*2, l, (l+r)/2, val);
add(a, b, k*2+1, (l+r)/2+1, r, val);
seg[k] = (seg[k*2] + seg[k*2+1]);
}
void add(int a, int b, llint val){
if(a > b) return;
add(a, b, 1, 0, (1<<size)-1, val);
}
llint query(int a, int b, int k, int l, int r)
{
eval(l, r, k);
if(b < l || r < a) return 0;
if(a <= l && r <= b) return seg[k];
llint lval = query(a, b, k*2, l, (l+r)/2);
llint rval = query(a, b, k*2+1, (l+r)/2+1, r);
return (lval + rval);
}
llint query(int a, int b)
{
return query(a, b, 1, 0, (1<<size)-1);
}
};
llint n, m;
vector<llint> G[100005];
llint a[100005];
llint parent[100005], order[100005];
llint l[100005], r[100005], l2[100005], r2[100005];
queue<llint> Q;
SegTree seg(17);
void bfs()
{
llint id = 1;
order[1] = id++, parent[1] = -1;
Q.push(1);
llint v;
while(Q.size()){
v = Q.front();
Q.pop();
l[v] = id;
bool flag = false;
for(int i = 0; i < G[v].size(); i++){
if(order[G[v][i]]) continue;
flag = true;
order[G[v][i]] = id++;
parent[G[v][i]] = v;
Q.push(G[v][i]);
}
r[v] = id-1;
if(!flag) l[v] = r[v] = 0;
}
}
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
llint u, v;
for(int i = 1; i <= n-1; i++){
cin >> u >> v;
u++, v++;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i = 1; i <= n; i++) cin >> a[i];
bfs();
for(int i = 1; i <= n; i++){
for(int j = 0; j < G[i].size(); j++){
if(G[i][j] == parent[i]){
G[i].erase(G[i].begin() + j);
break;
}
}
}
for(int i = 1; i <= n; i++){
if(G[i].size()){
l2[i] = l[G[i].front()];
r2[i] = r[G[i].back()];
}
}
seg.init();
for(int i = 1; i <= n; i++) seg.update(order[i], a[i]);
//for(int i = 1; i <= n; i++) cout << seg.query(i, i) << " "; cout << endl;
//for(int i = 1; i <= n; i++) cout << order[i] << " " << l[i] << " " << r[i] << " " << l2[i] << " " << r2[i] << endl;
cin >> m;
llint x;
for(int q = 0; q < m; q++){
cin >> x;
x++;
llint sum = 0;
if(l[x] > 0) sum += seg.query(l[x], r[x]);
if(l2[x] > 0) sum += seg.query(l2[x], r2[x]);
llint p = parent[x], pp;
if(p != -1){
sum += seg.query(order[p], order[p]);
if(l[p] > 0) sum += seg.query(l[p], r[p]);
pp = parent[p];
if(pp != -1) sum += seg.query(order[pp], order[pp]);
}
else sum += seg.query(order[x], order[x]);
if(l[x] > 0) seg.add(l[x], r[x], 0);
if(l2[x] > 0) seg.add(l2[x], r2[x], 0);
if(p != -1){
seg.add(order[p], order[p], 0);
if(l[p] > 0) seg.add(l[p], r[p], 0);
if(pp != -1) seg.add(order[pp], order[pp], 0);
}
seg.add(order[x], order[x], sum);
cout << sum << "\n";
//for(int i = 1; i <= n; i++) cout << seg.query(i, i) << " "; cout << endl;
}
flush(cout);
return 0;
}
leaf_1415