[关闭]
@xiaoziyao 2020-11-23T18:02:32.000000Z 字数 1271 阅读 1065

AT2389 [AGC016E] Poor Turkeys解题报告

解题报告


AT2389 [AGC016E] Poor Turkeys解题报告:

更好的阅读体验

题意

分析

神仙题。

我们设)表示:如果要活着,那么以后一定要为“抵命”

可以用一个倒推的dp来求出数组,具体地说:

为必须死去来抵一命的集合。

然后,我们枚举点对),首先判断是不是一定得死去,如果不是,那么很显然只有才能让同时存活(一只火鸡不能同时给抵命)。

题解

  1. #include<stdio.h>
  2. #include<bitset>
  3. using namespace std;
  4. const int maxn=405,maxm=100005;
  5. int n,m,ans;
  6. int a[maxm],b[maxm],no[maxn];
  7. bitset<maxn>keep[maxn];
  8. int main(){
  9. freopen("c.in","r",stdin);
  10. freopen("c.out","w",stdout);
  11. scanf("%d%d",&n,&m);
  12. for(int i=1;i<=m;i++)
  13. scanf("%d%d",&a[i],&b[i]);
  14. for(int i=1;i<=n;i++){
  15. keep[i][i]=1;
  16. for(int j=m;j>=1;j--){
  17. if(keep[i][a[j]]&&keep[i][b[j]]){
  18. no[i]=1;
  19. break;
  20. }
  21. if(keep[i][a[j]])
  22. keep[i][b[j]]=1;
  23. else if(keep[i][b[j]])
  24. keep[i][a[j]]=1;
  25. }
  26. }
  27. for(int i=1;i<=n;i++)
  28. for(int j=i+1;j<=n;j++)
  29. if(no[i]==0&&no[j]==0&&(keep[i]&keep[j]).count()==0)
  30. ans++;
  31. printf("%d\n",ans);
  32. return 0;
  33. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注