Submission #248680

#TimeUsernameProblemLanguageResultExecution timeMemory
248680LawlietElection Campaign (JOI15_election_campaign)C++17
100 / 100
284 ms31616 KiB
#include <bits/stdc++.h> using namespace std; const int LOG = 20; const int MAXN = 100010; class FenwickTree { public: void update(int i, int v) { for( ; i > 0 ; i -= i & -i) BIT[i] += v; } int query(int i) { int ans = 0; for( ; i < MAXN ; i += i & -i) ans += BIT[i]; return ans; } void update(int L, int R, int v) { update( R , v ); update( L - 1 , -v ); } FenwickTree() { memset( BIT , 0 , sizeof(BIT) ); } private: int BIT[MAXN]; }; int n, m; int curTime; int depth[MAXN]; int tab[LOG][MAXN]; int dp[MAXN], f[MAXN]; int tin[MAXN], tout[MAXN]; int A[MAXN], B[MAXN], C[MAXN]; vector<int> adj[MAXN]; vector<int> groupLCA[MAXN]; FenwickTree sumDP, sumF; void DFSInit(int cur, int p) { tab[0][cur] = p; tin[cur] = ++curTime; depth[cur] = depth[p] + 1; for(int k = 1 ; k < LOG ; k++) tab[k][cur] = tab[k - 1][ tab[k - 1][cur] ]; for(int i = 0 ; i < (int)adj[cur].size() ; i++) if( adj[cur][i] != p ) DFSInit( adj[cur][i] , cur ); tout[cur] = curTime; } void DFSCalculate(int cur, int p) { for(int i = 0 ; i < (int)adj[cur].size() ; i++) { int viz = adj[cur][i]; if( viz == p ) continue; DFSCalculate( viz , cur ); f[cur] += dp[viz]; } dp[cur] = f[cur]; for(int i = 0 ; i < (int)groupLCA[cur].size() ; i++) { int ind = groupLCA[cur][i]; int curAns = C[ind] + f[cur]; curAns += sumF.query( tin[ A[ind] ] ) - sumDP.query( tin[ A[ind] ] ); curAns += sumF.query( tin[ B[ind] ] ) - sumDP.query( tin[ B[ind] ] ); dp[cur] = max( dp[cur] , curAns ); } sumF.update( tin[cur] , tout[cur] , f[cur] ); sumDP.update( tin[cur] , tout[cur] , dp[cur] ); } int LCA(int A, int B) { if( depth[A] < depth[B] ) swap( A , B ); int d = depth[A] - depth[B]; for(int k = 0 ; k < LOG ; k++) if( d & (1 << k) ) A = tab[k][A]; if( A == B ) return A; for(int k = LOG - 1 ; k >= 0 ; k--) { if( tab[k][A] != tab[k][B] ) { A = tab[k][A]; B = tab[k][B]; } } return tab[0][A]; } int main() { scanf("%d",&n); for(int i = 1 ; i < n ; i++) { int U, V; scanf("%d %d",&U,&V); adj[U].push_back( V ); adj[V].push_back( U ); } DFSInit( 1 , 1 ); scanf("%d",&m); for(int i = 1 ; i <= m ; i++) { scanf("%d %d %d",&A[i],&B[i],&C[i]); int L = LCA( A[i] , B[i] ); groupLCA[L].push_back( i ); } DFSCalculate( 1 , 1 ); printf("%d\n",dp[1]); }

Compilation message (stderr)

election_campaign.cpp: In function 'int main()':
election_campaign.cpp:124:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
election_campaign.cpp:129:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&U,&V);
   ~~~~~^~~~~~~~~~~~~~~
election_campaign.cpp:137:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&m);
  ~~~~~^~~~~~~~~
election_campaign.cpp:141:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d",&A[i],&B[i],&C[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...