[考试反思]0928csp-s模拟测试54:转瞬

咕了好久,也没什么想说的。

下一场就又爆炸了。。。

T3特判打丢一句话丢了14分,剩下其实都还好。

T1:

给我的第一感觉是建图找联通块,但既然只要找联通块为什么不直接并查集呢?

对于每一个数字合并它的所有因子,求出现过的因子形成几个联通块,特殊处理1。

二营长比我快了整整5分钟做出来的。

 1 #include<cstdio>
 2 #include<vector>
 3 using namespace std;
 4 #define mod 1000000007
 5 #define int long long
 6 vector<int>v[1000005];
 7 int x[100005],al[1000005],f[1000005],prime[1000005],cnt_prime;bool not_prime[1000005];
 8 int pow(int b,int t,int a=1){for(;t;t>>=1,b=b*b%mod)if(t&1)a=a*b%mod;return a;}
 9 int find(int k){return f[k]==k?k:f[k]=find(f[k]);}
10 main(){
11     int t;scanf("%lld",&t);
12     for(int i=2;i<=1000000;++i)if(!not_prime[i]){
13         prime[++cnt_prime]=i;
14         for(int j=i;j<=1000000;j+=i)v[j].push_back(i),not_prime[j]=1;
15     }
16     while(t--){
17         int n,cnt1=0;scanf("%lld",&n);
18         for(int i=1;i<=n;++i){scanf("%lld",&x[i]);if(x[i]==1)cnt1++;}
19         for(int i=1;i<=cnt_prime;++i)f[prime[i]]=prime[i],al[prime[i]]=0;
20         for(int i=1;i<=n;++i)if(x[i]!=1)for(int j=1;j<v[x[i]].size();++j)
21             f[find(v[x[i]][j])]=find(v[x[i]][0]),al[v[x[i]][j]]=1;//,printf("%lld %lld\n",v[x[i]][0],v[x[i]][j]);
22         for(int i=1;i<=n;++i)if(x[i]!=1)al[v[x[i]][0]]=1;
23         for(int i=1;i<=cnt_prime;++i)if(al[prime[i]])if(al[find(prime[i])]!=2)
24             al[find(prime[i])]=2,cnt1++;
25         printf("%lld\n",(pow(2,cnt1)-2+mod)%mod);
26     }
27 }

思路积累:

  • 埃筛:求出含有的每种质因子
  • 并查集

T2:

莫名想到了双向搜索,因为20的范围会很卡但是折半之后就很好,然后就好做了。

可以发现我们要求的路径不限制终点。

那么分别处理以1为起点所能形成的长度为d/2的路径集合和以任意点为起点的路径集合。

然后把两种路径的终点接起来就形成了长度为d的路径。

比脸快23s抢到迷之首杀。

 1 #include<cstdio>
 2 int can[11][99][1028],n,fir[99],l[20000],to[20000],v[20000],cnt,m,d,rev[1028],ans,can2[11][99][1028],al[1048577];
 3 void link(int a,int b,int V){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;v[cnt]=V;}
 4 int main(){
 5     scanf("%d%d%d",&n,&m,&d);
 6     for(int i=1,a,b,V;i<=m;++i)scanf("%d%d%d",&a,&b,&V),link(a,b,V),link(b,a,V);
 7     int lh=d>>1,rh=d-lh,usf=(1<<rh)-1;
 8     can[0][1][0]=1;for(int i=1;i<=n;++i)can2[0][i][0]=1;
 9     for(int len=0,L=1;len<lh;++len,++L)for(int i=1;i<=n;++i)for(int st=0;st<1<<len;++st)if(can[len][i][st])
10         for(int j=fir[i];j;j=l[j])can[L][to[j]][st<<1|v[j]]=1;
11     for(int len=0,L=1;len<rh;++len,++L)for(int i=1;i<=n;++i)for(int st=0;st<1<<len;++st)if(can2[len][i][st])
12         for(int j=fir[i];j;j=l[j])can2[L][to[j]][st<<1|v[j]]=1;
13     for(int i=0;i<1<<lh;++i)for(int j=1;j<=n;++j)if(can[lh][j][i])
14         for(int k=0;k<=usf;++k)if(!al[i<<rh|k]&&can2[rh][j][k])al[i<<rh|k]=1,ans++;
15     printf("%d\n",ans);
16 }

