1. 程式人生 > >SDWC補題計劃--基礎班DAY1

SDWC補題計劃--基礎班DAY1

課件 什麽 1-n code set 就是 TE clu lap

  2018的寒假去了SD的冬令營,因為一班二班難度懸殊,對我很不友好,幾乎什麽也沒學會,但是我把兩個班的課件都存了下來,現在慢慢把兩個班的例題以及課後題都補一補(畢竟冬令營的錢不能白花)。

這些題目橫跨各大知名題庫以及一大批外國題庫,以至於我註冊了一批新賬號......

基礎班DAY1:

  這一天的課事實上我並沒有去聽,而是去二班考試並愉快的爆零了,幸好不大難,自己看也能學會。

  DAY1主要講了隊列,棧,堆,(加權)並查集。還提出了“因為數組也是數據結構,所以一切題目都是數據結構題”的精彩言論。

  

  UVA514 Rails:https://www.luogu.org/problemnew/show/UVA514

題目概述:(火車,鐵軌,車廂……)有一個無限大的棧,按照1-n的順序依次入棧,詢問是否能生成給定的出棧序。

  棧的題目,模擬。以前練習初賽時見過這種題的手畫版本...事實上也就是那個思路。如果現在想讓一個數出棧,可是它還沒入棧,就不停的入棧直到它入棧後再彈出;如果它已經在棧裏,則必須是棧頂,否則就無法生成這個序列。這題在洛谷上難度虛高,主要是讀入很奇妙;輸出時如果n將要變化了,要換行,樣例裏卻沒換,導致很容易wa。

技術分享圖片
# include <cstdio>
# include <iostream>
# include <cstring>

using namespace
std; int n; int a[1005],sta[1005],h=0,q=0,s=0; int main() { scanf("%d",&n); while (n) { memset(a,1,sizeof(a)); scanf("%d",&a[1]); while (a[1]!=0) { for (int i=2;i<=n;i++) scanf("%d",&a[i]); q=s=1; h
=0; for (int i=1;i<=n;++i) { while(s<=a[i]) sta[++h]=s++; while(sta[h]==a[q]) q++,h--; } if(s!=n+1||h!=0||q!=n+1) printf("No\n"); else printf("Yes\n"); scanf("%d",&a[1]); } printf("\n"); scanf("%d",&n); } return 0; }
Rails

  

   NOI2001 食物鏈:https://www.luogu.org/problemnew/show/P2024

   題目概述:有三種動物,食物關系竟然形成了一個環(好不科學啊),給出一些描述:A被B吃,A吃B,A與B是同類,默認先說的話是正確的,並以此判斷一共有幾句假話。

  大概是加權並查集最著名的習題了,也可以不用加權做,註意一下加權並查集的路徑壓縮,還是挺容易寫錯的。

   技術分享圖片
int father(int x)
{
    if (x!=f[x])
    {
        int aa=father(f[x]);
        v[x]=(v[x]+v[f[x]])%3;
        f[x]=aa;
    }
    return f[x];
}
加權並查集_路徑合並

  有一個地方一定要想清楚,在同一個並查集裏的元素並不一定是同種生物,只是可以確定相對的關系,如果這裏明白了也就比較簡單了。

帶權並查集的集合合並也別寫錯啦...就是解一個方程。

  技術分享圖片

  技術分享圖片
# include <cstdio>
# include <iostream> 

using namespace std;

int f[50005]={0},v[50005]={0};

int n,k,x,y,z,S=0;

int father(int x)
{
    if (x!=f[x])
    {
        int aa=father(f[x]);
        v[x]=(v[x]+v[f[x]])%3;
        f[x]=aa;
    }
    return f[x];
}

bool Ya(int x,int y,int z)
{
    int a=father(y);
    int b=father(z);
    if (a==b)
    {
        if(x==1)
        {
            if(v[y]==v[z]) return true;
            return false;    
        }
        if (x==2)
        {
            if(v[z]-v[y]!=-2&&v[z]-v[y]!=1) return false;
            return true;
        }    
    }
    if (a!=b)
    {
        if(x==1)
        {
            v[b]=(v[y]-v[z]+3)%3;
            f[b]=a;                
        }
        if (x==2)
        {
            v[b]=(v[y]-v[z]+4)%3;
            f[b]=a;
        }
        return true;
    }
}

int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
    {
        f[i]=i;
        v[i]=0;
    }
    for (int i=1;i<=k;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        if (z>n||y>n)
            S++;
        else 
        if (y==z&&x==2) S++;
        else
        if (Ya(x,y,z)==false) S++;
    }
    printf("%d",S);
    return 0;
}
食物鏈

 

SDWC補題計劃--基礎班DAY1