日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Test 2018-09-19

發(fā)布時(shí)間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Test 2018-09-19 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目名稱瘋狂生長(zhǎng)兩極反轉(zhuǎn)地震roads
英文代號(hào)rooftrellenmagnuscrixalisroads
時(shí)限1 秒1 秒見題面1 秒
輸入文件rooftrellen.inmagnus.incrixalis.inroads.in
輸出文件rooftrellen.outmagnus.outcrixalis.outroads.out
內(nèi)存限制512MB512MB512MB512MB

 

注意:
本次測(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í)間限制
 

代碼

  • 線段樹,我寫掛了!題解的線段樹指針滿天飛,看看就好。(;′д`)ゞ
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <ctime> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <deque> #include <set> #include <map>#define pb push_back #define mp make_pair #define LL long long #define maxlongint 2147483647using namespace std;const int inf = 999999999; const int mod = 1000000007; const int MAXN = 800010; const int MOD = 95542721; const int LEN = 12;inline int Getint() {char ch = getchar();while (ch < '0' || ch > '9') ch = getchar();int ret = 0;while (ch >= '0' && ch <= '9') ret = ret * 10 + ch - '0', ch = getchar();return ret; }int label;inline void GetLabel() {freopen("crixalis.in", "r", stdin);freopen("crixalis.out", "w", stdout);label = Getint(); }struct node {node *Lc, *Rc;int v[LEN];int L, R, m, p;node (int x, int y){L = x, R = y, m = L + R >> 1;p = 0, Lc = Rc = 0;memset(v, 0, sizeof(v));} };node *root;int a[MAXN], tmp[LEN], dig[10]; char ch[3]; int n, m, x, y, z;inline int Mod(int x, int MOD) {while (x >= MOD) x -= MOD;return x; }inline void Update(node *it) {for (int i = 0; i < LEN; i++){it -> v[i] = max(it -> Lc -> v[i], it -> Rc -> v[i]);} }inline void Clear(node *it) {if (!it -> p) return;memcpy(tmp, it -> Lc -> v, sizeof(tmp));for (int i = 0; i < LEN; i++){it -> Lc -> v[i] = tmp[Mod(i + it -> p, LEN)];}it -> Lc -> p = Mod(it -> Lc -> p + it -> p, LEN);memcpy(tmp, it -> Rc -> v, sizeof(tmp));for (int i = 0; i < LEN; i++){it -> Rc -> v[i] = tmp[Mod(i + it -> p, LEN)];}it -> Rc -> p = Mod(it -> Rc -> p + it -> p, LEN);it -> p = 0; }node *Build(int L, int R) {node *it = new node(L, R);if (L < R){it -> Lc = Build(L, it -> m);it -> Rc = Build(it -> m + 1, R);Update(it);}else{int t = a[L], L0 = 0;while (t){dig[++L0] = t % 10;t /= 10;}int start = L0;for (int i = 0; i < LEN; i++){int now = 0;for (int j = start; j > 0; j--) now = now * 10 + dig[j];for (int j = L0; j > start; j--) now = now * 10 + dig[j];it -> v[i] = now;start--;if (!start) start = L0;}}return it; }int Query(node *it, int L, int R) {if (it -> L == L && it -> R == R) return it -> v[0];Clear(it);if (R <= it -> m) return Query(it -> Lc, L, R);if (L > it -> m) return Query(it -> Rc, L, R);return max(Query(it -> Lc, L, it -> m), Query(it -> Rc, it -> m + 1, R)); }void Modify(node *it, int L, int R, int level) {if (it -> L == L && it -> R == R){it -> p += level;memcpy(tmp, it -> v, sizeof(tmp));for (int i = 0; i < LEN; i++){it -> v[i] = tmp[Mod(i + level, LEN)];}return;}Clear(it);if (R <= it -> m){Modify(it -> Lc, L, R, level);}else if (L > it -> m){Modify(it -> Rc, L, R, level);} else{Modify(it -> Lc, L, it -> m, level);Modify(it -> Rc, it -> m + 1, R, level);}Update(it); }inline void Init() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);}root = Build(1, n); }inline void Work() {for (int i = 1; i <= m; i++){scanf("%s%d%d", ch, &x, &y);if (ch[0] == 'Q'){printf("%d\n", Query(root, x, y));}else{scanf("%d", &z);Modify(root, x, y, z);}} }int main() {GetLabel();Init();Work();return 0; }
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▽, ̄)╭
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; struct edge{ int v,c,w1,w2,nxt; }e[11]; int head[11],cnt; inline void add(int u,int v,int c,int w2,int w1){e[++cnt].v=v; e[cnt].c=(1<<c-1);e[cnt].w1=w1; e[cnt].w2=w2;e[cnt].nxt=head[u]; head[u]=cnt; } int n,m,tot,dis1[11],dis2[11],prei[11],nowi[11],nxti[11]; bool vis[11][1ll<<11]; unsigned long long dis[11][1ll<<11]; void spfa(){queue<int>q; queue<unsigned long long>p;q.push(1); p.push((1ll<<1-1)); dis[1][1ll<<1-1]=0;while(!q.empty()){int u=q.front(); q.pop();unsigned long long P=p.front(); p.pop(); vis[u][P]=0;for(int i=head[u];i;i=e[i].nxt){if(P&e[i].c)if(dis[e[i].v][P|(1ll<<e[i].v-1)]>dis[u][P]+e[i].w2){dis[e[i].v][P|(1ll<<e[i].v-1)]=dis[u][P]+e[i].w2;if(!vis[e[i].v][P|(1ll<<e[i].v-1)]){ vis[e[i].v][P|(1ll<<e[i].v-1)]=1; q.push(e[i].v); p.push(P|(1ll<<e[i].v-1)); }}if(dis[e[i].v][P|(1ll<<e[i].v-1)]>dis[u][P]+e[i].w1){dis[e[i].v][P|(1ll<<e[i].v-1)]=dis[u][P]+e[i].w1;if(!vis[e[i].v][P|(1ll<<e[i].v-1)]){ vis[e[i].v][P|(1ll<<e[i].v-1)]=1; q.push(e[i].v); p.push(P|(1ll<<e[i].v-1)); }}}} } int main(){freopen("roads.in","r",stdin);freopen("roads.out","w",stdout);scanf("%d %d",&n,&m);tot=(1<<n)-1;for(int i=1;i<=m;++i){int a,b,c,la,lb;scanf("%d %d %d %d %d",&a,&b,&c,&la,&lb);add(a,b,c,la,lb);}for(int i=1;i<=n;++i)for(int j=1;j<=tot;++j)dis[i][j]=(2ll<<31)-1;spfa();unsigned long long ans=(2ll<<31)-1; for(int i=1;i<=tot;++i) ans=min(ans,dis[n][i]);if(ans==((2ll<<31)-1)) puts("impossible");else printf("%lld",ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/PotremZ/p/Test20180919.html

總結(jié)

以上是生活随笔為你收集整理的Test 2018-09-19的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。