[雅礼NOIP2018集训 day4]
感觉状态极差啊,今天居然爆零了
主要是以下原因:
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]的更多相关文章
- [雅礼NOIP2018集训] day6
打满暴力好像是一种挑战,已经连续几天考试最后一个小时自闭了,因为自以为打完了暴力,然而,结果往往差强人意 大概是考试的策略有些问题 T1: 我们设$g[x]$为在x时取小于等于m个物品的最大价值,下面 ...
- [雅礼NOIP2018集训 day1]
现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了 T1: 题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值 数据范围当然是你暴力写不过 ...
- [雅礼NOIP2018集训 day3]
考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...
- 雅礼 noip2018 模拟赛 day3 T3
典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...
- 雅礼 noip2018 模拟赛day3 T2
典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...
- [雅礼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) ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- LOJ_6045_「雅礼集训 2017 Day8」价 _最小割
LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...
- 雅礼集训【Day6-1】字符串
雅礼集训[Day6-1]字符串 假设我们有串\(a\),我们设\(a'\)为\(a\)翻转后按为取反过后的串. 我们只考虑前一半的,长为\(m\)的串.如果前半截匹配了\(a\)或者\(a'\),则\ ...
随机推荐
- Oracle数据库三种标准的备份方法
Oracle数据库的三种标准的备份方法: 1.导出/导入(EXP/IMP). 2.热备份. 3.冷备份. 注释:导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一.导出/导入(Export/Imp ...
- swift属性观察者机智
为了让程序能在属性被赋值时获得执行代码的机会.swift提供了属性观察者机智,属性观察者其实就两个特殊的回调方法 willSet:被观察的属性即将被赋值之前自动调用该方法 didSet:被观察的属性被 ...
- Caffe solver.prototxt学习
在solver解决下面的四个问题: a.训练的记录(bookkeeping),创建用于training以及test的网络结构: b.使用前向以及反向过程对training网络参数学习的过程: c.对t ...
- MVC bundle配置文件模板
bundle文件放在应用根目录,命名为 bundle.config 内容模板 <?xml version="1.0" encoding="utf-8"? ...
- Swagger中添加Token验证
1.该连接链接到api中基本的swagge功能:http://www.cnblogs.com/hhhh2010/p/5234016.html 2.在swagger中使用验证(这里使用密码验证模式)ht ...
- js获取浏览器中相关容器的高度
网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...
- signature验证/salt验证/token验证的作用
1.salt验证: salt是随机生成的一串字符,salt验证的作用是将生成的salt与加密的密码密文拼接后再次加密存储 这样可以是存储在数据库中的密码更加安全 2.signature验证: I.将 ...
- DataReader相关知识点
C#中提供的DataReader可以从数据库中每次提取一条数据. 1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占用SqlConnection连接,在其获 ...
- Win7 disk.sys无法加载的问题
Win7突然无法启动,应该说是启动中卡死,没有别的问题,用安全模式,显示加载disk.sys时卡死.搜索发现很多人遇到这个问题. 实际解决方法是查看数据线,重新插拔,换口,换线. 数据线出现故障往往表 ...
- SQL基本语句:1.模式 3.索引
每次很长时间不用sql语句之后,都需要把基础的捡一捡,索性做个笔记,以后可以长看