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

主要是以下原因:

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

2.T2交错了文件名

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

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


T1:

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

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

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

考虑优化这个过程

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn=1e5+,maxa=1e6+,mod=1e9+;
  5. int t,n,last[maxa],ans;
  6. bool vis[maxn];
  7. vector<int> g[maxn];
  8. int pcnt,prime[maxa],minp[maxa];
  9. bool prm[maxa];
  10.  
  11. inline void init(){
  12. for(int i=;i<maxa;++i){
  13. if(!prm[i]){
  14. prime[++pcnt]=i;
  15. minp[i]=i;
  16. }
  17. for(int j=;j<=pcnt&&i*prime[j]<maxa;++j){
  18. prm[i*prime[j]]=true;
  19. minp[i*prime[j]]=prime[j];
  20. if(i%prime[j]==)
  21. break;
  22. }
  23. }
  24. }
  25. void dfs(int pos){
  26. vis[pos]=true;
  27. for(int i=;i<g[pos].size();++i)
  28. if(!vis[g[pos][i]])
  29. dfs(g[pos][i]);
  30. }
  31.  
  32. int main(){
  33. // freopen("x.in","r",stdin);
  34. // freopen("x.out","w",stdout);
  35. init();
  36. scanf("%d",&t);
  37. while(t--){
  38. scanf("%d",&n);
  39. for(int i=;i<=pcnt;++i)
  40. last[prime[i]]=;
  41. for(int i=,x;i<=n;++i){
  42. vis[i]=false;
  43. g[i].clear();
  44. scanf("%d",&x);
  45. while(x>){
  46. int fac=minp[x];
  47. while(x%fac==)
  48. x/=fac;
  49. if(last[fac]){
  50. g[i].push_back(last[fac]);
  51. g[last[fac]].push_back(i);
  52. }
  53. last[fac]=i;
  54. }
  55. }
  56. ans=;
  57. for(int i=;i<=n;++i)
  58. if(!vis[i])
  59. ans=ans*%mod,dfs(i);
  60. printf("%d\n",(ans+mod-)%mod);
  61. }
  62. return ;
  63. }

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搞一波就好

具体看代码注释吧

  1. #include<algorithm>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<bitset>
  6. using namespace std;
  7.  
  8. const int N=+;
  9. const int maxn=<</+;
  10. int n,m,d;
  11. bitset <N> g0[N],g1[N],dp[maxn],f[maxn];
  12. inline int read()
  13. {
  14. char ch=getchar();
  15. int s=,f=;
  16. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  17. while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
  18. return s*f;
  19. }
  20. int main()
  21. {
  22. // freopen("y.in","r",stdin);
  23. // freopen("y.out","w",stdout);
  24. n=read();m=read();d=read();
  25. for (int i=,u,v,c;i<=m;i++)
  26. {
  27. u=read();v=read();c=read();
  28. if (c) {g1[u][v]=g1[v][u]=true;}
  29. else {g0[u][v]=g0[v][u]=true;}
  30. }
  31. int d2=d/,d1=d-d2;
  32. for (int u=n;u>=;u--)
  33. {
  34. for (int i=;i<maxn;i++) dp[i].reset();
  35. dp[][u]=true;//以u为结尾状态是否存在,最开始的1是为了避免前导0
  36. for (int x=;x<<<d1;x++)
  37. for (int y=;y<=n;y++)
  38. if (dp[x][y])
  39. {
  40. dp[x<<]|=g0[y];
  41. dp[x<<|]|=g1[y];
  42. }
  43. for (int x=;x<<<d1;x++)//一个由u拓展的状态以任何一个结尾都说明以u开头的这个状态是存在的
  44. f[x][u]=dp[<<d1|x].any();//f数组是以u为开头的状态是否存在
  45. }
  46. int ans=;
  47. for (int i=;i<<<d1;i++)
  48. for (int j=;j<<<d2;j++)//最后的dp数组状态都是由1为开头拓展而来的
  49. if ((dp[<<d2|j]&f[i]).any()) ans++;//有任意一个接上就可以累计答案
  50. printf("%d\n",ans);
  51. return ;
  52. }

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. Oracle数据库三种标准的备份方法

    Oracle数据库的三种标准的备份方法: 1.导出/导入(EXP/IMP). 2.热备份. 3.冷备份. 注释:导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一.导出/导入(Export/Imp ...

  2. swift属性观察者机智

    为了让程序能在属性被赋值时获得执行代码的机会.swift提供了属性观察者机智,属性观察者其实就两个特殊的回调方法 willSet:被观察的属性即将被赋值之前自动调用该方法 didSet:被观察的属性被 ...

  3. Caffe solver.prototxt学习

    在solver解决下面的四个问题: a.训练的记录(bookkeeping),创建用于training以及test的网络结构: b.使用前向以及反向过程对training网络参数学习的过程: c.对t ...

  4. MVC bundle配置文件模板

    bundle文件放在应用根目录,命名为  bundle.config 内容模板 <?xml version="1.0" encoding="utf-8"? ...

  5. Swagger中添加Token验证

    1.该连接链接到api中基本的swagge功能:http://www.cnblogs.com/hhhh2010/p/5234016.html 2.在swagger中使用验证(这里使用密码验证模式)ht ...

  6. js获取浏览器中相关容器的高度

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...

  7. signature验证/salt验证/token验证的作用

    1.salt验证: salt是随机生成的一串字符,salt验证的作用是将生成的salt与加密的密码密文拼接后再次加密存储  这样可以是存储在数据库中的密码更加安全 2.signature验证: I.将 ...

  8. DataReader相关知识点

    C#中提供的DataReader可以从数据库中每次提取一条数据. 1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占用SqlConnection连接,在其获 ...

  9. Win7 disk.sys无法加载的问题

    Win7突然无法启动,应该说是启动中卡死,没有别的问题,用安全模式,显示加载disk.sys时卡死.搜索发现很多人遇到这个问题. 实际解决方法是查看数据线,重新插拔,换口,换线. 数据线出现故障往往表 ...

  10. SQL基本语句:1.模式 3.索引

    每次很长时间不用sql语句之后,都需要把基础的捡一捡,索性做个笔记,以后可以长看