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

9.26模擬賽

code left ostream 進行 類型 科技 logs 背景 不但

NOIP 2017 全真模擬沖刺

---LRH&&XXY

題目名稱

那些年

鐵路計劃

毀滅

題目類型

傳統

傳統

傳統

可執行文件名

years

trainfare

destroy

輸入文件名

years.in

trainfare.in

destroy.in

輸出文件名

years.out

trainfare.out

destroy.out

每個測試點時限

1.5s

1.0s

1.0s

內存限制

256 MB

256 MB

256 MB

測試點數目

20

20

20

每個測試點分值

5

5

5

技術分享

技術分享

技術分享

技術分享

技術分享

40分

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;

LL od,t;
inline LL read(){
    char ch=getchar();LL x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch==-)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-0;
    return x*f;
}

LL GCD(LL x,LL y){
    
return y==0?x:GCD(y,x%y); } LL gcd(LL a,LL b,LL &x,LL &y){ if(b==0){ x=1; y=0; return a; } LL r=gcd(b,a%b,x,y); LL tmp=0; tmp=x; x=y; y=(tmp-(a/b)*y); return r; } void slove1(){ t=read(); for(register LL i=1;i<=t;i++){ LL a,p,x,y; a=read();p=read(); LL r=gcd(a,p,x,y); while(x<0)x=p+x; printf("%I64d\n",x); } } void slove2(){ t=read(); for(register int i=1;i<=t;i++){ LL a,p; a=read();p=read(); printf("4\n1\n16\n6\n48\n"); } } void slove3(){ t=read(); for(register int i=1;i<=t;i++){ LL n,m,ans=0; n=read();m=read(); for(LL p=1;p<=n;p++) for(LL q=1;q<=m;q++) ans+=GCD(p,q); printf("%I64d\n",ans); } } void slove4(){ t=read(); for(register int i=1;i<=t;i++){ LL n,ans=0;n=read(); for(int j=1;j<=n;j++)ans+=n/j; printf("%I64d\n",ans); } } int main(){ freopen("years.in","r",stdin); freopen("years.out","w",stdout); od=read(); if(od==1)slove1(); if(od==2)slove2(); if(od==3)slove3(); if(od==4)slove4(); fclose(stdin);fclose(stdout); return 0; }

運輸計劃

【題目背景】

公元 2044 年,人類進入了宇宙紀元。

【題目描述】

L 國有 n 個星球,還有 m 條雙向航道,每條航道建立在兩個星球之間,這 m條航道連通了 L 國的所有星球。為了方便,我們規定1號星球為好星球。

在好星球上,小 P 掌管一家物流公司,該公司有m個運輸計劃。第i個運輸計劃形如:有一艘物流飛船需要從 ui 號星球飛行到相鄰的vi 號星球去。對於航道 j,飛船駛過它所花費的時間為 tj。開始所有的tj都是1秒。但星球居民對運輸計劃極其不滿。

為了鼓勵科技創新,L 國國王允許小 P 使用魔法到某個運輸計劃上,飛船駛過被施魔法的航道消耗時間為2秒,一個運輸計劃最多只能被施加1次魔法,每年小p只能使用一次魔法。

由於居民不識數,改為2秒後他們感覺飛船跑得颼颼快,於是就可能會對好星球上的小p產生滿意度。好星球每一年都會對居民進行一次滿意度調查。如果一個星球上的居民到好星球的時間增加了,他們就會對小P的物流公司產生1點滿意度。好星球上的居民永遠不會對小p的物流公司產生滿意度。

在計劃實施前,你需要幫助小p的物流公司統計出未來的每一年中,各將有多少個星球的居民對好星球有滿意度。

【輸入描述】

第一行包含三個整數N、M、Q 分別表示宇宙中星球數,小P的運輸計劃數和運輸計劃將要實施的年數。

接下來M行,其中第i行包含兩個整數ui,v1表示第i條航線鏈接ui和vi兩個星球。

