【左偏樹】【P3261】 [JLOI2015]城池攻占

Description

小銘銘最近獲得了一副新的桌游,游戲中需要用 m 個騎士攻占 n 個城池。這 n 個城池用 1 到 n 的整數表示。除 1 號城池外,城池 i 會受到另一座城池 fi 的管轄,其中 fi <i。也就是說,所有城池構成了一棵有根樹。這 m 個騎士用 1 到 m 的整數表示,其中第 i 個騎士的初始戰斗力為 si,第一個攻擊的城池為 ci。

每個城池有一個防御值 hi,如果一個騎士的戰斗力大于等于城池的生命值,那么騎士就可以占領這座城池;否則占領失敗,騎士將在這座城池犧牲。占領一個城池以后,騎士的戰斗力將發生變化,然后繼續攻擊管轄這座城池的城池,直到占領 1 號城池,或犧牲為止。

除 1 號城池外,每個城池 i 會給出一個戰斗力變化參數 ai;vi。若 ai =0,攻占城池 i 以后騎士戰斗力會增加 vi;若 ai =1,攻占城池 i 以后,戰斗力會乘以 vi。注意每個騎士是單獨計算的。也就是說一個騎士攻擊一座城池,不管結果如何,均不會影響其他騎士攻擊這座城池的結果。如果 \(a_i~=~1\),保證 \(v_i~>~0\)

現在的問題是,對于每個城池,輸出有多少個騎士在這里犧牲;對于每個騎士,輸出他攻占的城池數量。

Limitation

\(1~\leq~n,~m~\leq~3~\times~10^5\)

Solution

最近沉迷頹廢學習很久沒寫博客了啊QAQ

考慮由于若在一個位置的戰斗力是乘法則只會乘正整數,當同一個節點的騎士向上攻占的時候,他們相互之間戰斗力的大小關系是不變的。如果我們維護每個節點上還剩下了多少騎士,那么每到一個節點所有小于某個值的元素都要被刪除,這提示我們使用堆來維護。由于需要支持信息的合并,我們考慮使用左偏樹來完成。

考慮到達一個節點以后會給節點里所有的元素做一次修改,但是這個修改是不影響堆的結構的,于是可以在堆的根節點上打標記,不斷下方即可。

Code

#include <cstdio>
#include <vector>
#include <algorithm>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endiftypedef long long ll;namespace IPT {const int L = 1000000;char buf[L], *front=buf, *end=buf;char GetChar() {if (front == end) {end = buf + fread(front = buf, 1, L, stdin);if (front == end) return -1;}return *(front++);}
}template <typename T>
inline void qr(T &x) {char ch = IPT::GetChar(), lst = ' ';while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();if (lst == '-') x = -x;
}namespace OPT {char buf[120];
}template <typename T>
inline void qw(T x, const char aft, const bool pt) {if (x < 0) {x = -x, putchar('-');}int top=0;do {OPT::buf[++top] = static_cast<char>(x % 10 + '0');} while (x /= 10);while (top) putchar(OPT::buf[top--]);if (pt) putchar(aft);
}const int maxn = 300010;struct Kni {ll s;int c, ans;
};
Kni kt[maxn];struct Tree {Kni* v;ll addv, addm, dist;Tree *ls, *rs;Tree(Kni *_v = NULL) {ls = rs = NULL;dist = addv = 0; addm = 1;v = _v;}inline void addtag(ll x) {this->addv += x;this->v->s += x;}inline void multag(ll x) {this->addm *= x;this->addv *= x;this->v->s *= x;}inline void pd(ll x, ll y) {this->multag(y); this->addtag(x); }inline void pushdown() {if (this->ls) this->ls->pd(this->addv, this->addm);if (this->rs) this->rs->pd(this->addv, this->addm);this->addv = 0; this->addm = 1;}inline void pushup() {this->dist = (this->rs ? this->rs->dist : 0) + 1;}
};
Tree *tree[maxn];int n, m;
int fa[maxn], depth[maxn], died[maxn];
ll MU[maxn], a[maxn], v[maxn]; 
std::vector<int>son[maxn], kts[maxn];void dfs(int);
Tree *merge(Tree*, Tree*);int main() {freopen("1.in", "r", stdin);qr(n); qr(m);for (int i = 1; i <= n; ++i) qr(MU[i]);for (int i = 2; i <= n; ++i) {qr(fa[i]); son[fa[i]].push_back(i); qr(a[i]); qr(v[i]);}for (int i = 1; i <= m; ++i) {qr(kt[i].s); qr(kt[i].c); kt[i].ans = -1;kts[kt[i].c].push_back(i);}dfs(1);for (int i = 1; i <= n; ++i) qw(died[i], '\n', true);for (int i = 1; i <= m; ++i) qw(~kt[i].ans ? kt[i].ans : depth[kt[i].c], '\n', true);return 0;
}Tree *merge(Tree *u, Tree *v) {if (!u) return v;if (!v) return u;u->pushdown(); v->pushdown();if (u->v->s > v->v->s) std::swap(u, v);u->rs = merge(u->rs, v);if ((u->rs) && ((!u->ls) || (u->rs->dist > u->ls->dist))) std::swap(u->ls, u->rs);u->pushup();return u;
}void dfs(int u) {depth[u] = depth[fa[u]] + 1;for (auto to : son[u]) {dfs(to);while (tree[to] && (tree[to]->v->s < MU[u])) {++died[u];tree[to]->v->ans = depth[tree[to]->v->c] - depth[u];tree[to]->pushdown();tree[to] = merge(tree[to]->ls, tree[to]->rs);}tree[u] = merge(tree[u], tree[to]);}for (auto i : kts[u]) {if (kt[i].s >= MU[u]) tree[u] = merge(tree[u], new Tree(&kt[i]));else {++died[u];kt[i].ans = 0;}}if (!tree[u]) return;if (a[u]) tree[u]->multag(v[u]);else tree[u]->addtag(v[u]);
}

