結果
| 問題 | No.1197 モンスターショー |
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2020-08-22 15:36:49 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,524 bytes |
| 記録 | |
| コンパイル時間 | 4,044 ms |
| コンパイル使用メモリ | 213,652 KB |
| 最終ジャッジ日時 | 2025-01-13 09:44:12 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 TLE * 15 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:129:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
129 | scanf("%d",&pos[i]);
| ~~~~~^~~~~~~~~~~~~~
main.cpp:137:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
137 | scanf("%d %d",&a,&b);
| ~~~~~^~~~~~~~~~~~~~~
main.cpp:171:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
171 | scanf("%d",&t);
| ~~~~~^~~~~~~~~
main.cpp:175:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
175 | scanf("%d %d",&p,&d);
| ~~~~~^~~~~~~~~~~~~~~
main.cpp:191:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
191 | scanf("%d",&e);
| ~~~~~^~~~~~~~~
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define modulo 998244353
#define mod(mod_x) ((((long long)mod_x+modulo))%modulo)
#define Inf 1000000005
struct lca{
vector<int> depth;//depth[i] 頂点iの深さ
vector<vector<int>> parents;//parents[i][j] 頂点iから2^j個上の親
int max_j = 30;
lca(int n,vector<vector<int>> &E){
depth.assign(E.size(),-1);
parents.assign(E.size(),vector<int>(max_j,-1));
stack<int> s;
s.push(n);
depth[n] = 0;
while(s.size()!=0){
int k = s.top();
s.pop();
for(int i=0;i<E[k].size();i++){
int x = E[k][i];
if(depth[x]!=-1)continue;
s.push(x);
depth[x] = depth[k]+1;
for(int j=0;j<max_j;j++){
if(j==0){
parents[x][j] = k;
}
else{
parents[x][j] = parents[parents[x][j-1]][j-1];
}
if(parents[x][j] == -1)break;
}
}
}
}
//頂点uのk番目の親
int kth_parent(int u,int k){
for(int i=0;i<max_j;i++){
if(k==0)break;
if(u==-1)break;
if(k%2){
u = parents[u][i];
}
k/=2;
}
return u;
}
int query(int u,int v){
if(depth[u]<depth[v])swap(u,v);
u = kth_parent(u,depth[u]-depth[v]);
if(u==v){
return u;
}
for(int i=max_j-1;i>=0;i--){
if(parents[u][i]!=parents[v][i]){
u = parents[u][i];
v = parents[v][i];
}
}
return parents[u][0];
}
int get_distance(int u,int v){
return depth[u]+depth[v]-2*depth[query(u,v)];
}
};
int N,K,Q;
vector<int> dis;
vector<long long> calc;
vector<int> cnt;
vector<int> C;
void dfs(vector<vector<int>> &E,int now,int p){
cnt[now] = C[now];
for(int i=0;i<E[now].size();i++){
dfs(E,E[now][i],now);
cnt[now] += cnt[E[now][i]];
}
}
void dfs2(vector<vector<int>> &E,int now,int p){
if(p==-1){
calc[now] = 0;
for(int i=0;i<N;i++){
calc[now] += (long long)dis[i] * C[i];
}
}
else{
calc[now] = calc[p];
calc[now] -= cnt[now];
calc[now] += K-cnt[now];
}
for(int i=0;i<E[now].size();i++){
dfs2(E,E[now][i],now);
}
}
void Erasedfs(vector<vector<int>> &E,int now,int p){
vector<int> t;
for(int i=0;i<E[now].size();i++){
if(E[now][i]==p)continue;
t.push_back(E[now][i]);
Erasedfs(E,E[now][i],now);
}
E[now] = t;
}
int main(){
cin>>N>>K>>Q;
C.resize(N,0);
vector<int> pos(K);
for(int i=0;i<K;i++){
scanf("%d",&pos[i]);
pos[i]--;
C[pos[i]]++;
}
vector<vector<int>> E(N);
for(int i=0;i<N-1;i++){
int a,b;
scanf("%d %d",&a,&b);
a--;b--;
E[a].push_back(b);
E[b].push_back(a);
}
lca L(0,E);
dis.resize(N);
for(int i=0;i<N;i++){
dis[i] = L.get_distance(0,i);
}
Erasedfs(E,0,-1);
calc.resize(N);
cnt.resize(N);
dfs(E,0,-1);
dfs2(E,0,-1);
vector<pair<int,int>> Movement;
for(int i=0;i<Q;i++){
if(Movement.size()>100){
for(int j=0;j<Movement.size();j++){
C[pos[Movement[j].first]]--;
pos[Movement[j].first] = Movement[j].second;
C[pos[Movement[j].first]]++;
}
Movement.resize(0);
dfs(E,0,-1);
dfs2(E,0,-1);
}
int t;
scanf("%d",&t);
if(t==1){
int p,d;
scanf("%d %d",&p,&d);
p--;d--;
bool f = false;
for(int j=0;j<Movement.size();j++){
if(Movement[j].first==p){
Movement[j].second = d;
f=true;
break;
}
}
if(!f)Movement.emplace_back(p,d);
}
else{
int e;
scanf("%d",&e);
e--;
long long ans = calc[e];
for(int j=0;j<Movement.size();j++){
ans -= L.get_distance(e,pos[Movement[j].first]);
ans += L.get_distance(e,Movement[j].second);
}
printf("%lld\n",ans);
}
}
return 0;
}
沙耶花