思路积累:

  • 双向搜索:状态数开根

T3:

31分给暴力了。

+14分单调:只要处理第一个和最后一个就行。x[2]=x[n],n=2;然而考场上没写n=2,T掉了。。。

+20分曲折:二分最早的不能覆盖的段然后就是一次函数。

100分:大模拟。考场上有链表+堆的思路。感觉很不好打就没有打。

事实上的确很不好打,现在还没有A。

思路和下发的std不太一样。

原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11615361.html

时间: 2024-11-01 23:13:13

[考试反思]0928csp-s模拟测试54:转瞬的相关文章

2019.9.28 csp-s模拟测试54 反思总结

咕咕咕的冲动如此强烈x T1x: 看完题目想了想,感觉把gcd不为1的强行放在一组,看作一个连通块,最后考虑连通块之间的组合方式就可以了. 然后维护这个连通块可以写并查集可以连边跑dfs怎么着都行… 然而我在处理数字分解质因数这里T掉了,原因是一个很显然的优化写法我基本没怎么写过.线性筛的时候记录每个数是被哪个质数标记过的,分解一个数的时候直接处理记录下来的质数就可以. #include<iostream> #include<cstdio> #include<cmath>

模拟测试54

T1: 所有不互质的数对一定在同一集合内. 并查集维护每个数所在集合,以数对为链合并. 但是这样复杂度为$O(n^2)$的. 考虑优化,两个数不互质,意味着他们之间有相同质因子,把每个数分解质因数,和他的质因子合并即可. 线筛处理出最小质因子后可以$O(logn)$求所有质因子. 时间复杂度$O(nlogn)$. T2: 考虑状压,设数组$dp[i][j]$,表示经过$i$条路径,经过路径状态为$j$的情况存不存在. 时间复杂度$O(nm2^d)$,需要优化. 折半搜索,先DP前一半,再DP后一

9.28 csp-s模拟测试54 x+y+z

T1 x 求出每个数的质因数,并查集维护因子相同的数,最后看一共有多少个联通块,$ans=2^{cnt}-2$ 但是直接分解会$T$,埃筛是个很好的选择,或者利用每个数最多只会有1个大于$\sqrt{n}$的质因子,线筛$1e6$内的素数,每次只需枚举$1e3$的质因数就行,复杂度也可以过去 #include<iostream> #include<cstdio> #include<bitset> #include<cmath> #include<cst

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

[考试反思]0114省选模拟7:迷离

这次考得相对不错,但是没什么水准. 只不过记得T1这道原题而已.虽说我忘了怎么做,而且数据范围不一样...差不多是从头想的. 但是并没有AC,像个弱智一样,有两个细节写的完全不对还有80分运气也是真好. 其实挂了不止两个细节...以为是原题于是上来就写20分钟写完,然后过一会出一个锅... 然后看T2,感觉$O(nk^2)$也许差不多?常数很大...但也不会别的.挺好想但是不是很好写. 于是乎强烈谴责cbx没素质暴力水题考后还不改正解的无脸行径 于是就开始写,写了一个半小时. 看T3,绝对大神题

模拟测试68,69

68: 32 AlpaCa 41 03:08:20 31 02:46:16 30 02:46:28 102 03:08:20 69: 28 AlpaCa 20 02:51:15 60 03:05:32 0 01:39:45 80 03:05:32 彻底挂掉了呢. 不过也还好吧,至少之后的考试不会有那么大压力了吧(出第一机房是肯定的事了),那利用之后几场考试就调整好状态,下次再来嘛. 但是最近炸了那么多场还是要反思一下,其实不只是心态的问题,自身实力,考试技巧,时间分配等方面好像都有点问题. 69

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey