Submission #121569

#TimeUsernameProblemLanguageResultExecution timeMemory
121569dualityDesignated Cities (JOI19_designated_cities)C++11
0 / 100
641 ms25916 KiB
#define DEBUG 0 #include <bits/stdc++.h> using namespace std; #if DEBUG // basic debugging macros int __i__,__j__; #define printLine(l) for(__i__=0;__i__<l;__i__++){cout<<"-";}cout<<endl #define printLine2(l,c) for(__i__=0;__i__<l;__i__++){cout<<c;}cout<<endl #define printVar(n) cout<<#n<<": "<<n<<endl #define printArr(a,l) cout<<#a<<": ";for(__i__=0;__i__<l;__i__++){cout<<a[__i__]<<" ";}cout<<endl #define print2dArr(a,r,c) cout<<#a<<":\n";for(__i__=0;__i__<r;__i__++){for(__j__=0;__j__<c;__j__++){cout<<a[__i__][__j__]<<" ";}cout<<endl;} #define print2dArr2(a,r,c,l) cout<<#a<<":\n";for(__i__=0;__i__<r;__i__++){for(__j__=0;__j__<c;__j__++){cout<<setw(l)<<setfill(' ')<<a[__i__][__j__]<<" ";}cout<<endl;} // advanced debugging class // debug 1,2,'A',"test"; class _Debug { public: template<typename T> _Debug& operator,(T val) { cout << val << endl; return *this; } }; #define debug _Debug(), #else #define printLine(l) #define printLine2(l,c) #define printVar(n) #define printArr(a,l) #define print2dArr(a,r,c) #define print2dArr2(a,r,c,l) #define debug #endif // define #define MAX_VAL 999999999 #define MAX_VAL_2 999999999999999999LL #define EPS 1e-6 #define mp make_pair #define pb push_back // typedef typedef unsigned int UI; typedef long long int LLI; typedef unsigned long long int ULLI; typedef unsigned short int US; typedef pair<int,int> pii; typedef pair<LLI,LLI> plli; typedef vector<int> vi; typedef vector<LLI> vlli; typedef vector<pii> vpii; typedef vector<plli> vplli; // ---------- END OF TEMPLATE ---------- #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") int N; struct edge { int v,c,d; }; vector<edge> adjList[200000]; int visited[200000]; LLI ans[200001]; int parent[200000],pw[200000],disc[200000],fin[200000],inv[200000],num = 0; LLI pp[200000],sub[200000]; int done[200000]; int doDFS(int u,int p,LLI d) { int i; parent[u] = p,pp[u] = d,disc[u] = num++,inv[num-1] = u,sub[u] = 0; for (i = 0; i < adjList[u].size(); i++) { int v = adjList[u][i].v; if ((v != p) && !visited[v]) { pw[v] = adjList[u][i].c,doDFS(v,u,d+adjList[u][i].c); sub[u] += adjList[u][i].d+sub[v]; } } fin[u] = num; return 0; } LLI tree[1 << 19],lazy[1 << 19]; int pos[1 << 19]; int prop(int s,int e,int i) { tree[i] += lazy[i]; if (s != e) lazy[2*i+1] += lazy[i],lazy[2*i+2] += lazy[i]; lazy[i] = 0; return 0; } LLI build(int s,int e,int i) { if (s == e) { tree[i] = pp[inv[s]],lazy[i] = 0,pos[i] = s; return tree[i]; } int mid = (s+e) / 2; tree[i] = max(build(s,mid,2*i+1),build(mid+1,e,2*i+2)),lazy[i] = 0; if (tree[2*i+1] > tree[2*i+2]) pos[i] = pos[2*i+1]; else pos[i] = pos[2*i+2]; return tree[i]; } LLI update(int s,int e,int as,int ae,int i,LLI num) { prop(s,e,i); if ((s > ae) || (e < as)) return tree[i]; else if ((s >= as) && (e <= ae)) { lazy[i] += num; prop(s,e,i); return tree[i]; } int mid = (s+e) / 2; tree[i] = max(update(s,mid,as,ae,2*i+1,num),update(mid+1,e,as,ae,2*i+2,num)); if (tree[2*i+1] > tree[2*i+2]) pos[i] = pos[2*i+1]; else pos[i] = pos[2*i+2]; return tree[i]; } pair<LLI,int> query(int s,int e,int qs,int qe,int i) { prop(s,e,i); if ((s > qe) || (e < qs)) return mp(-1,0); else if ((s >= qs) && (e <= qe)) return mp(tree[i],pos[i]); int mid = (s+e) / 2; return max(query(s,mid,qs,qe,2*i+1),query(mid+1,e,qs,qe,2*i+2)); } int size[200000]; int doDFS2(int u,int p) { int i; size[u] = 1; for (i = 0; i < adjList[u].size(); i++) { int v = adjList[u][i].v; if ((v != p) && !visited[v]) size[u] += doDFS2(v,u); } return size[u]; } int centroid(int u) { int i,p = -1,r = u; doDFS2(u,-1); while (1) { int h = -1; for (i = 0; i < adjList[u].size(); i++) { int v = adjList[u][i].v; if ((v != p) && !visited[v]) { if ((h == -1) || (size[v] > size[h])) h = v; } } if (((h == -1) || (size[h] <= size[r]/2)) && (size[r]-size[u] <= size[r]/2)) break; else p = u,u = h; } return u; } int decompose(int u,LLI dd) { int i; u = centroid(u); num = 0,((N <= 2000) ? doDFS(u,-1,0):0),doDFS2(u,-1); LLI sum2 = sub[u]+dd; fill(done,done+size[u],0); build(0,size[u]-1,0); int lp = -1; ans[1] = max(ans[1],sum2); /*for (i = 1; i <= size[u]; i++) { int mi; if (i != 2) { prop(0,size[u]-1,0); mi = inv[pos[0]]; sum2 += tree[0]; } else { pair<LLI,int> q = max(query(0,size[u]-1,0,disc[lp]-1,0),query(0,size[u]-1,fin[lp],size[u]-1,0)); mi = inv[q.second]; sum2 += q.first; } if (i > 1) ans[i] = max(ans[i],sum2); while (!done[disc[mi]] && (mi != u)) { update(0,size[u]-1,disc[mi],fin[mi]-1,0,-pw[mi]); done[disc[mi]] = 1,lp = mi,mi = parent[mi]; } }*/ visited[u] = 1; for (i = 0; i < adjList[u].size(); i++) { int v = adjList[u][i].v; if (!visited[v]) decompose(v,dd+sub[u]-sub[v]-adjList[u][i].d+adjList[u][i].c); } return 0; } int main() { int i; int Q; int A,B,C,D; LLI sum = 0; scanf("%d",&N); for (i = 0; i < N-1; i++) { scanf("%d %d %d %d",&A,&B,&C,&D); A--,B--; adjList[A].pb((edge){B,C,D}); adjList[B].pb((edge){A,D,C}); sum += C+D; } decompose(0,0); int E; scanf("%d",&Q); for (i = 0; i < Q; i++) { scanf("%d",&E); printf("%lld\n",sum-ans[E]); } return 0; }

Compilation message (stderr)

designated_cities.cpp: In function 'int doDFS(int, int, LLI)':
designated_cities.cpp:71:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < adjList[u].size(); i++) {
                 ~~^~~~~~~~~~~~~~~~~~~
designated_cities.cpp: In function 'int doDFS2(int, int)':
designated_cities.cpp:128:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < adjList[u].size(); i++) {
                 ~~^~~~~~~~~~~~~~~~~~~
designated_cities.cpp: In function 'int centroid(int)':
designated_cities.cpp:139:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0; i < adjList[u].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~~
designated_cities.cpp: In function 'int decompose(int, LLI)':
designated_cities.cpp:178:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < adjList[u].size(); i++) {
                 ~~^~~~~~~~~~~~~~~~~~~
designated_cities.cpp:157:9: warning: unused variable 'lp' [-Wunused-variable]
     int lp = -1;
         ^~
designated_cities.cpp: In function 'int main()':
designated_cities.cpp:189:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&N);
     ~~~~~^~~~~~~~~
designated_cities.cpp:191:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d %d",&A,&B,&C,&D);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:200:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&Q);
     ~~~~~^~~~~~~~~
designated_cities.cpp:202:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&E);
         ~~~~~^~~~~~~~~
#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...