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

主要是以下原因:

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. 【转】小白级的CocoaPods安装和使用教程

    原文网址:http://www.jianshu.com/p/e2f65848dddc 百度有很多CocoaPods的安装教程.第一次看的时候,确实有点摸不透的感觉.经过思考,一步一步来实践,前后花了三 ...

  2. Flask Cookie和Session

    1.1.概念 cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第 ...

  3. mysql授予IP远程访问访问语句

    mysql -u root -p; GRANT ALL PRIVILEGES ON *.* TO '用户名'@'你的IP地址' IDENTIFIED BY '密码' WITH GRANT OPTION ...

  4. hadoop配置历史服务器

    此文档不建议当教程,仅供参考 配置历史服务器 我是在hadoop1机器上配置的 配置mapred-site.xml <property> <name>mapreduce.job ...

  5. SQL Server数据库性能优化

      开篇:    最近遇到了很多性能问题,一直没来的及总结,今天正好周末抽时间总结下: 对于稍微大点的公司或者说用户多一些的公司,说白了就是数据量较大的公司,在查询数据时往往会遇到很多瓶颈.这时就需要 ...

  6. 洛谷P3357 最长k可重线段集问题(费用流)

    题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II ,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\subseteq IS⊆I ,使得在  ...

  7. Python爬虫:爬取某网站关键词对应商品ID,且存入DB2数据库

    公司研发不给力,我就自己写了一个,专门爬关键词对应的商品ID. 其中还学会了用Python操作DB2数据库.Python发送邮件.写日志文件.处理浏览器访问限制. #!/usr/bin/python# ...

  8. java简单实现MD5加密

    1.话不多说,直接上代码-----传入字符串,返回加密码 import java.security.MessageDigest; import java.text.NumberFormat; publ ...

  9. Pyhton学习——Day11

    # Python中的内部模块# 函数学习的意义:抽取重复代码# 模块:不用重复写,模块及py文件,提高了代码的可维护性,其次,编写代码不必从零开始,当一个模块编写完毕,不必再重复编写# import ...

  10. P3376 【模板】网络最大流(luogu)

    P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...