AGC002(D~F)【Kruskal重构树,博弈论,dp】

1|0正题


1|1AT1998 [AGC002D] Stamp Rally【Kruskal重构树,倍增】

https://www.luogu.com.cn/problem/AT1998

1|0题目大意

给出n个点m条边的一张无向图,q次询问两个人分别从x,y,要求总共经过z个点的情况下经过边的最大编号的最小值。

1n,m,q105

1|0解题思路

直接上Kruskal重构树然后预处理倍增数组和子树大小。

然后二分答案+倍增判断就好了,这样写是两个log的,直接倍增一个log也行但是比较麻烦。

时间复杂度:O(nlog2n)


1|2AT1999 [AGC002E] Candy Piles【博弈论】

https://www.luogu.com.cn/problem/AT1999

1|0题目大意

n堆糖果,第i堆有ai个,有如下操作

  • 取走糖果最多的那堆
  • 所有堆中各取走一个

1n105,1ai109

1|0解题思路

考虑如果现在操作的那个人一直用第一个操作会输那么它肯定会用第二个操作,而此时会转换胜负态,那么下一个人也会继续这么做,但是如果到最后一个且刚好是偶数那么使用第一个操作就更优。

所以肯定存在一个数i满足比这个位置大的都是在第二个操作被取走的,前的都是第一个位置被取走的。并且最后肯定是第二个操作。如果aii那么这个位置肯定是第一个操作被取走的,因为在此之前第二个操作不可能多过第一个操作。所以找到第一个ai>i的位置然后判断即可。

时间复杂度:O(nlogn)

1|0code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e5+10; int n,a[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); reverse(a+1,a+1+n); for(int i=1;i<=n;i++) if(a[i+1]<i+1){ if((a[i]-i)&1)return puts("First")&0; int r=i;while(a[r+1]==i)r++; if((r-i)&1)return puts("First")&0; return puts("Second")&0; } return 0; }

1|3AT2000 [AGC002F] Leftmost Ball【dp,组合数学】

https://www.luogu.com.cn/problem/AT2000

1|0题目大意

n种颜色,第i种有k个,把所有排列中每种颜色的第一个染成同一种新的颜色(白色),求不同的排列数。

1n,k2000

1|0解题思路

相当于前缀颜色数小于等于前缀白色数,这个复杂度可以考虑平方的dp

因为其实和第一个出现的颜色有关,我们可以只保留每种颜色的前两个来dp,然后剩下的都插入到它们后面就好了,设fi,j表示现在有i个白色,出现了j种颜色时的方案。

如果填白色就是直接fi1,j,如果填颜色,我们可以在剩下的nj+1个颜色中选出一个来,第二个填在目前的最前面,然后现在的空位是ni(j1)×(k1)1个再填k2个就好了。

时间复杂度:O(n2)

1|0code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2100,P=1e9+7; ll n,k,inv[N*N],fac[N*N],f[N][N]; ll C(ll n,ll m) {return fac[n]*inv[m]%P*inv[n-m]%P;} signed main() { scanf("%lld%lld",&n,&k); if(k==1)return puts("1")&0; inv[0]=fac[0]=inv[1]=1; for(ll i=2;i<=n*k;i++)inv[i]=P-inv[P%i]*(P/i)%P; for(ll i=1;i<=n*k;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P; f[0][0]=1; for(ll i=1;i<=n;i++) for(ll j=0;j<=i;j++) f[i][j]=(f[i-1][j]+f[i][j-1]*(n-j+1)%P*C(n*k-i-(j-1)*(k-1)-1,k-2)%P)%P; printf("%lld\n",f[n][n]); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15457504.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示