对,如果你想把第5名粘进来,那么图片就是这么夸张。

然而和我并没有什么关系,实在是太菜了。

但是还是想吐槽出题人是真心没良心啊。。。做了达哥的良心题之后眼光极其挑剔

这套题的部分分设置非常愚蠢,唯一一个可用的部分分在T2,但是T2说的还很不清楚。

T2其实已经完成了最艰难的转化题意,但是最后败在了细节上。

T1也基本上是全场切,结果出锅了。

我想问一个问题啊:在时间比较紧的情况下,是应该打完题就打对拍,还是优先往下做题啊?

skyh就是没脸。去厕所遇到他的话我这场绝对炸。

发现T2题意前遇到的

我:我估计我60分

FACEFACE:那我肯定不止60分了。我发现T2的题意了,难题。

然后我差点就弃T2了,差点就只剩下50分了。。。

T1暴力弹栈暴力恢复,结果恢复的时候往栈里应该是倒序加,而不应该是正序。。。挂70

T2计算$C_n^3$时没除6锅了20分。

。。。

心情稍低沉。越发感觉自己像个傻子。

会题不一定不是傻子。

拿不到分那就是个傻子。。。

吸取教训吧。。。

对拍。要对拍。就你那个程度不打对拍肯定锅。

T1:树

因为我蠢所以没想到正解。考场上维护了一个单调栈,然后离线暴干。

会被蒲公英图/扫帚图干掉成$O(n^2)$。但是出题人保证数据随机。我没打正解我没脸。

正解很简单,按照递减序建树,倍增乱搞就行。没心情打了。

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>anc[],c[],id[],tmp[];
int fir[],l[],to[],cnt,n,q,w[],dep[];
int sta[],top,sdep[],sw[],ans[];
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
bool com(int a,int b){return a>b;}
void dfs(int p,int fa){
dep[p]=dep[fa]+;
while(top&&sw[top]<=w[p])top--,tmp[p].push_back(sta[top+]);
sta[++top]=p;sw[top]=w[p];sdep[top]=dep[p];
for(int i=;i<id[p].size();++i){
int ed=lower_bound(sw+,sw++top,c[p][i],com)-sw,st=lower_bound(sdep+,sdep++top,dep[anc[p][i]])-sdep;
ans[id[p][i]]=max(,ed-st);
}
for(int i=fir[p];i;i=l[i])if(to[i]!=fa)dfs(to[i],p);
top--;
for(int i=(int)tmp[p].size()-;~i;--i)sta[++top]=tmp[p][i],sw[top]=w[sta[top]],sdep[top]=dep[sta[top]];
}
int main(){
scanf("%d%d",&n,&q);
for(int i=;i<=n;++i)scanf("%d",&w[i]);
for(int i=,x,y;i<n;++i)scanf("%d%d",&x,&y),link(x,y),link(y,x);
for(int i=,u,v,C;i<=q;++i)scanf("%d%d%d",&u,&v,&C),anc[u].push_back(v),c[u].push_back(C),id[u].push_back(i);
dfs(,);
for(int i=;i<=q;++i)printf("%d\n",ans[i]);
}

T2:环circle

其实虽说题目说的很不清楚,但是还是有很多提示的。

能从题目里隐隐约约得出以下信息:

竞赛图,环,最小。

看一眼数据范围,最小暴力分是n=300。这个只能是$O(n^3)$的复杂度了。

再把第一个样例的16个图都画出来,不难发现它要的就是三元环计数,不分起点。

求证:竞赛图如果有环,那么最小环一定是三元环

证明:

如果存在一个大于3元的环,那么对于其中任意距离大于等于2的两个点ab,在环上已经存在了一个顺时针和一个逆时针路径。

这时候因为图是竞赛图,ab两点之间也必须直接有边,这一条边能和顺时针路径或逆时针路径之一形成一个环。

这个环小于原来的环。这样的话大环会不断被分割成小的。直到环中不存在距离大于等于2的点,那么就只剩下了一个三元环。

证毕。

那么就是求三元环数量了。

30分:n<=300。

暴力枚举三个点。看贡献。

如果你一条边都不知道,那么可能形成2种环,一共$2^3=8$种情况,期望贡献1/4。

如果你只知道一条边,那么只能形成1种环,一共$2^2=4$种情况,期望贡献1/4。

如果你知道两条边,这两条边指向或背向同一个点,那么贡献是0,否则贡献1/2。

如果你三条边都知道。。。那就不用我说了吧。。。贡献0或1

+20分:e=0

全都是三条边都不知道的情况,是$\frac{1}{4} \times C_n^3$

