QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#96953#2918. Tree Number Generatormegz112233WA 1ms5764kbC++144.8kb2023-04-16 08:59:452023-04-16 08:59:47

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-16 08:59:47]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5764kb
  • [2023-04-16 08:59:45]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define all(v)  v.begin(),v.end()
#define sz(x)  (int) (x).size()
#define el '\n'
#define Megz ios::sync_with_stdio(0);cin.tie(0);ios_base::sync_with_stdio(0);
using namespace std;
 int mod = 1e9 + 7, N = 1e6+5;
ll const inf = 1e18;
int  binpow (int x  , int y ){
    int res = 1 ;
    while (y){
        if (y%2)res= ((res)%mod * (x)%mod) %mod ;
        x=((x)%mod*(x)%mod)%mod ;
        y/=2 ;
    }
    return res%mod ;
}
int mul  (int x , int y ){
    x%=mod  ;
    y%=mod  ;
    return 1ll* (x*y)%mod;
}
int plu  (int x , int y ){
    x%=mod  ;
    y%=mod  ;
    return 1ll* (x+y)%mod;
}
struct vertex {
    int anc ,  up  ,  down   ;
};
struct lca {
    vector<vector<vertex>>  yup_lifting ;
    vector<int> depth   ;
    vector<int> adj[100005] ;
    vector<int> val  ;
    vector<int> pow  ;
    const  int   LOG  =  19 ;
    int get_down (int x) {
        string s  = to_string(x) ;
        reverse(all(s)) ;
        x = stoi(s) ;
        return x ;
    }
    void init (int n ){
            depth.assign(n+5, 0) ;
            val.assign(n+5,0) ;
            yup_lifting.assign(n+5,  vector<vertex>(LOG, {0,0,0})) ;
            for (int i =0 ;  i< LOG ; i++){
                pow.push_back(binpow(10,(1<<i))) ;
            }
    }
    void dfs (int node , int par ){
        yup_lifting[1][0] =  {par, val[1],  val[1]};
           for (auto child  :  adj[node]){
                if (child == par)continue;
                depth[child] =  depth[node]+1 ;
              //  cout <<child<<" "<<depth[child]<<el ;
                yup_lifting[child][0] =  {node, val[child],  val[child]};
                for (int i =1 ; i < LOG ;i++){
                    yup_lifting[child][i].anc =  yup_lifting[yup_lifting[child][i-1].anc][i-1].anc ;
                    yup_lifting[child][i].up = plu(mul (yup_lifting[child][i-1].up , pow[i-1]) , yup_lifting[yup_lifting[child][i-1].anc][i-1].up ) ;
                    yup_lifting[child][i].down = plu(mul  (yup_lifting[yup_lifting[child][i-1].anc][i-1].down ,  pow[i-1]) , yup_lifting[child][i-1].down)  ;
//           cout <<i <<" " <<child<<" " <<yup_lifting[child][i-1].anc<<" " <<yup_lifting[child][i-1].up<<" " <<yup_lifting[child][i-1].down<<el ;
                }

               dfs(child, node) ;
           }
    }
    vertex go_up (int k  ,  int  node  ){
         vertex curr =  {node , 0,0} ;
         int cnt = 0 ;
         for (int i =0 ; i < LOG  ; i++){
             if (k&(1<<i)){
                 curr.up = plu(mul(curr.up , pow[i]) , yup_lifting[curr.anc][i].up) ;
                 curr.down = plu(mul  (yup_lifting[curr.anc][i].down , binpow(10,cnt)) , curr.down)  ;
                // cout<<k << " " <<i<<" " <<curr.down<< "hahahahha" <<el ;
                 cnt+=(1<<i) ;
                 curr.anc = yup_lifting[curr.anc][i].anc ;
             }
         }
        return curr ;
    }
    int get_lca (int a ,  int b){
        if (depth[a]<depth[b])swap(a,b) ;
        int k =  depth[a]-depth[b] ;
          a  = go_up(k ,  a).anc ;
          if (a==b){
              return a  ;
          }
         for (int i = LOG -1  ; i>=0  ; i--){
             if (yup_lifting[a][i].anc!=yup_lifting[b][i].anc){
                 a = go_up((1<<i) , a) .anc;
                 b = go_up((1<<i) , b).anc ;
             }
         }
        return go_up(1,a).anc ;
    }
    int get_query (int from ,int to){
        int lca  = get_lca(from ,  to ) ;
        if (lca==from){
         //   cout<<lca  <<" " <<from  << " " <<to  <<" " <<depth[from]<<" "<<depth[to] <<el;
             vertex  ans  = go_up(depth[to]-depth[from]+1 ,  to) ;
            return ans.down ;
        }
        else if (lca==to){

            vertex  ans  = go_up(depth[from]-depth[to]+1 ,  from) ;
            return ans.up ;
        }
        else {
            int left  = go_up(depth[from]-depth[lca]+1 , from).up , right  = go_up((depth[to]-depth[lca]) , to).down ;
            return plu(mul(left , binpow(10, depth[lca]-depth[to]) ),  right) ;
        }
    }


} lca;
void acc() {
    int n , q ;cin >>n>>mod >>q ;
   mod  = 100 ;
    lca.init(n+5) ;
    for (int  i =0 ; i < n-1; i++){
        int x , y ;cin>>x>>y ;
        x%=mod ;
        y%=mod ;
        lca.adj[x].push_back(y) ;
        lca.adj[y].push_back(x) ;
    }

    for (int i =1 ; i<=n ; i++){
        cin >>lca.val[i] ;
    }
    lca.dfs(1, 0) ;
    lca.go_up(5,3)  ;
  //  cout <<" -----" <<el ;
    while (q--){
        int from ,  to ;cin >>from >>to ;
        cout <<lca.get_query(from  ,to)<<el ;
      //  cout <<"-----"<<el ;
    }
}

int main() {
    Megz
    int t = 1;
   // cin >>t;
    while (t--) {
        acc();
    }

}


//5 100 4
//1 2
//1 3
//1 4
//5 3
//1
//2
//3
//0
//4
//1 5
//5 1
//4 2
//3 3

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 5764kb

input:

2 1 4
1 2
1
3
1 2
2 1
1 1
2 2

output:

13
31
1
3

result:

wrong answer 1st lines differ - expected: '0', found: '13'