JSOI2014 解題報告 小結

2022-05-02 02:00:17 字數 1893 閱讀 5515

考的主要是dp、貪心、資料結構這一些,還有網路流的題因為還沒學就先暫時沒寫,有時間還是要把沒學的東西給補上來,同時也要多做一點省選的題目提高思維能力

三分+貪心,可以感性理解一下這個能宅的天數與叫外賣的次數為什麼是乙個單峰函式,如果叫外賣叫的少,那麼費用就高,叫外賣叫的多,那麼給外賣小哥的錢就很多,那麼我們要使它們均衡,讓能宅的天數達到峰值,三分一下叫外賣的次數

然後就是貪心,對於每一次叫外賣,按照食品的**排個序,從便宜的開始,能選多少選多少

#include#define int long long

using namespace std;

struct node

a[203];

int m,f,n,l,r,midl,midr;

int cmp(node nx,node ny)

ans=now*x,las+=w*x;

for(int i=loc;i<=n;i++)

if(a[i].s>=now&&a[i].p<=las)

num=min(las/a[i].p,x),ans+=num,las-=num*a[i].p;

return ans;

}signed main()

cout《這道題太巧妙了,我們先設\(f[i]\)表示消滅第\(i\)個怪獸所需要的最小體力,然後可以很顯然的得出\(f[i]=min(k[i],s[i]+\sum_^f[son[i][j]])\),看上去可以dp,但實際上並不行因為他可能有環,有後效性

然後,巧妙地點就在這裡,可以發現這個式子有點像spfa的鬆弛操作,於是我們先把所有的\(f[i]\)設為\(k[i]\)併入隊,然後就可以進行鬆弛

#include#define int long long

using namespace std;

inline int rd()

int n,s[200003],k[200003],dis[200003],x,y,vis[200003],p,sum,ans;

vectorl[200003],g[200003];

queueq;

signed main()

for(int i=1;i<=n;i++)

while(!q.empty())

f[j]+s_j*dis(i,j)\),其中\(s_j\)是\(j\)子樹中的葉子個數

\(dp[i]\)的轉移要相對複雜一些,先設\(dp[i]\)為\(f[i]\),然後枚舉子節點,先考慮不能存檔,那麼就跟上面的一樣為\(f[j]+s_j*dis(i,j)\),然後再考慮可以在子節點存檔,那麼存檔後我們還要在從根走到\(i\),最短時間為\(dp[j]+dis(i,j)+dis(root,i)\),但我們還發現有乙個子節點是可以不用走回頭路的,所以有乙個可以不用加\(dis(root,i)\),列舉一下是哪乙個

#include#define int long long

using namespace std;

int n,k,y,w,s[1000003],f[1000003],dp[1000003];

vectorl[1000003],l1[1000003];

void dfs(int x1,int d)

int cmp(const int &nx,const int &ny)

void down(int l1,int r1) }

void addja(int l1,int r1,int num)

void addch(int l1,int r1,int num)

int ask(int l1,int r1)

signed main()

else if(typ==1)

else

printf("%lld\n",ask(l,r));

} return 0;

}

JSOI2014 學生選課

傳送門 看到這題首先可以二分。考慮對於當前的 mid 如何 text 我們用 f 來表示 i 對 j 的好感度排名,那麼對於兩個人 i j 如果有 max f mid 那麼顯然這兩個人是不能上同乙個老師的課的。而且每個人可以上的課只有兩種,我們記為 a 假設 i j 對於當前的 mid 而言不能分在...

JSOI2014 歌劇表演

傳送門 沒想到吧我半夜切的 這道題應該算是 text 裡面比較簡單的吧。考慮用集合關係來表示分辨關係,具體地說就是我們把所有演員分成若干個集合,滿足同乙個集合內的演員兩兩不能分辨。初始時所有演員位於同乙個集合內。然後對於某次參加了演出的演員,他們可能分別來自不同的集合,那麼這些集合就會有兩類不同的組...

JSOI2014 歌劇表演

我們抽象的認為一些不能互相辨認的人,被分到了乙個集合,每當又有一場演出,就將每個出演的演員扔出集合,再將上次在相同集合的分在同一集合。然後修改被分的集合和被新建立的時間,當集合只有乙個數的時候不可再分。輸出每個演員所在的集合的最後修改時間,僅當該演員所在的集合中只有乙個演員。include incl...