+20分:e=n*(n-1)/2

全都是三条边都知道的情况,但是不能$n^3$枚举。

因为e<=1000000,所以可以知道n<=1500。

bitset枚举(也可以不用)。大力讨论。

100分:

考虑容斥。先让所有边都产生贡献。

然后产生负贡献的就是不合法的三元环:有两条边从同一个点指出。

然后考虑期望有多少这样的环。

枚举所有这样的点,考虑每一条不确定的边。

如果$p_i$表示这个点i有几条出边,有$q_i$条未知边。

答案减去$C_{p_i}^2 + \frac{C_{q_i}^2}{4} + \frac{p_i \times q_i}{2}$

 //可以证明,竞赛图只要存在环,那么最小的环大小一定是3
//所以问的就是图中期望有几个三元环
#include<cstdio>
#include<vector>
using namespace std;
vector<int>in[],out[];
#define qtr 250000002ll
#define hlf 500000004ll
#define mod 1000000007ll
int pow(long long b,int t,long long a=){for(;t;t>>=,b=b*b%mod)if(t&)a=a*b%mod;return a;}
int graph[][],n,e;long long ans;
int main(){
scanf("%d%d",&n,&e);
if(e==){
printf("%lld\n",qtr*n%mod*(n-)%mod*(n-)%mod*pow(,mod-)%mod);
}else if(n<=){
for(int i=,x,y;i<=e;++i)scanf("%d%d",&x,&y),graph[x][y]=,graph[y][x]=-;
for(int i=;i<=n;++i)for(int j=i+;j<=n;++j)for(int k=j+;k<=n;++k)
if((graph[i][j]!=)+(graph[j][k]!=)+(graph[i][k]!=)<=)ans+=qtr;
else if(graph[i][j]==&&graph[j][k]==&&graph[k][i]==)ans++;
else if(graph[i][j]==-&&graph[j][k]==-&&graph[k][i]==-)ans++;
else if(graph[i][j]==&&graph[j][k]==&&graph[k][i]==)ans+=hlf;
else if(graph[i][j]==-&&graph[j][k]==-&&graph[k][i]==)ans+=hlf;
else if(graph[i][j]==&&graph[j][k]==&&graph[k][i]==)ans+=hlf;
else if(graph[i][j]==-&&graph[j][k]==&&graph[k][i]==-)ans+=hlf;
else if(graph[i][j]==&&graph[j][k]==&&graph[k][i]==)ans+=hlf;
else if(graph[i][j]==&&graph[j][k]==-&&graph[k][i]==-)ans+=hlf;
printf("%lld\n",ans%mod);
}else if(e<<==n*(n-1ll)){
for(int i=,x,y;i<=e;++i)scanf("%d%d",&x,&y),graph[x][y]=;
for(int i=;i<=n;++i)for(int j=i+;j<=n;++j)if(graph[i][j])out[i].push_back(j);else in[i].push_back(j);
for(int i=;i<=n;++i)for(int j=;j<out[i].size();++j)for(int k=;k<in[i].size();++k)ans+=graph[out[i][j]][in[i][k]];
printf("%lld\n",ans%mod);
}
}

部分分打满

 //可以证明,竞赛图只要存在环,那么最小的环大小一定是3
//所以问的就是图中期望有几个三元环
#include<cstdio>
#include<vector>
using namespace std;
#define qtr 250000002ll
#define hlf 500000004ll
#define six 166666668ll
#define mod 1000000007ll
int pow(long long b,int t,long long a=){for(;t;t>>=,b=b*b%mod)if(t&)a=a*b%mod;return a;}
int p[],q[],n,e;long long ans;
int main(){
scanf("%d%d",&n,&e);
ans=1ll*n*(n-)%mod*(n-)%mod*six%mod;
for(int i=,x,y;i<=e;++i)scanf("%d%d",&x,&y),p[x]++,q[y]--,q[x]--;
for(int i=;i<=n;++i)q[i]+=n-;
for(int i=;i<=n;++i)ans=(ans-p[i]*(p[i]-1ll)/-1ll*p[i]*q[i]%mod*hlf%mod-q[i]*(q[i]-1ll)/%mod*qtr%mod+mod)%mod;
printf("%lld\n",ans);
}

AC

T3:礼物gift

$C_{a_i + b_i + a_j + b_j}^{a_i + a_j}$

$=\sum\limits_{t=0}^{a_i + a_j}C_{a_i +b_i}^{t} \times C_{a_j + b_j}^{a_i + a_j -t}$

