1. 程式人生 > >7.2模擬賽

7.2模擬賽

中一 -s cloc ges orz body -1 平時 詳解

1.lpy 的魔法農場

Description

n 個人在 lpy 的農場裏面工作。員工從 1 n 編號。每一個人種一種蘑菇。剛開始每一個人在自己的田地負責自己的蘑菇,這樣的話公司裏面就有 n 種蘑菇。

Lpy 種變異的蘑菇,變異蘑菇需要許多普通蘑菇通過魔法合成,blong(x) 表示 x 這個人所在的部門。有以下兩種合成操作:

  1. 魔法合成 blong(x) blong(y) x y (1≤x,y≤n)是員工編號。如果 blong(x) 和 blong(y)是種的同一種蘑菇,那麽就不操作。
  1. 魔法合成 blong(x),blong(x+1),...,blong(y),x
    y (1≤x≤y≤n)是員工編號。

有一些查詢操作,查詢員工 x y (1≤x,y≤n)是否種同一種蘑菇。

Input

單組測試數據。

第一行有兩個整數 n 和 q (1≤n≤200000, 1≤q≤500000)表示員工的數目和操作數目。接下來 q 行,每行的格式是 type x y。type∈{1,2,3}。如果 type=1 或者 type=2,那麽表示第一種或者第二種魔法合成操作。如果 type=3,表示查詢員工 x 和 y 是否種同一種蘑菇。

Output

對於第三種查詢,如果種同一種蘑菇輸出 YES,否則輸出 NO。

Example

Input

8 6

3 2 5

1 2 5

3 2 5

2 4 7

2 1 2

3 1 7

Output

NO

YES

YES

題目大整容!!!

51Nod 1525 重組公司技術分享 題目來源: CodeForces 基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 Description

  有n個人在公司裏面工作。員工從1到n編號。每一個人屬於一個部門。剛開始每一個人在自己的部門負責自己的項目,這樣的話公司裏面就有n個部門。

然而,公司內部出現了危機,需要合並一些部門,以提高工作效率。team(person) 表示person這個人所在的部門。有以下兩種合並操作:

1. 合並 team(x) 和 team(y)。 x和 y (1≤x,y≤n)是員工編號。如果team(x) 和 team(y)是同一個部門,那麽就不操作。

2. 合並team(x),team(x+1),...,team(y),x 和 y (1≤x≤y≤n)是員工編號。

有一些查詢操作,查詢員工x 和 y (1≤x,y≤n)是否屬於同一部門。

Input
單組測試數據。
第一行有兩個整數n 和 q (1≤n≤200000, 1≤q≤500000)表示員工的數目和操作數目。
接下來q行,每行的格式是type x y。type∈{1,2,3}。如果type=1 或者 type=2,那麽表示第一種或者第二種合並操作。如果type=3,表示查詢員工x和y是否屬於同一部門。
Output
對於第三種查詢,如果屬於同一部門輸出YES,否則輸出NO。
Input示例
樣例輸入1
8 6
3 2 5
1 2 5
3 2 5
2 4 7
2 1 2
3 1 7
Output示例 樣例輸出1
NO
YES
YES
思路:
詳解博客:
xxy開講了

考場裸寫並查集,TLE!!!

上代碼:

#include<cstdio>
#define M 200033
using namespace std;

int n,q,x,y,f[M],near[M],type;

int reads() {
    int x=0;
    char c=getchar();
    while(c<0||c>9) c=getchar();
    while(c>=0&& c<=9) x=x*10+c-0,c=getchar();
    return x;
}

inline int find(int x) {
    if(f[x]!=x) f[x]=find(f[x]);
    return f[x];
}

inline int unionn(int a,int b) {
    int x1=find(a), x2=find(b);
    if(x1!=x2)
        f[x1]=x2;
}

inline void qj() {
    int step,r=y;
    while(r>=x && (step=near[r])>=x) {
        //unionn(r,step);
        f[find(step)]=f[find(r)];
        near[r]=near[step];
        //t在i前面,i與t合並後,i到t之間的全都合並了,i之前的第一個沒合並的就是t之前的第一個沒合並的
        r=step;
    }
}

int main() {
    n=reads();
    q=reads();
    for(int i=1; i<=n; i++) f[i]=i,near[i]=i-1;
    for(int i=1; i<=q; i++) {
        type=reads();
        x=reads();y=reads();
        if(type == 1) unionn(x,y);
        if(type == 2) qj();
        if(type == 3) {
            if(find(x) == find(y))    puts("YES\n");
            else puts("NO\n");
        }
    }
    return 0;
}

2.Hkd magic mouse

