[考试反思]1004csp-s模拟测试59:惊醒

一句话:我看错考试时间了,我以为11:30结束,T2T3暴力没来得及交。

为什么考试的时间忽然变了啊。。。没转过来

一定要看清考试的起止时间!

虽说T2T3连爆搜都没打,只打特殊性质只有32分。爆搜分还挺高的。

当特殊性质不好扩展时,记得把爆搜打上。

本来是想T1先送上暴力,然后尝试肝T2,然后是T3暴力,有时间再回来优化T1。

但是整场考试时间是崩的,也没回T1。。。然而T2T3

注意分数与时间的权衡。

T1:

BFS。

二营长打法极其简单。因为是BFS所以一个点不会被多次更新。

那么一次更新了一个区间内的全部奇数或偶数,下次遇到的时候直接跳过就行了。

用链表实现,代码特别特别特别简单。常数也特别小,复杂度O(n),相较于线段树优化建边还少个log。

 1 #include<iostream>
 2 using namespace std;
 3 int dt[100005],q[100005],R[100005],n,m,k,S,x;
 4 int main(){
 5     cin>>n>>k>>m>>S;
 6     for(int i=1;i<=n;++i)dt[i]=n+1,R[i]=i+2;
 7     while(m--)cin>>x,dt[x]=-1;
 8     dt[S]=0;q[1]=S;
 9     for(int h=1,t=1;h<=t;++h){
10         int st=max(1,q[h]-k+1),l=st+st+k-1-q[h];st=min(n-k+1,q[h]);int r=st+st+k-1-q[h];
11         for(int i=l;i<=r;i=R[i])if(dt[i]>dt[q[h]]+1)dt[i]=dt[q[h]]+1,q[++t]=i;
12         for(int i=l;i<=r;){int rr=R[i];R[i]=max(R[i],r);i=rr;}
13     }
14     for(int i=1;i<=n;++i)cout<<(dt[i]>n?-1:dt[i])<<" ";cout<<endl;
15 }

T2:

神仙数学题,考场上死在容斥上了。

无解的判定就是横纵最大值不同。

不然的话我们把读入序列排序,对答案没有影响。

从大到小扩展,扫每一种权值。

然后这种权值占据的是一个矩形或一个L形,并且要求这个区域内每行每列都恰好出现了这个值。

容斥,f[i]表示一共a行中至少i行不满足条件。

ABab表示的是一个A×B的矩形挖掉一个(A-a)×(B-b)的小矩形之后得到的L形,当前处理的数字是S。

$f[i]=\sum\limits_{i=0}^{a}C_i^a \times (S^i \times ( (S+1)^{A-i} - S^{A-i} ) )^b \times ( S^i \times (S+1)^{a-i} )^{B-b}$

这一类“至少”的容斥也没少做,容斥系数是$(-1)^i$

式子的含义是先选出是哪i行不合条件,$C_i^a$

接下来在A×b的矩阵里选合法的方案,

考虑每一列,其中这不合法的i行不出现数字S,所以是[0,S-1]里面选,$S^i$

然后剩下的行里面需要出现数字S,那就是瞎选的方案减去没出现S的方案,即$(    (S+1)^{A-i} - S^{A-i} )$

每一列都是这样,所以要b次方

接下来需要计算那一个a×(B-b)的矩形,被限制不合法的i行还是不能放$S^i$,剩下的随便$(S+1)^{a-i}$

然后每一列都这样,要B-b次方

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 #define mod 1000000007
 6 #define int long long
 7 int pw(int b,int t,int a=1){for(;t;t>>=1,b=b*b%mod)if(t&1)a=a*b%mod;return a;}
 8 bool com(int a,int b){return a>b;}
 9 int fac[100005],x[100005],n,y[100005],ans=1,invv[100005],inv[100005];
10 int C(int b,int t){return fac[b]*inv[t]%mod*inv[b-t]%mod;}
11 int cal(int A,int B,int a,int b,int s){
12     int tot=0;
13     for(int i=0;i<=a;++i)tot=(tot+pw(mod-1,i)*C(a,i)%mod*pw(s,B*i)%mod*pw(pw(s+1,A-i)-pw(s,A-i)+mod,b)%mod*pw(pw(s+1,a-i),B-b))%mod;
14     return tot%mod+mod;
15 }
16 main(){
17     fac[0]=inv[0]=inv[1]=fac[1]=invv[1]=1;
18     for(int i=2;i<=100000;++i)fac[i]=fac[i-1]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-1]*invv[i]%mod;
19     scanf("%lld",&n);
20     for(int i=1;i<=n;++i)scanf("%lld",&x[i]);
21     for(int i=1;i<=n;++i)scanf("%lld",&y[i]);
22     sort(x+1,x+1+n,com);sort(y+1,y+1+n,com);
23     int p1=1,p2=1;
24     while(p1<=n||p2<=n){
25         int num=max(x[p1],y[p2]),cnt1=0,cnt2=0;
26         while(p1<=n&&x[p1]==num)p1++,cnt1++;
27         while(p2<=n&&y[p2]==num)p2++,cnt2++;
28         ans=ans*cal(p1-1,p2-1,cnt1,cnt2,num)%mod;
29     }
30     printf("%lld\n",ans);
31 }

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

时间: 2024-10-02 09:13:22

[考试反思]1004csp-s模拟测试59:惊醒的相关文章

[CSP-S模拟测试59]题解

以后题解还是单独放吧. A.Divisors 根号筛求所有数的因子,扫一遍去重统计即可. #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<map> using namespace std; const int N=205; int a[N],m,n; map<int,int> bu; vector<int> re

CSPS模拟测试59

这场考得我心态爆炸......... 开场T1只会$n^{2}$,然后发现bfs时每个点只需要被更新一次,其他的更新都是没用的. 也就是说,我们可以只更新还没被更新的点? 于是我先YY了一个链表,发现在链表中删除一个数之后,用它更新其他点的时候,就没有办法找到它的前趋后继了,用之前的可以被卡成$O(n^{2})$,大样例都跑了2s+,然后就死了. 然后才想到set,可以保证每个点只被更新一次,然而发现我对set一无所知,一直以为begin指向为空,而end指向最大元素,调了好久,后来发现是反的.

模拟测试59

T1: 翻转区间相当于位移,但是边界附近的点要特判. 可以处理出最左侧和最右侧的对称轴,然后分类讨论每个数的位置,即可知道他能移动到的区间. 用set进行bfs即可,相同的点不会被遍历两次. 也可以线段树优化建边,注意优化建边跑双端队列bfs一定要把出边的权值设为1. 时间复杂度$O(nlogn)$. T2: 将所有的数排序,从大到小枚举. 每次扩展和枚举的数相同的行和列,这样扩展出的区间为矩形或L形. 在同一个区间内数的上界限制相同,而互不影响. 每个矩形或L形的方案数可以用容斥求出. 先考虑

csp-s模拟测试59(10.4)「Reverse」(set)&#183;「Silhouette」(容斥)

A. Reverse 菜鸡wwb又不会了..... 可以线段树优化建边,然而不会所以只能set水了 发现对于k和当前反转点固定的节点x确定奇偶性所到达的节点奇偶性是一定的 那么set维护奇偶点,然后每次set找点删点注意边界 set在删点后原来的迭代器会玄学出错,xuefeng好像被坑了,所以lowerbound一下就不用++了 B. Silhouette 很玄学的容斥 考场多QJ了18分,因为如果1-n是个序列,好像就是一个简单的容斥..... 然后用能发现是以“L”形的形状向右推的,随便乘一

[考试反思]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