$=\sum\limits_{t=-a_i}^{a_j}C_{a_i +b_i}^{t + a_i} \times C_{a_j + b_j}^{a_j -t}$

$=\sum\limits_{t=-a_i}^{b_i}C_{a_i +b_i}^{t + a_i} \times C_{a_j + b_j}^{a_j -t}$

然后就可以发现两部分式子已经分别只与i和j有关了。

带j的那一项关于t开一个桶,然后每次加一个新物品时先枚举t查找桶里的值,再往桶里放一下。

注意贡献答案时t的枚举范围与更新桶时的t的枚举范围是完全相反的。

拆开两部分分别算,改变枚举范围。这是这道题的难点。

 #include<cstdio>
#define mod 1000000007
int fac[],invv[],inv[],n,BUC[],*buc=BUC+,ans;
int Mod(int p){return p<mod?p:p-mod;}
int C(int b,int t){return (t<||t>b)?:1ll*fac[b]*inv[b-t]%mod*inv[t]%mod;}
main(){
fac[]=fac[]=invv[]=inv[]=inv[]=;
for(int i=;i<=;++i)fac[i]=1ll*fac[i-]*i%mod,invv[i]=mod-1ll*mod/i*invv[mod%i]%mod,inv[i]=1ll*inv[i-]*invv[i]%mod;
scanf("%d",&n);
for(int i=,a,b;i<=n;++i){
scanf("%d%d",&a,&b);
for(int t=-a;t<=b;++t)ans=Mod(ans+1ll*buc[-t]*C(a+b,a+t)%mod);
for(int t=-b;t<=a;++t)buc[-t]=Mod(buc[-t]+C(a+b,a-t));
}printf("%d\n",Mod(ans<<));
}

[考试反思]1018csp-s模拟测试79:荒谬的更多相关文章

  1. [考试反思]0718 NOIP模拟测试5

    最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...

  2. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  3. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  4. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  5. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  6. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

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

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  8. [考试反思]0816NOIP模拟测试23

    210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...

  9. [考试反思]0801NOIP模拟测试11

    8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ...

随机推荐

  1. web前端之面试:自我介绍

    面试官您好, 首先很感谢贵公司的面试邀请, 让我有这个幸运机会能来到这里和您交流 : 接下来我做一个简单的自我介绍: 我的姓名是 XX, 祖籍是XX, 年龄是24, 学校是 XXX, 专业是XXX: ...

  2. 给老师安排课表JAVA项目及登录窗口的实现

    实现一个安排课表的Java实验. 有以下几点要求: ①用所给的教师姓名进行课表安排 ②用所给的地点进行课表安排 ③不得有重复的课程名称出现 ④将信息写入到文件里 ⑤用窗口来进行实现 package c ...

  3. MongoDB 走马观花(全面解读篇)

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  4. eclipse 的使用

    eclipse 的官方下载:https://www.eclipse.org/downloads/ 安装时选择 :Eclipse  IDE for Java EE Developers 设置: 1. 编 ...

  5. Pandas处理日常EXCEL表格的便捷操作

    第一次写博客,写的可能有点乱,有问题可以一起探讨.格式可能控制也不是太好. 1.日常的数据集大多带有中文格式,例如“公务员招聘岗位汇总.xls”.我们使用pandas的read_csv()函数读取可能 ...

  6. Android OkHttp + Retrofit 下载文件与进度监听

    本文链接 下载文件是一个比较常见的需求.给定一个url,我们可以使用URLConnection下载文件. 使用OkHttp也可以通过流来下载文件. 给OkHttp中添加拦截器,即可实现下载进度的监听功 ...

  7. 破阵九解:Node和浏览器之事件循环/任务队列/异步顺序/数据结构

    前言 本文内容比较长,请见谅.如有评议,还请评论区指点,谢谢大家! >> 目录 开门见山:Node和浏览器的异步执行顺序问题 两种环境下的宏任务和微任务(macrotask &&a ...

  8. opencv::Brisk检测与匹配

    Brisk(Binary Robust Invariant Scalable Keypoints)特征介绍 构建尺度空间 特征点检测 FAST9-16寻找特征点 特征点定位 关键点描述子

  9. VS2017-Linux项目-使用第三方库如何配置

    1.虚拟机Ubuntu 16.04,安装第三方库,perftools::tcmalloc. 2.Win10下vs2017创建linux项目. 3.项目>>属性>>VC++ 目录 ...

  10. python里怎么查看数据类型

    python里怎么查看数据类型? python里可以通过type()函数来查看数据类型. Python 内置函数 Python 内置函数 Python type() 函数如果你只有第一个参数则返回对象 ...