Test 2018-09-19
| 英文代號(hào) | rooftrellen | magnus | crixalis | roads |
| 時(shí)限 | 1 秒 | 1 秒 | 見題面 | 1 秒 |
| 輸入文件 | rooftrellen.in | magnus.in | crixalis.in | roads.in |
| 輸出文件 | rooftrellen.out | magnus.out | crixalis.out | roads.out |
| 內(nèi)存限制 | 512MB | 512MB | 512MB | 512MB |
注意:
本次測(cè)試中,選手在讀入數(shù)據(jù)時(shí)會(huì)要求讀入一個(gè)數(shù)據(jù)編號(hào),方便選手對(duì)于不同的數(shù)據(jù)設(shè)計(jì)不同的算法,
而每個(gè)編號(hào)對(duì)應(yīng)的數(shù)據(jù)范圍也將在【數(shù)據(jù)規(guī)模和約定】 中體現(xiàn)。
而樣例輸入中的數(shù)據(jù)編號(hào)的作用僅僅是提醒選手不要忘了讀入編號(hào),并不代表這個(gè)編號(hào)對(duì)應(yīng)的數(shù)據(jù)就是樣例。
瘋狂生長(zhǎng)
【問題背景】
在 Rooftrellen 周圍召喚出瘋狂生長(zhǎng)的傷害性藤條和枝干,阻止被纏繞的敵人移動(dòng)、閃爍、進(jìn)入隱身或攻擊。
【問題描述】
樹精世界里有 $ n $ 顆藤蔓,每顆藤蔓都有一個(gè)高度 $ h_i $ 。
Rooftrellen 可以耗費(fèi)一個(gè)單位的能量把任意一顆藤蔓拔高 $ 1 $ 個(gè)單位長(zhǎng)度。
他想知道,能否恰好耗 費(fèi)自身現(xiàn)有的 $ m $ 個(gè)單位的能量,使得藤蔓都變得一樣高?
【輸入格式】
第一行一個(gè)整數(shù) ID,表示數(shù)據(jù)的編號(hào)。
第二行一個(gè)整數(shù) T, 表示數(shù)據(jù)的組數(shù)。 接下來有 T 組數(shù)據(jù)。
對(duì)于每組數(shù)據(jù):
第一行兩個(gè)整數(shù) $ n, m $ ,表示藤蔓的數(shù)量和能量值。
第二行 n 個(gè)整數(shù) $ h_1, h_2, …, h_n $ ,表示藤蔓的初始高度。
【輸出格式】
對(duì)于每組數(shù)據(jù): 一行一個(gè)字符串 Yes 或 No,表示答案。
【樣例輸入】
5 3 5 6 1 2 3 3 4 5 7 1 2 3 3 4 5 8 1 2 3 3 4【樣例輸出】
No Yes No
【數(shù)據(jù)規(guī)模和約定】
對(duì)于100%的數(shù)據(jù), $ h_i≤10^9 $ 。
【樣例說明】
樣例一,樣例三:沒有可行的方法。 樣例二:從左到右依次增加 3,2,1,1,0 個(gè)單位長(zhǎng)度即可。
【提示】
1、注意題面中的“恰好”。
2、 注意區(qū)別 ID 和 T。
題解
顯然的貪心,先把所有藤蔓的高度都提到和最高的藤蔓一樣高
(因?yàn)轭}目要求必須一樣高而且不能讓它們下降)
然后看所得消耗與 $ m $ 的大小關(guān)系。如果所得消耗比 $ m $ 大,那么答案一定是No
如果所得消耗大于等于 $ m $ ,設(shè)所得消耗為 $ sum $ ,判斷 $ (m-sum) $ % $ n $ 是否等于 $ 0 $
(這個(gè)時(shí)候所有藤蔓一樣高,還是要保持一樣高一定要讓它們都再 $ +1 $ )
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int ID,T,n,m,h[105],maxh,res; int main(){freopen("rooftrellen.in","r",stdin);freopen("rooftrellen.out","w",stdout);scanf("%d %d",&ID,&T);while(T--){scanf("%d %d",&n,&m); maxh=-1; res=0;for(int i=1;i<=n;++i){ scanf("%d",&h[i]); maxh=max(maxh,h[i]); }for(int i=1;i<=n;++i) res+=maxh-h[i];if(res==m) puts("Yes"); else if(res<m&&(m-res)%n==0) puts("Yes"); else if(res>m||(m-res)%n!=0) puts("No");}return 0; }兩極反轉(zhuǎn)
【問題背景】
Magnus 改變物質(zhì)的屬性,將附近的敵人都拖拽到他的前方,并且以強(qiáng)力的 震擊對(duì)他們?cè)斐蓚脱灐?br />
【問題描述】
猛犸世界中的數(shù)據(jù)網(wǎng)可以抽象成一個(gè)包含 $ n $ 個(gè)點(diǎn) $ m $ 條邊的有向圖。
由于編寫防火墻的碼農(nóng)比較偷懶,因此數(shù)據(jù)網(wǎng)經(jīng)常遭到攻擊,某些邊的方向會(huì)變化,使得數(shù)據(jù)無(wú)法在節(jié)點(diǎn)之間相互傳遞。
這時(shí) Magnus 的能力就起作用了,他 可以耗費(fèi) $ 1 $ 單位的體力值來使任意一條邊反向。
Magnus 想知道, 如果要把數(shù)據(jù)從節(jié)點(diǎn) $ x_i $ 傳輸?shù)焦?jié)點(diǎn) $ y_i $ ,他至少要耗費(fèi)多少體力值呢?
【輸入格式】
第一行一個(gè)整數(shù) ID,表示數(shù)據(jù)的編號(hào)。
第二行三個(gè)整數(shù) $ n, m, q,$ 表示有向圖的點(diǎn)數(shù),邊數(shù)和詢問數(shù)。
接下來 $ m $ 行,每行 2 個(gè)整數(shù) $ x_i $ 和 $ y_i $ ,表示 $ x_i $ 和 $ y_i $ 之間有一條有向邊。
接下來 $ q $ 行,每行 2 個(gè)整數(shù) $ x_i $ 和 $ y_i $ ,表示一組詢問。
【輸出格式】
$ q $ 行,每行一個(gè)正整數(shù),表示至少耗費(fèi)的體力值。 如果無(wú)法傳輸,輸出-1。
【樣例輸入一】
1 8 7 1 1 2 3 2 3 4 7 4 6 2 5 6 7 5 1 7【樣例輸出一】
2【樣例輸入二】
1 8 7 1 1 2 3 2 3 4 7 4 6 2 5 6 7 5 1 8【樣例輸出二】
-1
【樣例說明】
對(duì)于樣例一,只要將 $ 3 \rightarrow 2 $ 和 $ 7 \rightarrow 4 $ 兩條邊反向即可。
對(duì)于樣例二,節(jié)點(diǎn) 8 的入度和出度均為 0,所以無(wú)法傳輸。
【數(shù)據(jù)規(guī)模和約定】
【提示】
1、注意題面中的“如果”,每次詢問并不會(huì)真的將某些邊反向。
題解
此題考慮數(shù)據(jù)分治
對(duì)于前14個(gè)點(diǎn),由于 $ q=1 $ ,我們考慮建圖,
對(duì)于有向邊 $ (u,v) $ ,我們存一條 $ u \rightarrow v \quad cost: 0 $ 的邊,
對(duì)于它的反向邊,我們存一條 $ v \rightarrow u \quad cost: 1 $ 的邊,
使 $ x $ 作為源點(diǎn)跑一遍 $ SPFA $ 即可。對(duì)于后面的數(shù)據(jù),由于題目保證是一棵樹,考慮 $ LCA $ 和前綴和。
除了 $ dep $ ,我們多維護(hù)一個(gè)信息 $ dis $ 代表 $ 1 $ 節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)需要走多少條反向邊,
還是像之前一樣建邊,然后維護(hù)即可。
最后計(jì)算答案的時(shí)候,由于 $ x $ 點(diǎn)要往上走,它的反向邊與 $ 1 $ 到它的反向邊意義正好相反,我們要用 $ dep - dis $ 得到正確的反向邊數(shù)量對(duì)于一對(duì) $ x_i,y_i $ ,它們的答案即為 $ ans=dep_x-dis_x+dis_y-dep_{lca} $
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int ID,n,m,q; struct edge{ int v,w,nxt; }e[100005<<2]; int head[100005],tot; inline void add(int u,int v,int w){ e[++tot].v=v; e[tot].w=w; e[tot].nxt=head[u]; head[u]=tot; } int dis[100005]; bool vis[100005]; inline void spfa(int s){for(int i=1;i<=n;++i) dis[i]=0x3f3f3f3f;queue<int>q; q.push(s); dis[s]=0; while(!q.empty()){int u=q.front(); vis[u]=0; q.pop();for(int i=head[u];i;i=e[i].nxt)if(dis[e[i].v]>dis[u]+e[i].w){dis[e[i].v]=dis[u]+e[i].w;if(!vis[e[i].v]){ vis[e[i].v]=1; q.push(e[i].v); }}} } int dep[100005],f[100005][21]; void dfs(int u,int fa){dep[u]=dep[fa]+1; f[u][0]=fa;for(int j=1;j<=20;++j)f[u][j]=f[f[u][j-1]][j-1];for(int i=head[u];i;i=e[i].nxt){if(e[i].v==fa) continue;dis[e[i].v]=dis[u]+e[i].w;dfs(e[i].v,u);} } inline int lca(int u,int v){if(dep[u]>dep[v]) swap(u,v);for(int i=20;~i;--i)if(dep[u]<=dep[v]-(1<<i)) v=f[v][i];if(u==v) return u;for(int i=20;~i;--i)if(f[u][i]!=f[v][i]){ u=f[u][i]; v=f[v][i]; }return f[u][0]; } signed main(){freopen("magnus.in","r",stdin);freopen("magnus.out","w",stdout);scanf("%d",&ID);scanf("%d %d %d",&n,&m,&q);if(q==1){for(int i=1;i<=m;++i){int u,v;scanf("%d %d",&u,&v);add(u,v,0); add(v,u,1);}int x,y;scanf("%d %d",&x,&y);spfa(x);if(dis[y]==0x3f3f3f3f) puts("-1");else printf("%d",dis[y]);} else {for(int i=1;i<=m;++i){int u,v;scanf("%d %d",&u,&v);add(u,v,0); add(v,u,1);}dfs(1,0);while(q--){int x,y;scanf("%d %d",&x,&y);int Lca=lca(x,y);printf("%d\n",(dep[x]-dis[x])+dis[y]-dep[Lca]);}}return 0; }地震
【問題背景】
持續(xù)施法 - 在 2 秒吟唱后, Crixalis 向地中發(fā)送擾動(dòng),引起大地劇烈震動(dòng)。
所有范圍內(nèi)的敵人會(huì)受到傷害并被減速。每次后續(xù)震擊都會(huì)提高傷害傳播 半徑。可用神杖升級(jí)。
【問題描述】
Crixalis 平日很喜歡搗亂,這導(dǎo)致沙塵世界每隔一個(gè)小時(shí)就有一次地震發(fā)生。
沙塵世界所有的 $ n $ 幢建筑都在一條直線上,從左到右依次標(biāo)號(hào)為 $ 1~n $ 。
每次地震由三個(gè)參數(shù)決定:受影響的建筑區(qū)間 $ [L_i, R_i] $ 以及地震的強(qiáng)度 $ F_i $ 。
任意時(shí)刻每幢建筑物都有一個(gè)高度, 用一個(gè)數(shù)字串來表示(可能含有前導(dǎo) 0)。
每一次地震來臨時(shí),受影響建筑的高度數(shù)字串將根據(jù)地震的強(qiáng)度向左旋轉(zhuǎn)相應(yīng)的位數(shù), 但是不要忘了前導(dǎo)零的存在,
舉個(gè)例子:高度串是 120 的建筑連續(xù)受到 三次強(qiáng)度為 1 的地震的影響之后,高度串分別變?yōu)?201, 012, 120。
沙塵世界的守衛(wèi)想出了一個(gè)保護(hù)建筑的方法,但有時(shí)需要知道某個(gè)區(qū)間內(nèi)最高的建筑的高度。
現(xiàn)在給出了這 $ n $ 幢建筑初始的高度數(shù)字串,以及有以下兩種操作:
1、 U Li Ri Fi,表示 $ [L_i, R_i] $ 區(qū)間內(nèi)的建筑受到了強(qiáng)度為 Fi 的地震的影響。
2、 Q Li Ri,表示詢問 $ [L_i, R_i] $ 區(qū)間內(nèi)當(dāng)前最高的建筑的高度。 你需要模擬這兩種操作,幫助守衛(wèi)解決問題。
【輸入格式】
第一行一個(gè)整數(shù) ID,表示數(shù)據(jù)的編號(hào)。
第二行兩個(gè)整數(shù) $ n, q $ , 表示建筑的數(shù)量和操作數(shù)。
第三行 $ n $ 個(gè)整數(shù) $ a_1, a_2, …, a_n $ ,表示每幢建筑的初始高度串。
接下來 $ q $ 行,每行表示兩種操作中的某一種。
【輸出格式】
對(duì)于每個(gè) Q 操作,輸出一行一個(gè)整數(shù),表示該操作的答案。
注意輸出的整數(shù)不能包含前導(dǎo) 0。
【樣例輸入】
2 3 817 3140 832Q 1 3U 1 3 1Q 2 3Q 1 1U 1 3 2Q 1 3U 2 2 1Q 1 3【樣例輸出】
31401403 718323140
【數(shù)據(jù)規(guī)模和約定】
對(duì)于100%的數(shù)據(jù),初始的高度數(shù)字串不包含前導(dǎo) 0, $ 1≤F_i≤60 $ 。
【樣例說明】
第一次 U 操作之后=>[71, 1403, 328]
第二次 U 操作之后=>[71, 0314, 832]
第三次 U 操作之后=>[71, 3140, 832]
【提示】
1、 雖然是高度數(shù)字串,但是應(yīng)看做數(shù)字來比較大小而不是字典序。例如:0123 和 122 比較, 0123 的高度較大。
2、注意本題特殊的時(shí)間限制
代碼
- 線段樹,我寫掛了!題解的線段樹指針滿天飛,看看就好。(;′д`)ゞ
Paid Roads
【題目描述】
這里有一個(gè)地圖,嗯~準(zhǔn)確的說是一個(gè)藏寶圖。
你在 $ 1 $ 號(hào)點(diǎn),寶藏在 $ n $ 號(hào)點(diǎn), 所有的點(diǎn)編號(hào) $ 1~n $ ,
這塊寶底的地形是很奇怪的,每?jī)蓚€(gè)點(diǎn)之間有兩條通路,兩 個(gè)通路的長(zhǎng)度是不一樣的,可能會(huì)有一條比較短,你可以任選一條,
但是其中一 條你只有在之前經(jīng)過某個(gè)點(diǎn)的時(shí)才能通行,就好像這條路的通行證在那個(gè)點(diǎn)上一 樣。
現(xiàn)在想知道怎么樣走才能以最短的路程到達(dá)藏寶點(diǎn)。
【輸入格式】
第一行兩個(gè)用空格隔開的整數(shù) $ n $ 和 $ m $ 分別表示節(jié)點(diǎn)的編號(hào)個(gè)數(shù)和該藏寶點(diǎn)路徑條數(shù)。
第二行到第 $ m + 1 $ 行每行 5 個(gè)整數(shù) $ a,b,c,la,lb $ 描述從 $ a $ 點(diǎn)到 $ b $ 點(diǎn)的有向路,
$ la $ 表示之前經(jīng)過 $ c $ 后,可以從 $ a $ 到 $ b $ 的路徑長(zhǎng)度,
$ lb $ 表示隨時(shí)都可以通行的 $ a $ 到 $ b $ 的路徑長(zhǎng)度。
【輸出格式】
一行一個(gè)整數(shù)表示的是從 $ 1 $ 到 $ n $ 的最短路程。如果沒有路輸出“ impossible”。
【輸入樣例】
4 5 1 2 1 10 10 2 3 1 30 50 3 4 3 80 80 2 1 2 10 10 1 3 2 10 50【輸出樣例】
110
【數(shù)據(jù)范圍】
$ n,m ≤ 10 $
$ la,lb ≤ (2<<31)-1 $
代碼
- 為什么沒有題解?這么小的數(shù)據(jù)直接分層圖最短路就可以了( ̄y▽, ̄)╭
轉(zhuǎn)載于:https://www.cnblogs.com/PotremZ/p/Test20180919.html
總結(jié)
以上是生活随笔為你收集整理的Test 2018-09-19的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python爬虫之pyppeteer去除
- 下一篇: 购买域名,购买公网IP,实现同一个IP绑