感觉状态极差啊,今天居然爆零了

主要是以下原因:

1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸

2.T2交错了文件名

3.T3暴力子任务和正解(假的)混在一起,输出了两个答案

都想为自己刷个赞,调不出代码是水平不够,但是这样真的让人无话可说,幸好这只是模拟赛


T1:

题意:给出一个集合,要求把这个集合分成两部分,使得一个集合中的任意一个元素都与对面集合的全部元素都互质

我不知道我为什么会写炸这样的傻X题。。。

显然暴力就是$O(n^2)$枚举,暴力判断gcd是否为1,如果不为1说明要放在一个集合里,并查集维护一下联通块的个数就好,答案就是$s^{联通块的个数}-2$(-2是因为不能出现空集)

考虑优化这个过程

我们枚举质因数,用类似邻接链表的方法把它的倍数连在一起,这样就形成了若干联通块,dfs计算联通块的个数统计答案就好了

#include<bits/stdc++.h>
using namespace std; const int maxn=1e5+,maxa=1e6+,mod=1e9+;
int t,n,last[maxa],ans;
bool vis[maxn];
vector<int> g[maxn];
int pcnt,prime[maxa],minp[maxa];
bool prm[maxa]; inline void init(){
for(int i=;i<maxa;++i){
if(!prm[i]){
prime[++pcnt]=i;
minp[i]=i;
}
for(int j=;j<=pcnt&&i*prime[j]<maxa;++j){
prm[i*prime[j]]=true;
minp[i*prime[j]]=prime[j];
if(i%prime[j]==)
break;
}
}
}
void dfs(int pos){
vis[pos]=true;
for(int i=;i<g[pos].size();++i)
if(!vis[g[pos][i]])
dfs(g[pos][i]);
} int main(){
// freopen("x.in","r",stdin);
// freopen("x.out","w",stdout);
init();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=;i<=pcnt;++i)
last[prime[i]]=;
for(int i=,x;i<=n;++i){
vis[i]=false;
g[i].clear();
scanf("%d",&x);
while(x>){
int fac=minp[x];
while(x%fac==)
x/=fac;
if(last[fac]){
g[i].push_back(last[fac]);
g[last[fac]].push_back(i);
}
last[fac]=i;
}
}
ans=;
for(int i=;i<=n;++i)
if(!vis[i])
ans=ans*%mod,dfs(i);
printf("%d\n",(ans+mod-)%mod);
}
return ;
}

T2:

老实说现在让我再写一次我不会写,因为是看标程才勉强理解的(神奇的bitset啊)

据出题人大大说,暴力是这么写的,dp[i][j][bit]表示从i到j是否存在一条表示可以表示为bit的边。(注意到前导0,办法和昨天那题是一样的,或上1<<len就好,len是路径的长度)

然后我们要优化这个暴力,出题人大大还说了,meet in the middle,我们长度为d的路径拆分成d2=d/2,d1=d-d2两段,注意到d1>=d2

然后我们用bitset搞一波就好

