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