codeforces 283C

Posted uuzlove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 283C相关的知识,希望对你有一定的参考价值。

题解:

考虑这个东西是带约束条件的完全背包

想办法把xi>xj的约束条件消掉

那么我们把限制条件(xi > xj)看成边 i -> j,连成有向图

发现这个有向图是一堆环和链

有环显然就GG了,然后我们只要考虑全是链的情况

考虑全是链,那么我们消掉约束条件就是每次原有权值加上所有前驱的权值

然后就是一个不带约束条件的完全背包

但是。。。除了出度为0的点意外其他点不能不选

那么就减去不选的方案数就行了

技术图片
 1 #include<bits/stdc++.h>
 2 #define maxn 305
 3 #define maxt 100005 
 4 #define ll long long
 5 using namespace std;
 6 const ll mod = 1000000007;
 7 int n,q,t;
 8 int a[maxn];
 9 int pre[maxn],vis[maxn];
10 bool h[maxn],hx[maxn];
11 ll dp[maxt],f[maxt];
12 int main()
13 {
14     scanf("%d%d%d",&n,&q,&t);
15     for(int i=1;i<=n;++i)scanf("%d",&a[i]);
16     for(int i=1;i<=n;++i)h[i]=1,hx[i]=1;
17     for(int i=1;i<=q;++i)
18     {
19         int b,c;
20         scanf("%d%d",&b,&c);
21         pre[b]=c;h[c]=0;hx[b]=0;
22     }
23     for(int i=1;i<=n;++i)if(h[i])
24         for(int x=i;x;x=pre[x])a[pre[x]]+=a[x],vis[x]=1;
25     for(int i=1;i<=n;++i)if(!vis[i])
26     {
27         puts("0");exit(0);
28     }
29     dp[0]=1;
30     for(int i=1;i<=n;++i)
31     {
32         if(hx[i])
33         {
34             for(int j=a[i];j<=t;++j)dp[j]=(dp[j]+dp[j-a[i]])%mod;
35         }
36         else
37         {
38             memcpy(f,dp,sizeof(f));
39             for(int j=a[i];j<=t;++j)dp[j]=(dp[j]+dp[j-a[i]])%mod;
40             for(int j=0;j<=t;++j)dp[j]=(dp[j]-f[j]+mod)%mod;
41         }
42     }
43     printf("%I64d\n",dp[t]);
44     return 0;
45 }
View Code

 

以上是关于codeforces 283C的主要内容,如果未能解决你的问题,请参考以下文章

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

如何在 Presto Athena 中将 varchar 转换为数组

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)