Summary

只要信息修改后不影響堆的形態,可以在左偏樹上打標記來完成修改。

轉載于:https://www.cnblogs.com/yifusuyi/p/10539753.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【原創】數據庫中為什么不推薦使用外鍵約束

引言 其實這個話題是老生常談&#xff0c;很多人在工作中確實也不會使用外鍵。包括在阿里的JAVA規范中也有下面這一條 【強制】不得使用外鍵與級聯&#xff0c;一切外鍵概念必須在應用層解決。 但是呢&#xff0c;詢問他們原因&#xff0c;大多是這么回答的 每次做DELETE 或者…

初識Activiti

http://wenku.baidu.com/view/bb7364ad4693daef5ff73d32.html 1. 初識Activiti 1.1. 工作流與工作流引擎 工作流&#xff08;workflow&#xff09;就是工作流程的計算模型&#xff0c;即將工作流程中的工作如何前后組織在一起的邏輯和規則在計算機中以恰當的模型進行表示并對其…

開源軟件 安全風險_3開源安全風險及其解決方法

開源軟件 安全風險Open source software is very popular and makes up a significant portion of business applications. According to Synopsys, 99% of commercial databases contain at least one open source component, and nearly 75% of these codebases contain open…

React-Router 源碼分析1

1、單頁面應用的路由基本原理 demo1 router1.html 復制代碼以 hash 形式為例。 1、init 監聽瀏覽器 url hash 更新事件。 2、route 存儲路由更新時的回調到回調數組routes中&#xff0c;回調函數將負責對頁面的更新。 3、refresh 執行當前url對應的回調函數&#xff0c;更新頁面…

linux安裝日志切割程序

linux安裝日志切割程序 安裝 gcc&#xff08;1&#xff09; yum insatll gcc &#xff08;2&#xff09;# cd cronolog-1.6.2 4、運行安裝 # ./configure# make# make install 5、查看cronolog安裝后所在目錄&#xff08;驗證安裝是否成功&#xff09; # which cronolog 一般情…

自助分析_為什么自助服務分析真的不是一回事

自助分析That title probably got your attention and now you think I have some explaining to do! The key word in the title is the word “A”. Self-service analytics isn’t a thing if “a thing” means a single, distinct corporate initiative or set of require…

BPMN2.0-概要

BPMN2.0-概要 作者&#xff1a;AliKevin2011&#xff0c;發布于2012-6-27 一、BPMN簡介 BPMN&#xff08;Business Process Model And Notation&#xff09;- 業務流程模型和符號 是有BPMI&#xff08;Business Process Management Initiative&#xff09;開發的一套變準的業務…