接下來Q行其中第j行包含一個整數Rj,表示計劃實行後第j年將會對第Rj個運輸計劃施魔法。

【輸出描述】

一共Q行 其中第j行表示第j年有多少星球的居民對好星球上小p的物流公司產生了滿意度。

【數據範圍及約定】

對於24%的數據,滿足以下條件 N<=100 M<=4950 Q<=30

對於48%的測試數據 滿足以下條件:Q<=30

對於另外 32%的測試數據,滿足以下條件:正確輸出中不同數字<=50種。

對於全部測試數據 滿足以下條件:

2 <= N <= 100 000 , 1 <= Q <= M <= 200 000

1 <= ui ,vi <=N, ui、vi不相等 , 1 <= Rj <=M 。

題目大意:求每次將某條邊+1後,有多少個點到1的最短路改變。

35分 q遍spfa

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define maxn 100005
using namespace std;
queue<int>q;
int n,m,qx,sumedge;
int head[maxn],dis[maxn],g[maxn],inq[maxn];

inline int read(){
    char ch=getchar();int x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch==-)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-0;
    return x*f;
}

struct Edge{
    int x,y,z,nxt;
    Edge(int x=0,int y=0,int z=0,int nxt=0):
        x(x),y(y),z(z),nxt(nxt){}
}edge[maxn<<2];

void add(int x,int y,int z){
    edge[++sumedge]=Edge(x,y,z,head[x]);
    head[x]=sumedge;
}

inline void spfa(){
    while(!q.empty())q.pop();
    memset(dis,127/3,sizeof(dis));
    memset(inq,0,sizeof(inq));
    dis[1]=0;inq[1]=1;q.push(1);
    while(!q.empty()){
        int now=q.front();q.pop();inq[now]=0;
        for(int i=head[now];i;i=edge[i].nxt){
            int v=edge[i].y;
            if(dis[v]>dis[now]+edge[i].z){
                dis[v]=dis[now]+edge[i].z;
                if(!inq[v]){
                    inq[v]=1;
                    q.push(v);
                }
            }
        }
    }
}
 