Description

  hkd 最近迷上了打 magic mouse 遊戲。

  magic mouse 遊戲是一項需要反應速度和敏捷判斷力的遊戲。遊戲開始時,會在地板上一下子冒出很多magic mouse 來,然後等 hkd 用榔頭去敲擊這些 magic mouse,每個 magic mouse 被敲擊後,將會增加相應的遊戲分值。問題是這些 magic mouse 不會傻傻地等你去敲擊,它總會在冒出一會時間後又鉆到地板下面去(而且再也不上來),每個 magic mouse 冒出後停留的時間可能是不同的,而且每個 magic mouse 被敲擊後增加的遊戲分值也可能是不同,為了勝出,hkd 就必須根據每個 magic mouse 的特性,有選擇地盡快敲擊一些 magic mouse,使得總的得分最大。

  這個極具挑戰性的遊戲 hkd 特別喜歡,最近他經常在星期天上午玩這個遊戲,慢慢地他不但敲擊速度越來越快(敲擊每個 magic mouse 所需要的耗時是 1 秒),而且他還發現了遊戲的一些特征,那就是每次遊戲重新開始後,某個 magic mouse 冒出來後停留的時間都是固定的,而且他記錄了每個 magic mouse被敲擊後將會增加的分值。於是,他在每次遊戲開始後總能有次序地選擇敲擊不同的 magic mouse,保證每次得到最大的總分值。

Input

輸入包含 3 行,第一行包含一個整數 n(1<=n<=100)表示有 n magic mouse 從地上冒出來,第 n 個用空格分隔的整數表示每個 magic mouse 冒出後停留的時間,第三行 n 個用空格分隔的整數表示每個 magic mouse 被敲擊後會增加的分值(<=100)。每行中第 i 個數都表示第 i magic mouse 信息。

Output

輸出只有一行一個整數,表示 hkd 所能獲得的最大遊戲總分值。

Example

Input

5

5 3 6 1 4

7 9 2 1 5

Output

24

題目大整容!!!

2.1052 地鼠遊戲

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鉆石 Diamond 題目描述 Description

王鋼是一名學習成績優異的學生,在平時的學習中,他總能利用一切時間認真高效地學習,他不但學習刻苦,而且善於經常總結、完善自己的學習方法,所以他總能在每次考試中得到優異的分數,這一切很大程度上是由於他是一個追求效率的人。

但王鋼也是一個喜歡玩的人,平時在學校學習他努力克制自己玩,可在星期天他卻會抽一定的時間讓自己玩一下,他的爸爸媽媽也比較信任他的學習能力和學習習慣,所以在星期天也不會象其他家長一樣對他抓緊,而是允許他在星期天上午可以自由支配時間。

地鼠遊戲是一項需要反應速度和敏捷判斷力的遊戲。遊戲開始時,會在地板上一下子冒出很多地鼠來,然後等你用榔頭去敲擊這些地鼠,每個地鼠被敲擊後,將會增加相應的遊戲分值。問題是這些地鼠不會傻傻地等你去敲擊,它總會在冒出一會時間後又鉆到地板下面去(而且再也不上來),每個地鼠冒出後停留的時間可能是不同的,而且每個地鼠被敲擊後增加的遊戲分值也可能是不同,為了勝出,遊戲參與者就必須根據每個地鼠的特性,有選擇地盡快敲擊一些地鼠,使得總的得分最大。

這個極具挑戰性的遊戲王鋼特別喜歡,最近他經常在星期天上午玩這個遊戲,慢慢地他不但敲擊速度越來越快(敲擊每個地鼠所需要的耗時是1秒),而且他還發現了遊戲的一些特征,那就是每次遊戲重新開始後,某個地鼠冒出來後停留的時間都是固定的,而且他記錄了每個地鼠被敲擊後將會增加的分值。於是,他在每次遊戲開始後總能有次序地選擇敲擊不同的地鼠,保證每次得到最大的總分值。

輸入描述 Input Description

輸入包含3行,第一行包含一個整數n(1<=n<=100)表示有n個地鼠從地上冒出來,第二行n個用空格分隔的整數表示每個地鼠冒出後停留的時間,第三行n個用空格分隔的整數表示每個地鼠被敲擊後會增加的分值(<=100)。每行中第i個數都表示第i個地鼠的信息。

輸出描述 Output Description

輸出只有一行一個整數,表示王鋼所能獲得的最大遊戲總分值。

樣例輸入 Sample Input

5

5 3 6 1 4

7 9 2 1 5

樣例輸出 Sample Output

24

數據範圍及提示 Data Size & Hint

分類標簽 Tags 點此展開

