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 陣列表示陣列裡面這個長度的連續遞增序列的個數,由於這個序列...