int Spfa(){
    while(!q.empty())q.pop();
    memset(g,127/3,sizeof(g));
    memset(inq,0,sizeof(inq));
    g[1]=0;inq[1]=1;q.push(1);
    while(!q.empty()){
        int now=q.front();q.pop();inq[now]=0;
        for(int i=head[now];i;i=edge[i].nxt){
            int v=edge[i].y;
            if(g[v]>g[now]+edge[i].z){
                g[v]=g[now]+edge[i].z;
                if(!inq[v]){
                    inq[v]=1;
                    q.push(v);
                }
            }
        }
    }
    int js=0;
    for(register int i=1;i<=n;i++)
     if(dis[i]!=g[i])js++;
     return js;
}
int main(){
    freopen("trainfare.in","r",stdin);
    freopen("trainfare.out","w",stdout);
    n=read();m=read();qx=read();
    for(register int i=1;i<=m;i++){
        int x,y;
        x=read();y=read();
        add(x,y,1);add(y,x,1);
    }
    spfa();
    for(register int i=1;i<=qx;i++){
        int x;x=read();
        edge[x*2].z++;edge[x*2-1].z++;
        printf("%d\n",Spfa());
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

毀滅

【題目背景】

在神秘的玄靈大陸上生活著曲墨兩個部族,他們世代對立。

曲族新任族長曲香檀為了壯大曲族,大開殺戮,纖纖素手,沾滿鮮血。一日,她喬裝遇刺,身負重傷。

墨族神醫墨連城,被女子的美貌所吸引,不但救了她,兩人同時墜入愛河。

曲香檀竭盡全力隱瞞身份,新謊言掩蓋了舊謊言,最終仍誤會成塔,她離開了他,繼續她的殺戮,繼續她的族長之路。

連城不忍心愛之人雙手沾滿獻血,在曲香檀即將開展下一次殺戮時,他決定阻止她——破壞曲族內部聯絡通道,不惜代價......

【題目描述】

曲族在玄靈大陸有n個聚居地,當初曲香檀為了方便調配族人,在族人的聚居地之間開辟了許多雙向空間隧道,保證任意兩個聚居地可以直接或間接連通。同時為了節省資源對抗墨族,所以任意兩個聚居地之間有且只有一條空間隧道可以直接或間接到達。現在為了抵禦墨連城,曲香檀又耗費玄力,打通了m條雙向地下暗河,但這m條暗河不能惠及每一個聚居地。曲族內部既可以通過空間隧道聯絡,也可以用地下暗河,當然也可以兩者都用。

墨連城之前治療曲香檀,耗費了大半玄力。又通過各種方法獲取曲族新的聯絡網,玄力更是所剩無幾。所以他決定僅破壞1條空間隧道和1條地下暗河。破壞後,只要曲族內部有任意2個聚居地不能互達,連城就成功了。想在,他想知道有多少種方式可以破壞曲族的內部聯絡。

【輸入描述】

第一行包含兩個整數n和m。

接下來n-1行,每行兩個整數x,y,表示x和y之間有一條雙向空間隧道。

接下來m行,每行兩個整數x,y,表示x和y之間有一條雙向地下暗河。

【輸出描述】

一行表示答案

【樣例輸入1】

4 1

1 2

2 3

1 4

3 4

【樣例輸出1】

3

【註意】

樣例2與樣例3請看下發子文件夾

樣例1解釋:

地下暗河只有1條,3空間隧道任選一條都可以使曲族內部不連通,總共有3種方式

樣例2與樣例3不解釋

【輸出描述】

一行表示答案

【樣例輸入1】

4 1

1 2

2 3

1 4

3 4

【樣例輸出1】

3

【註意】

樣例2與樣例3請看下發子文件夾

樣例1解釋:

地下暗河只有1條,3空間隧道任選一條都可以使曲族內部不連通,總共有3種方式

樣例2與樣例3不解釋

【子任務】

測試點編號

N=

M=

特殊性質

1

10

10

2

100

100

3、4

500

500

5、6、7

3000

3000

8、9、10

8000

1000

11

100000

50000

1、空間隧道構成一條鏈

2、每條地下暗河連通兩個相鄰聚居地

3、不會有兩條地下暗河連通相同的聚居地

12

100000

70000

13

100000

90000

14、15、16

100000

100000

17、18、19、20

100000

1000000

題目大意:求切一條樹邊和非樹邊使圖不連通有多少種方法

10分 md判斷聯通不連通應該用bfs...我這個傻叉用的kruskal....氣哭...

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,m,fa[100005];
long long ans;

struct Edge{
    int x,y,exit;
}e[200008];

inline int read(){
    char ch=getchar();int x=0,f=1;
    for(;!isdigit(ch);ch=getchar())if(ch==-)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-0;
    return x*f;
}

int f(int x){
    return fa[x]==x?x:fa[x]=f(fa[x]);
}

bool cut(int p,int q){
    int cnt=n;
    for(register int i=1;i<=n;i++)fa[i]=i;
    e[p].exit=0;e[q].exit=0;
    for(register int i=1;i<=n-1+m;i++){
        if(e[i].exit==0)continue;
        int fx=f(e[i].x),fy=f(e[i].y);
        if(fx!=fy){
            fa[fx]=fy;
            cnt--;
        }
    }
    e[p].exit=1;e[q].exit=1;
    return cnt!=1;
}

int main(){
    freopen("destroy.in","r",stdin);
    freopen("destroy.out","w",stdout);
    n=read();m=read();
    for(int i=1;i<n;i++){
      e[i].x=read();e[i].y=read();e[i].exit=1;
    }
    int k=n-1;
    for(int i=1;i<=m;i++){
        e[++k].x=read();e[k].y=read();e[k].exit=1;
    }
    for(int i=n;i<=m+n-1;i++)
        for(int j=1;j<n;j++)
            if(cut(i,j))++ans;
    printf("%I64d",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}

9.26模擬賽