wxy 4 9 牛客訓練賽50重現

2022-09-25 00:57:09 字數 3037 閱讀 5573

v>

wxy 4.9 牛客訓練賽50重現

5220

a給乙個字串,如果相同的字母都連在一起,那麼就是令人心情愉悅。如果前面和現在是同乙個字母,

那麼就更新該字母的位置,如果前面不是該字母但是該字母的,f陣列之前更新過,那麼就說明這個字母

不只一段。

題解從總長度入手。

b模擬hash雜湊表的操作過程,採用記憶化搜尋,r[x mod n ]記錄原本應該在x mod n上的現如今應該在

**,也就是該段至今延申最右邊是什麼地方。

再次理解記憶化搜尋,實質是以搜尋實現的dp,一定要將搜過的記入下來,而且只考慮當前狀態由什麼

狀態轉移而來,不考慮子狀態如何得來

# include

using namespace std;

const int maxn=1e6+100;

int a[maxn],r[maxn],ans[maxn];

int n;

int dfs(int id)

r[id]=dfs((r[id]+1)%n);

return r[id];

}int main()

for(int i=0;iint id=a[i]%n;

if(ans[id]==-1)else

}for(int i=0;iprintf("%d ",ans[i]);

}題解做法,並查集,將x mod n 放在同乙個集合中,在x位置插入後,合併x和(x+1)%n,把後者作為祖先

c寫貪心寫了乙個小時,然後因為乙個,一直過不了,然後改成三分寫法,順利卡過,三分牛逼。。。不

過r和l的差距放到400,可能如果資料再強一點就過不了了

return 0;

}# include

using namespace std;

typedef long long ll;

const int maxn=1e5+100;

struct nodenode[maxn];

int cmp(node a,node b)

int n;

ll cal(int mid)

return cans;

}int main()

sort(node+1,node+n+1,cmp);

int l=0,r=n,lmid,rmid;

while(r-l>400)

ll ans=0;

for(int i=l;i<=r;++i)

printf("%lld\n",ans);

return 0;

}題解做法,首先按照siz排序,應為一堆中之取決於siz最低的那乙個,然後如果當前佇列中的比當前要

求的siz大,那麼就把小的pop出來,每次都比較取最大即可

d在某一點可以選擇改變以後所有的邊的權重,對i來說,只能在 i到n範圍內選乙個點修改,則正著用a跑

一遍dij,反著用b跑一遍dij,對於ans[i]來捉他可能時ans[i-1 ]還可能是d[i]+d1[i],採用堆優化的dij,否則會

t想清楚複雜度用那乙個板子和存圖方式,然後還是不熟練,一改在半個小時內改出來,雖然c耽擱了很

久沒在比賽時寫出來,賽後也寫了乙個小時左右。

# include

using namespace std;

typedef long long ll;

typedef pairpii;

const int maxn=1e5+100;

pii a[maxn];

priority_queue,greater> q;

int main()

sort(a,a+n,greater());

ll ans=0,sum=0;

for(int i=0;iq.push(a[i].second); sum+=a[i].second;

while(q.size()>a[i].first)

ans=max(ans,sum);

}printf("%lld\n",ans);

return 0;

}# include

using namespace std;

typedef long long ll;

typedef pairp;

const int maxn=2e5+100;

const ll inf=0x3f3f3f3f3f3f3f3f;

int n,m,s,t;

struct nodenode[maxn];

ll ans[maxn];struct edge

};vectoredges;

vectorg[maxn];

int done[maxn];

ll d[maxn];

void add(int u,int v,ll w)

void dij()}}

}void solve()

dij();

}vectoredges1;

vectorg1[maxn];

int done1[maxn];

ll d1[maxn];

void add1(int u,int v,ll w)

void dij1()}}

}void solve1()

dij1();

}int main()

scanf("%d%d",&s,&t);

solve();

solve1();

for(int i=n;i;i--)

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

return 0;

}如何壓複雜度:搞乙個字首和,把i之前所有符合條件的dp都加起來

所以由如上優化,cnt表示當前字串字首和,如果當前為0,那麼dp[i]=ans之前拿到所有和,如果當

前為s[i]=='0'那麼不能在i之前切割,說明dp[i-1]不包括在後面的數的字首和中減去,ans加上當前的dp

值,並不區分只要當前和能整除3,就當作可以切割的,如果後面的為0,則在下乙個把前面多加的減去。f

ntt待補

還是要多練,不管是心態或者是快速寫出解法的能力,放平心態。

牛客訓練賽1

honoka和格點三角形 只有兩種三角形,底邊為2,高為1和底邊為1,高為2 1,直角三角形 4 n 1 m 2 4 n 2 m 1 2,底邊在x軸,為2 2 m 2 m 2 n 1 2,底邊在y軸,為2 2 n 2 n 2 m 1 3,底邊在x軸,為1 2 m 1 m 2 n 2 4,底邊在y軸,...

題解 牛客寒假訓練賽1

牛客寒假訓練賽1,自己水平還是太差了。a 題意 有計算符號和結果,求最初的數 思路 簡單模擬 include define ll long long struct note a 101 int main printf lld k return 0 b 給定2,0,4的數量,對其進行排列,計算1 i的...

牛客訓練賽25 A 最長區間

這題問最長的嚴格連續遞增序列的最長長度是多少?最開始感覺這道題不可做,因為有1e5個點,還有1e5的運算元 可是後來發現。這題水的一匹a i 和y都是在1 100的範圍內部 不如這樣,我用乙個d i 陣列記錄連續遞增的長度大小,用cnt i 陣列表示陣列裡面這個長度的連續遞增序列的個數,由於這個序列...