簽到題(然而我陣列開小直接變成暴力分。。。)
發現其實就是第一類斯特林數,然後 \(n^2\) 推就好了。
感覺可以用 ntt 優化成 \(nlogn\) ,但是好像並沒有什麼卵用(再說了,我也不會。。)
#include#define int long long
#define ull unsigned long long
#define f() cout<<"rp++"<'9'||ch<'0')
while(ch>='0'&&ch<='9')
return x*f;
}const int n=3e3+10,mod=998244353;
int n,m,ans,f[n][n];
void add(int &x,int y)
#undef int
int main()
比第一題還水,發現乙個區間 \([l,r]\) 有貢獻當且僅當 \(ch_l\neq ch_r\) 。
直接 \(\mathcal(n)\) 掃一遍就好了。
#include#define int long long
#define ull unsigned long long
#define f() cout<<"rp++"<'9'||ch<'0')
while(ch>='0'&&ch<='9')
return x*f;
}const int n=3e6+10;
int n,ans=1,cnt[30];
char s[n];
#undef int
int main()
可能這個題的做法比較多一些,壯壓圖論均可。
圖論做法就是把四個不同的顏色作為四個點,那麼每一塊蛋糕就成了兩個點之間的連邊。
然後兩條重邊可以看做一條自環,那麼我們列舉選擇的點集問題就變成了在乙個沒有自環重邊的圖上選擇邊使得權值和最大。
如果是尤拉路那麼都可以選,否則刪去一條價值最小的邊就好了。
#include#define int long long
#define ull unsigned long long
#define f() cout<<"rp++"<'9'||ch<'0')
while(ch>='0'&&ch<='9')
return x*f;
}const int n=5e5+10,inf=1e18;
int n,ans,all,val[4],id[100],mn[4][4],d[4][4],du[4];
struct node s[n];
void solve(int sta)
du[s[i].x]++; du[s[i].y]++; mn[s[i].x][s[i].y]=min(mn[s[i].x][s[i].y],s[i].val);
if(!d[s[i].x][s[i].y])
if((sta>>s[i].x)&1) val[s[i].x]+=s[i].val+d[s[i].x][s[i].y];
else val[s[i].y]+=s[i].val+d[s[i].x][s[i].y];
d[s[i].x][s[i].y]=0;
} for(int i=0;i<4;i++) if(((sta>>i)&1) && !du[i] && count(sta)!=1) return ;
for(int i=0;i<4;i++) if((sta>>i)&1) cnt+=val[i];
for(int i=0;i<4;i++) for(int j=i+1;j<4;j++) cnt+=d[i][j];
for(int i=0;i<4;i++) tot+=du[i]&1;
if(tot==2||!tot) return ans=max(ans,cnt),void();
for(int i=0;i<4;i++) for(int j=i+1;j<4;j++)
if(du[i]!=1&&du[j]!=1) minn=min(minn,mn[i][j]);
if(minn!=inf) return ans=max(ans,cnt-minn),void();
}#undef int
int main()
for(int i=1;i<(1<<4);i++) solve(i);
printf("%lld",ans);
return 0;
}
二分答案 dp 均可(然而我考場上只想到了乙個垃圾的 \(n^2\) 傻瓜 dp。。)
二分乙個最小時間,對於乙個點而言,如果左邊有沒有拾起來的卷軸,就應該向左走,可以先向左再向右或者先向右再向左。
對於乙個左邊沒有卷軸的點直接向右走就好了。
#include#define int long long
#define ull unsigned long long
#define f() cout<<"rp++"<'9'||ch<'0')
while(ch>='0'&&ch<='9')
return x*f;
}const int n=3e5+10,inf=2e9;
int n,m,ans,s[n],p[n];
bool check(int tim)
while(pos<=m&&p[pos]<=s[i]+tim) pos++;
} return pos>m;
}#undef int
int main()
printf("%lld",ans);
return 0;
}
noip多校模擬28
考試過程 這次考試,感覺不在狀態。四個題都沒有什麼正解的思路,心態也比較不好。總體來說今天的狀態不是很好,需要及時調整。因為我幾天前做了一道期望題,那個題是資料範圍也是比較小,而且正解是 o n 的,所以這道題我也就一直在想 o n 的做法,想了乙個多小時,沒什麼思路,就直接棄了。但是正解是 o n...
NOIP模擬99 多校31
原題3100,張口放 t1 出題人原話 思維題,合法的情況其實就是上下兩個梯形拼起來的樣子。他們的邊界都是在 i 軸上面,但是不能相交。於是我們可以嘗試兩者相交的縱座標,再列舉左邊梯形的下邊界一級右邊梯形的上邊界,對於答案的話再乘上乙個二。displaystyle sum sum sum binom...
NOIP模擬賽多校聯考 Round7題解
對任意數求分解為2的冪之和有多少種分法。奇怪的遞推。手玩小樣例得知答案序列為n級等差數列。貌似碾標算 include using namespace std namespace standardio templateinline void write t x using namespace stan...