noip赛后分析 噫

来源:互联网 发布:致命id人物解析知乎 编辑:程序博客网 时间:2024/06/09 16:40

虽然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


0 0