首页 > 其他分享 >The 2020 ICPC Asia Shenyang Regional Programming Contest M. United in Stormwind

The 2020 ICPC Asia Shenyang Regional Programming Contest M. United in Stormwind

时间:2023-11-16 17:12:04浏览次数:40  
标签:typedef Shenyang Contest int Regional long pair include define

Preface

先补一下这周一队友VP的ICPC2020沈阳,这场由于我在补作业+晚上有大物实验,因此只参与了中间一个多小时,纯口胡了几个简单题

因为我没怎么参与所以过的其它题就不写补题+写博客了,毕竟队友会等于我会

那么就主要把我比赛时看了但没啥思路的M补了,AI祁神好像在补那我就不管了,后面好像还有个J是个DS到时候也抽时间补一下


Solution

回到这题,其实就是把两个很套路的东西结合在一起了,前半部分其实很容易想到

但由于我一直不会sosdp,所以以为后面的只能枚举子集\(O(3^m)\)就做不动了,后面去看了下sosdp好像是个很简单的玩意来着

首先我们不妨把每个人的回答看作一个数\(\{a_i\}\),那么\(a_u\oplus a_v\)就代表\(u,v\)两人在哪些问题上回答不同

那么我们显然可以用一个FWT先求出异或和为某个数的人的对数

考虑直接枚举最后答案的集合\(S\),设满足题意的pair得到的异或和为\(T\),则当\(S\cap T\ne \emptyset\)时这个pair可以造成贡献

直接统计不为空集的方案不好算,我们容斥一下用\(C_n^2\)减去\(S\cap T=\emptyset\)的贡献,这个又等价于\(T\subset C_S\)

用sosdp或者FMT优化下这个子集卷积即可,总复杂度\(O(m\times 2^m)\)

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define int long long
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=1<<20;
int n,m,k,lim,x,a[N],b[N],f[N],all,ans; char s[30];
inline void FWT_XOR(int* f,CI opt)
{
	for (RI i=1,j,k;i<lim;i<<=1) for (j=0;j<lim;j+=(i<<1)) for (k=0;k<i;++k) 
	{
		int x=f[j+k],y=f[i+j+k]; f[j+k]=x+y; f[i+j+k]=x-y;
		if (!~opt) f[j+k]/=2,f[i+j+k]/=2;
	}
}
signed main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i,j; for (scanf("%lld%lld%lld",&n,&m,&k),lim=1<<m,i=0;i<n;++i)
	{
		int cur=0; for (scanf("%s",s),j=0;j<m;++j)
		cur=(cur<<1)+(s[j]=='A'); ++a[cur]; ++b[cur];
	}
	for (FWT_XOR(a,1),FWT_XOR(b,1),i=0;i<lim;++i) a[i]*=b[i];
	for (FWT_XOR(a,-1),a[0]-=n,i=0;i<lim;++i) a[i]/=2,f[i]=a[i];
	for (j=0;j<m;++j) for (i=0;i<lim;++i) if ((i>>j)&1) f[i]+=f[i^(1<<j)];
	for (all=1LL*n*(n-1)/2LL,i=0;i<lim;++i)
	if (all-f[(lim-1)^i]>=k) ++ans;
	return printf("%lld",ans),0;
}

标签:typedef,Shenyang,Contest,int,Regional,long,pair,include,define
From: https://www.cnblogs.com/cjjsb/p/17836760.html

相关文章

  • 2023 China Collegiate Programming Contest Shenzhen Site
    目录写在前面AFGLIEMK写在最后写在前面补题地址:vjudge。以下按照场上过题顺序排序。首银。比游记更早出来,没想到吧。游记链接:留坑。A场上先开的这道。直觉是考虑先全部区间加直到最小值,然后将非最小值全单点加,再重复上述过程。然而会被递增序列卡掉。瓶颈在于单点加太多......
  • AtCoder Beginner Contest(abc) 328
    B-11/11难度:⭐题目大意在某个世界一年有n个月,每个月有di天,问有多少个日期,该日期和月份组成的数字都是一样的;eg:11月的1日,22月的22日;解题思路暴力就行;神秘代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;typedefpair<int......
  • AtCoder Beginner Contest 325
    A-Takahashisan#include<bits/stdc++.h>usingnamespacestd;#definelllonglongusingvi=vector<int>;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);strings,t;cin>>s>>t;cout<......
  • Toyota Programming Contest 2023#7(AtCoder Beginner Contest 328)
    ToyotaProgrammingContest2023#7(AtCoderBeginnerContest328)A.NotTooHard题意:将给定的数列\(a\)中数值小于\(x\)的数累加。解题思路:模拟。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){ intn,x; cin>>n>>x;......
  • AtCoder Beginner Contest 328
    A-NotTooHard(abc328A)题目大意给定\(n\)个数字和一个数\(x\)。问不大于\(x\)的数的和。解题思路按找要求累计符合条件的数的和即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdi......
  • AtCoder Beginner Contest 328
    A傻逼题。B傻逼题C傻逼题D不难发现,每次添加一个字符,如果可以当前的答案组成ABC就删。然后模拟即可。E两种方法。二进制枚举使用了哪些边。可以发现有用的状态只有\(\binom{m}{n-1}\),上限大概\(10^5\),剩余无用状态过了就行。复杂度\(O(m2^m)\),但是跑的特别不满。......
  • The 2023 ICPC Nanjing Regional Contest G,F
    G.背包我们要是选一个集合出来并且免除k个宝石的话我们一定是选最贵的k个宝石免费这样我们的做法就是对wi排序然后前面的做背包后面直接贪心选vi最大的k个这样是一定包含了最优解的当然你可以用二分bit也可以直接维护另一个dpintn,tr1[200010],tr2[200010],idx;map<i......
  • Kattis - A Complex Problem (The 2023 ICPC Rocky Mountain Regional Contest)
    IntroThiswasoneoftheproblemsIdidn'tdoduringtheregionalcontest.Oneofmyteammatessolvedit.ObservationTherearefewthingstonote.Firsttypeofnotation:subsetmeansthatA$\subset$B,buttherecanbecasesthatsubsetforms......
  • AtCoder Beginner Contest(abc) 322
    B-PrefixandSuffix难度:⭐题目大意给定两个字符串t和s,如果t是s的前缀则输出1,如果是后缀则输出2,如果都是则输出0,都不是则输出3;解题思路暴力即可;神秘代码#include<bits/stdc++.h>#defineintl1ngl1ng#defineIOSios::sync_with_stdio(false),cin.......
  • The 10th Jimei University Programming Contest
    外校打星队伍,排名22/450,还算凑合吧。A.A+B问题直接枚举进制#include<bits/stdc++.h>usingnamespacestd;usingvi=vector<int>;voidsolve(){stringstr;via,b,s;cin>>str;for(autoc:str){if(c>='0'and......