具体看代码注释吧

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<bitset>
using namespace std; const int N=+;
const int maxn=<</+;
int n,m,d;
bitset <N> g0[N],g1[N],dp[maxn],f[maxn];
inline int read()
{
char ch=getchar();
int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int main()
{
// freopen("y.in","r",stdin);
// freopen("y.out","w",stdout);
n=read();m=read();d=read();
for (int i=,u,v,c;i<=m;i++)
{
u=read();v=read();c=read();
if (c) {g1[u][v]=g1[v][u]=true;}
else {g0[u][v]=g0[v][u]=true;}
}
int d2=d/,d1=d-d2;
for (int u=n;u>=;u--)
{
for (int i=;i<maxn;i++) dp[i].reset();
dp[][u]=true;//以u为结尾状态是否存在,最开始的1是为了避免前导0
for (int x=;x<<<d1;x++)
for (int y=;y<=n;y++)
if (dp[x][y])
{
dp[x<<]|=g0[y];
dp[x<<|]|=g1[y];
}
for (int x=;x<<<d1;x++)//一个由u拓展的状态以任何一个结尾都说明以u开头的这个状态是存在的
f[x][u]=dp[<<d1|x].any();//f数组是以u为开头的状态是否存在
}
int ans=;
for (int i=;i<<<d1;i++)
for (int j=;j<<<d2;j++)//最后的dp数组状态都是由1为开头拓展而来的
if ((dp[<<d2|j]&f[i]).any()) ans++;//有任意一个接上就可以累计答案
printf("%d\n",ans);
return ;
}

T3:

待填

[雅礼NOIP2018集训 day4]的更多相关文章

  1. [雅礼NOIP2018集训] day6

    打满暴力好像是一种挑战,已经连续几天考试最后一个小时自闭了,因为自以为打完了暴力,然而,结果往往差强人意 大概是考试的策略有些问题 T1: 我们设$g[x]$为在x时取小于等于m个物品的最大价值,下面 ...

  2. [雅礼NOIP2018集训 day1]

    现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了 T1: 题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值 数据范围当然是你暴力写不过 ...

  3. [雅礼NOIP2018集训 day3]

    考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...

  4. 雅礼 noip2018 模拟赛 day3 T3

    典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...

  5. 雅礼 noip2018 模拟赛day3 T2

    典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...

  6. [雅礼NOIP集训 2017] number 解题报告 (组合数+二分)

    题解: 令$S(i)={i+1,i+2,...,i<<1}$,f(i,k)表示S(i)中在二进制下恰好有k个1的数的个数 那么我们有$f(i,k)=\sum_{x=1}^{min(k,p) ...

  7. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  8. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  9. 雅礼集训【Day6-1】字符串

    雅礼集训[Day6-1]字符串 假设我们有串\(a\),我们设\(a'\)为\(a\)翻转后按为取反过后的串. 我们只考虑前一半的,长为\(m\)的串.如果前半截匹配了\(a\)或者\(a'\),则\ ...

随机推荐

  1. php实现邮箱激活功能

    php实现邮箱激活功能 一.样例 二.文件结构 其中swiftmailer-master是第三方插件,用来发验证邮件 三.核心代码 doAction.php 响应页面 <?php header( ...

  2. 【转】详述iOS国际化

    原文网址:http://www.cocoachina.com/ios/20151120/14258.html 在真正将国际化实践前,只知道通过NSLocalizedString方法将相应语言的字符串加 ...

  3. webapi+DataTables

    webapi + datatables 前言 之前写过一个关于DataTables的记录,是之前做webform的时候从后台一次性生成html代码,有很多弊端,就不多说了. 这次把最近研究的DataT ...

  4. Java高级——交通灯管理系统

    本方法模拟了现实生活中的交通信号灯的情况 1.先构建Road类,此类可以创建12个方向的路 代码如下: package com.springtie.traffic; import java.util. ...

  5. React实现单例组件

    问题背景 在工作中遇到了这样一个场景,写了个通用的弹窗组件,却在同一个页面中多次使用了该组件.当点击打开弹窗时,可想而知,一次性打开了多个弹窗,而业务需求只需要打开一个. 我个人在解决问题过程中的一些 ...

  6. Caffe Batch Normalization推导

    Caffe BatchNormalization 推导 总所周知,BatchNormalization通过对数据分布进行归一化处理,从而使得网络的训练能够快速并简单,在一定程度上还能防止网络的过拟合, ...

  7. Book 树状数组 小结

    差不多花了10天学树状数组,是照着这篇博客做的题目,还差几道---------- http://blog.csdn.net/chenguolinblog/article/details/9916229 ...

  8. 理解UIView的绘制

    界面的绘制和渲染 UIView是如何到显示的屏幕上的. 这件事要从RunLoop开始,RunLoop是一个60fps的回调,也就是说每16.7ms绘制一次屏幕,也就是我们需要在这个时间内完成view的 ...

  9. CDR发展史-CorelDRAW经历了哪些版本?

    1989年CorelDRAW横空出世,它引入了全彩矢量插图和版面设计程序,这在计算机图形领域掀起了一场风暴般的技术革新.两年后,Corel又推出了首款一体化图形套件(第 3 版),将矢量插图.版面设计 ...

  10. CDR入门教程-CorelDRAW排版教程

    CorelDRAW是一个绘制矢量图,排版的软件.今天给大家带来一片教程就是关于排版的.大家快来试试吧. CDR下载:http://pan.baidu.com/s/1cD4buQ 步骤一:新建一个A4文 ...