noip賽後分析 噫

雖然noip渣的要死鹹魚但是賽後分析還是要做的噫ʕ •ᴥ•ʔ


第一道不說 乍一看以爲無限揹包尷尬
第二道代碼不貼出來 其實就是枚舉兩頭的年份然後判斷年份倒過來合不合法
我似乎是不會說我第二題並沒有AC


很尷尬的是我下面兩道題都沒有拿到分哦




第三題
小K是一個海港的海關工作人員,每天都有許多船隻到達海港,船上通常有很多來自不同國家的乘客。
小K對這些到達海港的船隻非常感興趣,他按照時間記錄下了到達海港的每一艘船隻情況;對於第i艘到達的船,他記錄了這艘船到達的時間ti (單位:秒),船上的乘客數星ki,以及每名乘客的國籍 x(i,1), x(i,2),…,x(i,k);。
小K統計了n艘船的信息,希望你幫忙計算出以每一艘船到達時間爲止的24小時(24小時=86400秒)內所有乘船到達的乘客來自多少個不同的國家。
形式化地講,你需要計算n條信息。對於輸出的第i條信息,你需要統計滿足 ti - 86400 < tp <= ti的船隻p,在所有的x(p,j)中,總共有多少個不同的數。


正解到底是線段樹還是分塊orz


都不是,就是一個巨大的哈希(; ̄ェ ̄)
先貼代碼 洛谷AC


#include<iostream>
#include<vector>
using namespace std;
int n,t[100100],c[100100],k[100100];//c[0] O(1) 維護C[0]
vector <int> v[100100];
int main()
{
    scanf("%d",&n);
    int tmp,pre=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&t[i],&k[i]);
        for(int j=1;j<=k[i];j++)
        {
            scanf("%d",&tmp);
            v[i].push_back(tmp);                                                
            if(c[tmp]==0)c[0]++;//以前沒有現在有了 c[0]++
            c[tmp]++;
        }
        for(pre;pre<i;pre++)//去掉guoshide
        {
            if(t[pre]+86400-1>=t[i]) break;
            for(int x=0;x<v[pre].size();x++)
            {
                c[v[pre][x]]--;
                if(c[v[pre][x]]==0) c[0]--;//去掉就沒了 C[0]--
            }
        }
        printf("%d\n",c[0]);  //輸出維護c[0]
    }
    return 0;
}
才知道可以開這麼大 汗。。。


嗯好第四題 噫 微笑


#include<iostream>
using namespace std;
int n,d[41000],m,a[16000],ss1[16000],ss2[16000],ps1[16000],ps2[16000];
int ans[16000][5];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&d[i]);
        a[d[i]]++;
    }
    for(int L=(n+8)/9;L>=1;L--)
    {
        for(int i=n-L;i>=1;i--)
            ss1[i]=a[i]*a[i+L];
        for(int i=n-L;i>=1;i--)
            ss2[i]=ss2[i+1]+ss1[i];
        for(int i=1+2*L;i<=n;i++)
            ps1[i]=a[i]*a[i-2*L];
        for(int i=1+2*L;i<=n;i++)
            ps2[i]=ps2[i-1]+ps1[i];
        for(int i=1;i<=n;i++)
        {
            if(i+8*L+1<=n)
                ans[i][1]+=a[i+2*L]*ss2[i+8*L+1];
            if(i-2*L>=1 && i+6*L+1<=n)
                ans[i][2]+=a[i-2*L]*ss2[i+6*L+1];
            if(i+L<=n && i-6*L-1>=1)
                ans[i][3]+=a[i+L]*ps2[i-6*L-1];
            if(i-7*L-1>=1)
                ans[i][4]+=a[i-L]*ps2[i-7*L-1];
        }
    }
    for(int i=1;i<=m;i++)
    {
        printf("%d %d %d %d\n",ans[d[i]][1],ans[d[i]][2],ans[d[i]][3],ans[d[i]][4]);
    }
    return 0;
}
好吧我只好說這道洛谷並沒有AC 最後一個點TLE 反正思想其實是對的誒
六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。


大魔法師有m個魔法物品,編號分別爲1,2,...,m。每個物品具有一個魔法值,我們用Xi表示編號爲i的物品的魔法值。每個魔法值Xi是不超過n的正整數,可能有多個物品的魔法值相同。


大魔法師認爲,當且僅當四個編號爲a,b,c,d的魔法物品滿足xa<xb<xc<xd,Xb-Xa=2(Xd-Xc),並且xb-xa<(xc-xb)/3時,這四個魔法物品形成了一個魔法陣,他稱這四個魔法物品分別爲這個魔法陣的A物品,B物品,C物品,D物品。


現在,大魔法師想要知道,對於每個魔法物品,作爲某個魔法陣的A物品出現的次數,作爲B物品的次數,作爲C物品的次數,和作爲D物品的次數


a     b      c      d
   2t    >3t     t


設cd的差是t 就是說ab的差是2t,bc的差大於3t,但是枚舉的是從3t+1開始,並不是4t


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章