您的位置:首页 > 其它

记一次无限挂的考试

2017-05-07 20:22 183 查看
题目和详细的题解见3C杯

T1:DP

全世界都会写T1除了我。

“这就是颓了两个月树而完全没有颓DP的代价。”

f[i][j]表示有i堆时选到第j堆的概率。状态转移方程(?)如下:

for(int i=1;i<=1000;i++)
for(int j=1;j<=i;j++)
f[i][j]=1-0.5*(f[i-1][j]+f[i-1][j-1]);


然后是个人都会O(n)回答每一组数据,因为T和n的数据范围一样一样的,所以我们可以认为复杂度是O(n2),不用优化辣~

蒟蒻要好好颓DP了QwQ

T2

全世界都能拿到T2的暴力分然而还是除了我。(对那个神奇的运行错误……)

这是lyp报复社会的题……

把有无边变成两个颜色的边,然后两个答案的总数就是总三元环数减去杂色三元环数。a[i]表示度数。

杂色三元环数即:∑ni=1a[i]∗(n−1−a[i])/2

然后枚举两条边判断有边的三元环个数,复杂度是O(mm‾‾√)。有个链式hash不会打丫。

woc所谓链式hash就是用链表储存hash而防止重复ya

就像尼们平时打的链表储存图一样。

在这里可以放一下code:

#include<queue>
#include<cstdio>
using namespace std;
const int N=100000+5;
queue<long long>q;
long long book
,to
,head
,nxt
,a
,cnt,tot,ans1,len,n,m,i,j;
int main() {
for(scanf("%lld%lld",&n,&m);m--;) {
scanf("%lld%lld",&i,&j);
if(i>j) swap(i,j);a[i]++;a[j]++;
to[++len]=j;nxt[len]=head[i];head[i]=len;
}
for(tot=n*(n-1)*(n-2)/6,i=1;i<=n;i++) {
cnt+=a[i]*(n-1-a[i]);
for(j=head[i];j;j=nxt[j]) q.push(to[j]),book[to[j]]=1;
for(;!q.empty();) for(j=head[q.front()],q.pop();j;j=nxt[j]) ans1+=book[to[j]];
for(j=head[i];j;j=nxt[j]) book[to[j]]=0;
}
printf("%lld %lld",ans1,tot-(cnt>>1)-ans1);
return 0;
}


蒟蒻要好好学学hash丫

T3

唯一一道会写的水题。

第一眼还以为是个数论神题呢,后来发现筛出素数后枚举它们的基数次方就可以了欸(居然这么水不科学……)

然后刘汝佳给的素数线性筛果然不是很靠谱,只能过30分的数据……

正常的素数线性筛应该这么打:

long prime
={0},num=0;
int vis
={1,1};
int is_prime() {
for(int i=2;i<N;i++) {
if(!used[i])
prime[num++]=i;
for(int j=0;j<num&&i*prime[j]<N;j++) {
used[i*prime[j]]=1;
if(!(i%prime[j])) break;
}
}
return 0;
}


然后因为prime显然单调,所以当prime[i]只能乘一次的时候,后面的素数显然也最多只能来一次,二分高出最大的可乘素数。然后居然就可以过了……(本来是有个利用数学原理的神奇剪枝的,不过不需要呢)

总之,太弱怪谁……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索-容斥-dp
相关文章推荐