/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 4ms 580.0 KiB
#2 Accepted 4ms 608.0 KiB
#3 Accepted 27ms 3.324 MiB
#4 Accepted 27ms 3.301 MiB
#5 Accepted 20ms 3.328 MiB
#6 Accepted 22ms 3.312 MiB
#7 Accepted 411ms 19.219 MiB
#8 Accepted 396ms 19.086 MiB
#9 Accepted 393ms 19.223 MiB
#10 Accepted 390ms 19.105 MiB
#11 Accepted 398ms 19.184 MiB
#12 Accepted 409ms 19.102 MiB
#13 Accepted 413ms 19.172 MiB
#14 Accepted 144ms 27.328 MiB
#15 Accepted 147ms 27.434 MiB
#16 Accepted 148ms 27.391 MiB

Code

#include <bits/stdc++.h>
using namespace std;
#define SC               scanf
#define PF               printf
#define ull              unsigned long long
#define ld               long double
#define F                first
#define S                second
#define pb               push_back
#define sort_a(a)        sort(a.begin(),a.end());
#define sort_d(a)        sort(a.rbegin(),a.rend());
#define READ(f)          freopen(f, "r", stdin)
#define WRITE(f)         freopen(f, "w", stdout)
#define rev(s)           reverse(s.begin(),s.end())
#define P(ok)            cout << (ok ? "YES\n": "NO\n")
#define __Heart__              ios_base :: sync_with_stdio(false); cin.tie(NULL);
#define ll long long
typedef pair< ll , ll>                   PII;
const int sz = 2e5 + 5 ;
int Light[sz] , st[sz] , en[sz] , a[sz] , Time ;
vector < int > Edge[sz] ;
void dfs(int id , int par) {

   st[id] = ++Time ;
   Light[Time] = a[id] ;
   for(auto child : Edge[id]){
    if(child != par) dfs(child , id) ;
   }
   en[id] = Time ;

}

struct info {
    int prop, sum;
} Tree[sz * 3];
void init(int node, int b, int e) {
    if (b == e) {
        Tree[node].sum = Light[b];
        return;
    }

    int Left = node << 1;
    int Right = (node << 1) + 1;
    int Mid = (b + e) >> 1;

    init(Left, b, Mid);
    init(Right, Mid + 1, e);
    Tree[node].sum = Tree[Left].sum + Tree[Right].sum;
}

void Update(int node, int b, int e, int i, int j) {
    if (i > e || j < b) return;
    if (b >= i && e <= j) {
        Tree[node].sum = ((e - b + 1)) - Tree[node].sum;
        Tree[node].prop ^= 1;
        return;
    }

    int Left = node << 1;
    int Right = (node << 1) + 1;
    int Mid = (b + e) >> 1;

    if( Tree[node].prop) {
        Update(Left, b, Mid, b, Mid);
        Update(Right, Mid + 1, e, Mid + 1, e);
        Tree[node].prop = 0;
        Tree[node].sum = Tree[Left].sum + Tree[Right].sum ;
    }
    Update(Left, b, Mid, i, j);
    Update(Right, Mid + 1, e, i, j);
    Tree[node].sum = Tree[Left].sum + Tree[Right].sum ;

}


int Query(int node, int b, int e, int i, int j) {
    if (i > e || j < b) return 0;
    if (b >= i and e <= j) return Tree[node].sum ;

    int Left = node << 1;
    int Right = (node << 1) + 1;
    int Mid = (b + e) >> 1;

    if( Tree[node].prop) {
        Update(Left, b, Mid, b, Mid);
        Update(Right, Mid + 1, e, Mid + 1, e);
        Tree[node].prop = 0;
        Tree[node].sum = Tree[Left].sum + Tree[Right].sum ;
    }

    int p1 = Query(Left, b, Mid, i, j);
    int p2 = Query(Right, Mid + 1, e, i, j);

    return p1 + p2;
}

void solve()
{
   int n , u , v , k ,ty , q;  cin >> n ;
   for(int i = 1 ; i <= n ; i++) cin >> a[i] ;
   for(int i = 0 ; i < n - 1 ; i++){
    cin >> u >> v ;
    Edge[u].pb(v) ;
    Edge[v].pb(u) ;
   }

   dfs(1 , -1) ;
   init(1 , 1 , Time) ;
   cin >> q ;
   while(q--){
    cin >> ty >> k ;
    if(ty == 2) cout << Query(1 , 1 , Time , st[k] , en[k]) << endl;
    else Update(1 , 1 , Time , st[k] , en[k]) ;
   }

}
int main()
{
     __Heart__
     //READ("input0.txt");
     //WRITE("output0.txt") ;
     int t ; t = 1 ; while(t--) solve() ;
}

Information

Submit By
Type
Submission
Problem
P1101 Mr. Heart and the Enchanted Lights
Language
C++20 (G++ 13.2.0)
Submit At
2024-09-20 04:13:59
Judged At
2024-10-03 12:55:55
Judged By
Score
100
Total Time
413ms
Peak Memory
27.434 MiB