[考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!!
说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解。
这次是真的真的运气好。。。
这次知识点上还可以,但是答题策略出了问题。。。
幸亏平时攒的rp生效了(前一天比较耐心的教不少人题来着,与某脸形成对比rp++)(然而可能也并不耐心)
考试过程:
考前,大脸说他可能不是第一个AK csp-s赛制的人,但是应该是第一个AC的。
于是我的目标就变成了抢第一个AC:我要快速切掉最简单的题!!!
考前flag必倒。。。
于是反正第一步就是先找到最简单的题吧。。。
过了一边三道题:T1显然需要找规律并不是很快能切掉,T2数据结构去死吧不会
等等,T3这是啥?大力模拟?STL set可以水?
发现自己hack不掉,然后就开始码。
好写好调。(其实都没怎么调,过编译就过样例)
刚好这题没有大一点的样例,我就直接交了。
然而心急了。细节打错了!
不要给自己凭空施压!
从时间上看的确是第一个,但不是第一个AC。。。
考后5分钟乱改就A了。
然后相较于T2当然我宁愿滚去推式子于是T2暴力都没有打。
然后就去推式子了。然后就差不多死了。(详见下方题解)
暴力很好弄啊。。。但是用了一个小时
但是我的暴力始终过不了小样例里的某一个询问,其实是我手抄样例时抄错了。
我还以为我打错了,心态略崩。抱着骗分的想法继续了。
然后发现会MLE,优化,又用了一个小时。。。
这还是比某孩子tdcp直接MLE0好一些的。
不要忘了还有MLE这种错。
于是我还有20分钟,不抛弃不放弃去T2打暴力。
14分钟完成,过不了样例结果发现和我手模结果一致。。。我手模都不对。。。?!
又看错题了!!!
做题之前不管时间多么紧迫一定要好好看题再手模一个样例!!!不要白费时间!!!
然后就结束了,平时一定会炸一道题,我就交了两个如果炸掉一个的话就只剩100分/80分了
但是rp爆发没有爆炸,拿到了100+空白+80=180。
然后教练说:吴迪又是一个反面示范。
我错了了了了了了了。。。。。
一定要打暴力!!!!
题解区:
T1:夜莺与玫瑰
我的式子是$ \sum\limits_{i=1}^{n-1} \sum\limits_{j=1}^{m-1} [gcd(i,j)==1] \times (min(i,n-i) \times (m-j) + min(j,m-j) \times (n-i) - min(i,n-i) \times min(j,m-j)) $
很长,很丑,但是有具体含义,我给Alpaca解释过了但是实在太复杂,对实际含义感兴趣的可以来找我。
现在的问题是化简。
我们可以发现最不好搞的两项就是min的项,但是只要分类讨论i和n-i的关系以及j同理,那么就可求了。
当i和j分别小于n/2和m/2时,式子的值可以化简为$ \sum\limits_{i=1}^{n/2} \sum\limits_{j=1}^{m/2} [gcd(i,j)==1] n*j+m*i-i*j*3 $
在其他情况下,同理可以化简为只含有ij,im,jn,ij的项
那么我们可以预处理ij,i,j,1在gcd(i,j)==1时的前缀和,4个二维数组干上再O(1)计算即可
发现会MLE。
那么我们就可以离线所有询问,使询问的n递增,我们一次只处理二位数组的一行就行了。
//for(int i=1;i<=n-1;++i)for(int j=1;j<=m-1;++j)if(gcd(i,j)==1)
// ans+=min(n-i,i)*(m-j)+(n-i)*min(m-j,j)-min(n-i,i)*min(m-j,j);
#include<cstdio>
#include<algorithm>
using namespace std;
const long long mod=<<;
long long sig_1[],sig_i[],sig_j[],sig_ij[];
long long si_1[],si_i[],si_j[],si_ij[];
long long s_1,s_i,s_j,s_ij;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
struct ps{int m,n,ord,ans;}p[];
bool com_n(ps a,ps b){return a.n<b.n;}
bool com_ord(ps a,ps b){return a.ord<b.ord;}
void Mod(long long &p){if(p>=mod)p-=mod;}
int main(){
int T,p1=,p2=;
scanf("%d",&T);
for(int i=;i<=T;++i)scanf("%d%d",&p[i].n,&p[i].m),p[i].ord=i;
sort(p+,p++T,com_n);
for(int i=;i<=T;++i){
int n=p[i].n,m=p[i].m;
while(p1<n/){
p1++;
for(int j=;j<=;++j){
if(gcd(p1,j)==)s_1++,Mod(s_i+=p1),Mod(s_j+=j),(s_ij+=p1*j)%=mod;
Mod(sig_1[j]+=s_1),Mod(sig_i[j]+=s_i),
Mod(sig_j[j]+=s_j),Mod(sig_ij[j]+=s_ij);
}
s_1=s_i=s_j=s_ij=;
}
while(p2<n-){
p2++;
for(int j=;j<=;++j){
if(gcd(p2,j)==)s_1++,Mod(s_i+=p2),Mod(s_j+=j),(s_ij+=p2*j)%=mod;//if(j<=2)printf("--%lld\n",s_1);
Mod(si_1[j]+=s_1),Mod(si_i[j]+=s_i),
Mod(si_j[j]+=s_j),Mod(si_ij[j]+=s_ij);//if(j<=2)printf("%lld\n",si_1[j]);
}
s_1=s_i=s_j=s_ij=;
}
p[i].ans=(mod+(
(-n*m*sig_1[m/]-*sig_ij[m/]+*sig_i[m/]*m+*sig_j[m/]*n)
+
(n*m*si_1[m-]+si_ij[m-]-si_i[m-]*m-si_j[m-]*n)
)%mod)%mod;//printf("%lld %lld %lld %lld\n",si_1[m-1],si_ij[m-1],si_i[m-1],si_j[m-1]);
}
sort(p+,p++T,com_ord);
for(int i=;i<=T;++i)printf("%lld\n",(p[i].ans*+p[i].n+p[i].m)%mod);
}
记录思想(包括其它大神用的):
- 离线
- 记忆化gcd(去掉log)
- 反演(带根号回答询问)
- 拆式子,去min,max,保留不同的0,1,2次项求前缀和
- 卡空间,运行内存实际很小,2×4000×4000在128M下可过
- 询问排序递增,单调指针硬扫
T2:影子
考场上没打,不多说
前置知识:树的直径。
树上任意一点开始dfs,距离最远的点一定是直径的两个端点之一。
接下来按照点权排序,从大到小解锁每一个点。
然后我们用并查集维护当前树的直径以及端点,每次合并AB时分别讨论:
1.直径就是A里的直径
2.就是B里的
3-6.是从A的端点里选一个,走到目前枚举的边,再走到B的一个端点
取最优决策,用直径×点权更新ans。
因为前两种情况里直径一定被更大或相等的点权枚举过,所以用较小的点不会使ans变大,故决策最优。
预处理,倍增求LCA,树上前缀和,实现O(log)查询两点距离。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
int t,n,fir[],l[],to[],cnt,f[],al[],p1[],p2[];
int ans,v[],d[],F[][],dep[],dt[];
struct ps{int p,v;friend bool operator<(ps a,ps b){return a.v>b.v;}}p[];
void link(int a,int b,int vv){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;v[cnt]=vv;}
int find(int k){return f[k]==k?k:f[k]=find(f[k]);}
void dfs(int p,int fa){
F[][p]=fa;dep[p]=dep[fa]+;
for(int i=;i<=;++i)F[i][p]=F[i-][F[i-][p]];
for(int i=fir[p];i;i=l[i])if(to[i]!=fa)dt[to[i]]=dt[p]+v[i],dfs(to[i],p);
}
int DT(int a,int b){//printf("DT:%lld %lld\n",a,b);
int A=a,B=b,subdep=dep[a]-dep[b];
if(subdep<)subdep=-subdep,a^=b^=a^=b,A^=B^=A^=B;
for(int i=;i<=;++i)if(subdep&<<i)a=F[i][a];
if(a==b)return dt[A]-dt[B];
for(int i=;~i;--i)if(F[i][a]!=F[i][b])a=F[i][a],b=F[i][b];
a=F[][a];
return dt[A]+dt[B]-dt[a]-dt[a];
}
main(){//freopen("b.in","r",stdin);
//freopen("x.in","r",stdin);//freopen("my.out","w",stdout);
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
for(int i=;i<=n;++i)f[i]=p1[i]=p2[i]=i;
for(int i=;i<=n;++i)scanf("%lld",&p[i].v),p[i].p=i;
sort(p+,p++n);
for(int i=,a,b,vv;i<n;++i)scanf("%lld%lld%lld",&a,&b,&vv),link(a,b,vv),link(b,a,vv);
dfs(,);
for(int i=;i<=n;++i){
int P=p[i].p;al[P]=;//printf("Unlocked : %lld\n",P);
for(int j=fir[P];j;j=l[j])if(al[to[j]]){
int F=find(to[j]);f[F]=P;
int d1=DT(P,p1[P]),d2=DT(P,p2[P]),totd,c1,c2;
if(d1>d2)totd=d1,c1=p1[P];else totd=d2,c1=p2[P];//printf("%lld %lld %lld %lld\n",d1,d2,p1[P],p2[P]);
d1=DT(to[j],p1[F]),d2=DT(to[j],p2[F]);
if(d1>d2)totd+=d1,c2=p1[F];else totd+=d2,c2=p2[F];//printf("%lld %lld %lld %lld\n",d1,d2,p1[F],p2[F]);
if(totd+v[j]>d[P])d[P]=totd+v[j],p1[P]=c1,p2[P]=c2;//,puts("UPD");
if(d[F]>d[P])d[P]=d[F],p1[P]=p1[F],p2[P]=p2[F];
ans=max(ans,d[P]*p[i].v);//printf("%lld %lld %lld %lld\n",to[j],d[P],p1[P],p2[P]);
}
}printf("%lld\n",ans);
for(int i=;i<=n;++i)fir[i]=d[i]=al[i]=;
cnt=ans=;
}
}
思路积累:
- 并查集维护联通块
- 树的直径性质
- 点分治做法(没打,但是简单粗暴,难打好想)
- 贪心,按顺序解锁点
- 预处理做到O(log)求树上点对距离{树上差分+倍增LCA}
- 要会打暴力
T3:玫瑰花精
set大力模拟即可。
维护两个set,一个存两个花精之间的间隔,另一个存位置。
不断按照题意insert,erase即可。
#include<cstdio>
#include<set>
#include<vector>
using namespace std;
struct ps{
int dt,sp;
friend bool operator<(ps a,ps b){
return a.dt/>b.dt/||(a.dt/==b.dt/&&a.sp<b.sp);
}
};
set<ps>bl;set<int>p;
int n,m,o,x,ip[];
int main(){//freopen("c.in","r",stdin);
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&o,&x);
if(o==){
if(p.size()==)p.insert(),ip[x]=,puts("");
else if(p.size()==){
int xx=*p.begin();
if(xx>=n>>)p.insert(),ip[x]=,puts(""),bl.insert((ps){xx,});
else p.insert(n-),ip[x]=n-,printf("%d\n",n),bl.insert((ps){n-xx-,xx});
}
else{
int p1=*p.begin(),p2=n-(*(--p.end()))-,p3=(*bl.begin()).dt/,p3p=(*bl.begin()).sp;
if(p1>=p2&&p1>=p3)p.insert(),ip[x]=,puts(""),bl.insert((ps){p1,});
else if(p2>p3)p.insert(n-),ip[x]=n-,printf("%d\n",n),bl.insert((ps){p2,n-p2-});
else{
int l=p3p,r=(*bl.begin()).dt+p3p,xx=l+r>>;
p.insert(xx);ip[x]=xx;printf("%d\n",xx+);
bl.insert((ps){r-xx,xx});bl.insert((ps){xx-l,l});
bl.erase(bl.begin());//printf("%d %d %d\n",l,r,xx);
}
}
}else{
if(p.size()<=)p.erase(ip[x]),bl.clear();
else{
if(ip[x]==(*p.begin()))bl.erase((ps){(*p.upper_bound(ip[x]))-ip[x],ip[x]});
else if(ip[x]>=(*(--p.end())))bl.erase((ps){ip[x]-(*(--p.end())),(*(--p.end()))});
else{
int lp=*(--(p.lower_bound(ip[x]))),rp=*(p.upper_bound(ip[x]));
bl.erase((ps){rp-ip[x],ip[x]});bl.erase((ps){ip[x]-lp,lp});
bl.insert((ps){rp-lp,lp});
}
p.erase(ip[x]);
}
}
}
}
思路积累:
- STL的熟练应用
- 线段树维护最长区间(同《旅馆Hotel》,我还没有A)
- 代码实现细节,注意先后顺序
- 重载比较函数的多样性
[考试反思]0909csp-s模拟测试41:反典的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- [CSP-S模拟测试41]题解
中间咕的几次考试就先咕着吧…… A.夜莺与玫瑰 枚举斜率.只考虑斜率为正且不平行于坐标轴的直线,最后把$ans\times 2$再$+1$即可. 首先肯定需要用$gcd(i,j)==1$确保斜率的唯一 ...
- csp-s模拟测试41「夜莺与玫瑰·玫瑰花精·影子」
夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$ $line$是直线 首先横竖就是$n+m$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [考试反思]0816NOIP模拟测试23
210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...
随机推荐
- idea配置maven以及手动添加webapp目录
idea配置maven 点击右下角Configure 点击settings 3 . 设置路径 设置自动导包 4 . 点击创建新工程 5 . 选择maven点击下一步 6 . 7 . 8 . 此时,创建 ...
- 移动端Rem布局注意事项
1.布局的总体结构框架: 2.注意事项: (a):如果是左右两栏的布局方式,须在article的同级加一个aside: 因为是同级,所以必须设置同样的样式:而且他俩的父级,也就是sectio ...
- POJ1017&&UVA311 Packets(中文题面版)
感谢有道翻译--- Description A工厂生产的产品是用相同高度h的方形包装,尺寸为1* 1,2 * 2,3 * 3,4 * 4,5 * 5,6 6.这些产品总是以与产品高度h相同,尺寸为66 ...
- 大型php网站性能和并发访问优化方案
网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢? ...
- Java学习之面试题整理
1,java 基本数据类型有几种?哪几种?(面试题) 8种 byte short int long float double char boolean 2,int类型是几个字节?(面试题) 4字节 3 ...
- 关于thinkphp框架中模型笔记
模型这一块,感觉学习的不是很清楚,单独水一贴thinkphp中模型的学习笔记. 0x01 模型类简介 数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名, 把一张表对应为一个类,其中 ...
- [CODEVS1537] 血色先锋队 - BFS
题目描述 Description 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...
- MySQL注入--Payload
MySQL注入--Payload Mirror王宇阳 2019-10-22 SQL的注入流程一般如下: 1.判断是否有SQL注入漏洞(判断注入点) 2.判断数据库的系统架构.数据库名.web应用类型等 ...
- 玩转u8g2 OLED库,一篇就够(分篇)
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- Leetcode(10)正则表达式匹配
Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...