如何用Phaser實現一個全家福拼圖H5

一、Phaser介紹 二、整體框架搭建 三、資源加載 四、游戲邏輯五、完成六、總結參考文檔 最近用Phaser做了一個全家福拼圖h5的項目&#xff0c;這篇文章將會從零開始講解如何用Phaser實現&#xff0c;最終效果如下&#xff1a; 源碼&#xff1a;https://github.com/ZENGzoe/phas…

angularjs 默認跳轉

angularjs 的 $state.go() 跳轉頁面 &#xff0c;目標頁面的js函數 的執行 先于 $locationChangeStart 的監聽函數。 故意 添加 timeout 可以使 controller 在locationchangestart 之后觸發。轉載于:https://www.cnblogs.com/RoadAspenBK/p/9923332.html

錯誤錄入 算法_如何使用驗證錯誤率確定算法輸出之間的關系

錯誤錄入 算法Monument (www.monument.ai) enables you to quickly apply algorithms to data in a no-code interface. But, after you drag the algorithms onto data to generate predictions, you need to decide which algorithm or combination of algorithms is most re…

Activiti 簡易教程

一搭建環境 1.1 JDK 6 activiti 運行在版本 6以上的 JDK上。轉到 Oracle Java SE下載頁面&#xff0c;點擊按鈕“下載 JDK”。網頁中也有安裝說明。要核實安裝是否成功&#xff0c;在命令行上運行 java–version。將打印出安裝的 JDK的版本。 1.2 Ant 1.8.1 從 Ant[http://…

xargs命令詳解,xargs與管道的區別

在工作中經常會接觸到xargs命令&#xff0c;特別是在別人寫的腳本里面也經常會遇到&#xff0c;但是卻很容易與管道搞混淆&#xff0c;本篇會詳細講解到底什么是xargs命令&#xff0c;為什么要用xargs命令以及與管道的區別。為什么要用xargs呢&#xff0c;我們知道&#xff0c;…

pytorch回歸_PyTorch:用嶺回歸檢查泰坦尼克號下沉

pytorch回歸In this notebook, we shall use this dataset containing data about passengers from the Titanic. Based on this data, we will use a Ridge Regression model which just means a Logistic Regression model that uses L2 Regularization for predicting wheth…

Java后臺與VUE跨域交接

后臺代碼&#xff1a;package com.cn.Mr.Zhong.filter;import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;impor…

koa2 中使用 svg-captcha 生成驗證碼

1. 安裝svg-captcha $ npm install --save svg-captcha 2. 使用方法 生成有4個字符的圖片和字符串const svgCaptcha require(svg-captcha)const cap svgCaptcha.create({size: 4, // 驗證碼長度width:160,height:60,fontSize: 50,ignoreChars: 0oO1ilI, // 驗證碼字符中排除 …

Weblogic 節點啟動

1.啟動管理理節點export JAVA_OPTIONS"$JAVA_OPTIONS -Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID1.0 -Djava.security.egdfile:/dev/./urandom"nohup ./startWebLogic.sh >admin.log &tail -f admin.log2.啟動節點ssonohup ./startManaged…

[Swift]LeetCode74. 搜索二維矩陣 | Search a 2D Matrix

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

iris數據集 測試集_IRIS數據集的探索性數據分析

iris數據集 測試集Let’s explore one of the simplest datasets, The IRIS Dataset which basically is a data about three species of a Flower type in form of its sepal length, sepal width, petal length, and petal width. The data set consists of 50 samples from …

Oracle 12c 安裝 Linuxx86_64

1)下載Oracle Database 12cRelease 1安裝介質 官方的下載地址&#xff1a; 1&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2&#xff1a;https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number16496…

Linux入門實驗

學習Linux要先做實驗來熟悉操作系統本次先寫點入門的操作。 關于Linux入門實驗的操作如下&#xff1a; 【例1】顯示當前使用的shell [rootcentos7 ~]# echo ${SHELL} /bin/bash 【例2】顯示當前系統使用的所有shell [rootcentos7 ~]#cat /etc/shells /bin/sh /bin/bash /usr/bi…