結果

問題 No.399 動的な領主
ユーザー tempura_pptempura_pp
提出日時 2018-08-14 01:23:37
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 3,323 bytes
コンパイル時間 974 ms
コンパイル使用メモリ 100,616 KB
実行使用メモリ 84,864 KB
最終ジャッジ日時 2024-09-24 08:29:04
合計ジャッジ時間 3,439 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:143:13: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  143 |        scanf("%d%d",&x,&y);
      |        ~~~~~^~~~~~~~~~~~~~
main.cpp:151:13: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  151 |        scanf("%d%d",&x,&y);
      |        ~~~~~^~~~~~~~~~~~~~

ソースコード

diff #

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<complex>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
using namespace std;
#define REP(i,m,n) for(int i=(int)m ; i < (int) n ; ++i )
#define rep(i,n) REP(i,0,n)
typedef long long ll;
typedef pair<int,int> pint;
typedef pair<ll,int> pli;
const int inf=1e9+7;
const ll longinf=1LL<<60 ;
const ll mod=1e9+7 ;
int dx[4]={1,0,-1,0} , dy[4]={0,1,0,-1} ;


struct BIT{
private:
   int sz;
   vector<ll> node;
public:
   BIT(int n):sz(n),node(n+1){};
   void add(int k,ll x){
       k++;
       while(k<=sz){
           node[k]+=x;
           k+=k&-k;
       }
   }
   ll sum(int k){
       k++;
       ll ret=0;
       while(k>0){
           ret+=node[k];
           k-=k&-k;
       }
       return ret;
   }
   ll sum(int l,int r){
       return sum(r-1)-sum(l-1);
   }
   ll get(int k){
       return sum(k,k+1);
   }
};

BIT bit(101010);
struct HLDecomposition{
    int n,pos;
    vector<vector<int>> v;
    vector<int> idx,head,sz,hvy,par,depth,inv,type;

    HLDecomposition(){};
    HLDecomposition(int s):
        n(s),pos(0),v(n),idx(n,-1),head(n),sz(n,1),
        hvy(n,-1),par(n),depth(n),inv(n),type(n){}
    
    void addedge(int x,int y){
        v[x].push_back(y);
        v[y].push_back(x);
    }

    void dfs(int x,int p,int d){
        stack<int> st;
        par[x]=p;
        depth[x]=d;
        int res=0;
        for(int to:v[x]){
            if(to==par[x])continue;
            dfs(to,x,d+1);
            sz[x]+=sz[to];
            if(sz[to]>res)res=sz[to],hvy[x]=to;
        }
    }

    void bfs(int r,int c){
        int &k=pos;
        queue<int> q;
        q.push(r);
        while(!q.empty()){
            int h=q.front();q.pop();
            for(int x=h;x!=-1;x=hvy[x]){
                type[x]=c;
                head[x]=h;
                idx[x]=k++;
                inv[idx[x]]=x;
                for(int to:v[x])
                    if(to!=par[x]&&to!=hvy[x])q.push(to);
            }
        }
    }

    void build(vector<int> rs=vector<int>(1,0)){
        int c=0;
        for(int r:rs){
            dfs(r,-1,0);
            bfs(r,c++);
        }
    }
    void f(int x,int y){
        //ここに何か書く!!!
        bit.add(x,1);
        bit.add(y+1,-1);
    }

    void for_v(int x,int y){
        while(1){
            if(idx[x]>idx[y])swap(x,y);
            f(max(idx[head[y]],idx[x]),idx[y]);
            if(head[x]!=head[y])y=par[head[y]];
            else break;
        }
    }

    void for_edge(int x,int y){
        while(1){
            if(idx[x]>idx[y])swap(x,y);
            if(head[x]!=head[y]){
                f(idx[head[y]],idx[y]);
                y=par[head[y]];
            }
            else{
                if(x!=y)f(idx[x]+1,idx[y]);
                break;
            }
        }
    }
};
int main(){
   int n;cin>>n;
   HLDecomposition hl(n);
   rep(i,n-1){
       int x,y;
       scanf("%d%d",&x,&y);
       hl.addedge(x-1, y-1);
   }
   hl.build();
   int q;cin>>q;
   cout<<q<<endl;
   rep(i,q){
       int x,y;
       scanf("%d%d",&x,&y);
       hl.for_v(x-1,y-1);
   }
   ll ans=0;
   rep(i,n){
       ll ret=bit.sum(i);
       ans+=ret*(ret+1)/2;
   }
   cout<<ans<<endl;
   return 0;
}
0