動態規劃 貪心 堆 樹結構 思路: 考場思路:純貪心,按時間排序,如果時間相同按價值排序,那麽從時間短的開始打地鼠,打一個其他時間都跟著減1s,如果碰到時間相同的就打價值大的。。。mmp這麽大的坑,我當時是腦抽了嗎??如果時間短的很多,價值卻都很小,那麽時間大價值也大的就不能選。。。orz AC思路:貪心+並查集 詳解見xxy博客 xxy開講啦 為什麽要用並查集呢??? xxy是這樣解釋的:

開始的時候所有的fa[i]=i,表示從第i秒往前第一個可以打地鼠的時間就是第i秒

一秒只能打一個,第3秒已經打了第一只,如果還有一只要在3秒內打完,最晚用第2秒 2333。。。

上代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define M 200033
using namespace std;

int f[M],n,ans;
struct Mouse{
    int t,v;
}mouse[M];

int find(int x) {
    if(f[x] != x) f[x]=find(f[x]);
    return f[x];
}

int cmp(Mouse a,Mouse b) {
    return a.v > b.v;
}

int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++)    scanf("%d",&mouse[i].t);
    for(int i=1; i<=n; i++) scanf("%d",&mouse[i].v);
    sort(mouse+1,mouse+n+1,cmp);
    for(int i=1; i<=100; i++) f[i]=i;
    for(int i=1; i<=n; i++) {
        int no = find(mouse[i].t);
        if(no) {
            f[no]=f[no-1];
            ans+=mouse[i].v;
        }
    }
    printf("%d",ans);
    return 0;
}

3.上白澤慧音

Description

  在幻想鄉,上白澤慧音是以性格怪異聞名的生物學家。他養了 N 只猴子。有一天,這些被月光刺激,發生了變異。猴子們進行了一次奇怪的活動。第一只猴子的尾巴掛在樹上,剩下的 N-1 只,要麽被其他的猴子抓住,要麽抓住了其他的猴子,要麽兩者均有。當然一只猴子最多抓兩只另外的猴子。現在給出這 N 只猴子抓與被抓的信息,並且在某個時刻可能某只猴子抓累了,會放掉它其中一只手的猴子,導致某些猴子落地。上白澤慧音想知道每只猴子落地的時間。

Input

第一行兩個數 N、M,表示有 N 只猴子,並且總時間為 M-1。接下來 N 行,描述了每只猴子的信息,每行兩個數,分別表示這只猴子左手和右手抓的猴子的編號,若果是-1,表示該猴子那只手沒抓其他猴子。再接下來 M 行,按時間順序給出了一些猴子放手的信息,第 1+N+i 行表示第 i-1 時刻某只猴子的放手信息,信息以兩個數給出,前者表示放手的猴子編號,後者表示其放的是哪只手,1 2 右。

Output

共輸出 N 行,第 i 行表示第 i 只猴子掉落的時刻,若第 i 只猴子島 M-1 時刻以後還沒掉落,就輸出-1。

Example

Input

3 2

-1 3

3 -1

1 2

1 2

3 1

Output

-1

1

1

Hint

30%的數據,N≤1000,M≤1000;

100%的數據,1≤N≤200000,1≤M≤400000。

題目大整容!!!

P1653 猴子 【暫停提交】

題目描述

有N只猴子,第一只尾巴掛在樹上,剩下的N-1只,要麽被其他的猴子抓住,要麽抓住了其他的猴子,要麽兩者均有。當然一只猴子最多抓兩只另外的猴子。現在給出這N只猴子抓與被抓的信息,並且在某個時刻可能某只猴子會放掉它其中一只手的猴子,導致某些猴子落地。求每只猴子落地的時間。

輸入輸出格式

輸入格式:

第一行兩個數N、M,表示有N只猴子,並且總時間為M-1。接下來N行,描述了每只猴子的信息,每行兩個數,分別表示這只猴子左手和右手抓的猴子的編號,若果是-1,表示該猴子那只手沒抓其他猴子。再接下來M行,按時間順序給出了一些猴子放手的信息,第1+N+i行表示第i-1時刻某只猴子的放手信息,信息以兩個數給出,前者表示放手的猴子編號,後者表示其放的是哪只手,1左2右。

【數據規模】

30%的數據,N≤1000,M≤1000;

100%的數據,1≤N≤200000,1≤M≤400000。

輸出格式:

共輸出N行,第i行表示第i只猴子掉落的時刻,若第i只猴子島M-1時刻以後還沒掉落,就輸出-1。

輸入輸出樣例

輸入樣例#1:
3 2
-1 3
3 -1
1 2
1 2
3 1
輸出樣例#1:
-1
1
1
詳解見m大神的博客

自己選的路,跪著也要走完!!!

7.2模擬賽