[考试反思]1018csp-s模拟测试79:荒谬
对,如果你想把第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:荒谬的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [考试反思]0816NOIP模拟测试23
210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...
- [考试反思]0801NOIP模拟测试11
8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ...
随机推荐
- 4、pytest 中文文档--pytest-fixtures:明确的、模块化的和可扩展的
目录 1. fixture:作为形参使用 2. fixture:一个典型的依赖注入的实践 3. conftest.py:共享fixture实例 4. 共享测试数据 5. 作用域:在跨类的.模块的或整个 ...
- 使用Newspaper3k框架快速抓取文章信息
一.框架介绍 Newspaper是一个python3库,但是Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url.新闻信息等,但对于想获 ...
- Python基础库之jieba库的使用(第三方中文词汇函数库)
各位学python的朋友,是否也曾遇到过这样的问题,举个例子如下: “I am proud of my motherland” 如果我们需要提取中间的单词要走如何做? 自然是调用string中的spl ...
- LeetCode初级算法--字符串01:反转字符串
LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- powershell(一)
Windows powershell是一种命令行外壳程序和脚本环境,它内置在win7以上版本的操作系统中,使命令行用户和脚本编写者可以利用.NET Framework的强大功能.powershell程 ...
- JavaScript七宗罪和一些槽点
当下JavaScript越来越流行,成为长期霸语言榜前三的语言.但是实际上JavaScript是一个很丑陋有很多槽点的语言,这就是为什么新出了那么多框架(从jQuery到Vue)以及海尔斯伯格大大推出 ...
- DM7经常使用的命令汇总
由于DM7兼容oracle ,所以当你不知道某个命令时,大抵就是可以参照oracle的命令及语法,当然有极少的情况会不一样.常用命令如下: 1.连接登录 disql SYSDBA/SYSDBA@223 ...
- [USACO10NOV]购买饲料Buying Feed 单调队列优化DP
题目描述 约翰开车来到镇上,他要带 KKK 吨饲料回家.运送饲料是需要花钱的,如果他的车上有 XXX 吨饲料,每公里就要花费 X2X^2X2 元,开车D公里就需要 D×X2D\times X^2D×X ...
- Halcon一日一练:图像分割之阈值分割1
先了解什么是阈值,度娘告诉我的是:一个领域或一个系统的界限称为阈,其数值称为阈值.在图像中,我们把图像看成一个由像素灰度值组成的数集,那么阈,就是这个图像中,根据目标与背景灰度值的差异,选取的一个合适 ...
- libevent::bufferevent
#include <cstdio> #include <netinet/in.h> #include <sys/socket.h> #include <fcn ...