说在前面:我是反面典型!!!不要学我!!!

说在前面:向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:反典的更多相关文章

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

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

  2. [CSP-S模拟测试41]题解

    中间咕的几次考试就先咕着吧…… A.夜莺与玫瑰 枚举斜率.只考虑斜率为正且不平行于坐标轴的直线,最后把$ans\times 2$再$+1$即可. 首先肯定需要用$gcd(i,j)==1$确保斜率的唯一 ...

  3. csp-s模拟测试41「夜莺与玫瑰·玫瑰花精·影子」

    夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$  $line$是直线 首先横竖就是$n+m$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. idea配置maven以及手动添加webapp目录

    idea配置maven 点击右下角Configure 点击settings 3 . 设置路径 设置自动导包 4 . 点击创建新工程 5 . 选择maven点击下一步 6 . 7 . 8 . 此时,创建 ...

  2. 移动端Rem布局注意事项

    1.布局的总体结构框架:      2.注意事项: (a):如果是左右两栏的布局方式,须在article的同级加一个aside: 因为是同级,所以必须设置同样的样式:而且他俩的父级,也就是sectio ...

  3. POJ1017&&UVA311 Packets(中文题面版)

    感谢有道翻译--- Description A工厂生产的产品是用相同高度h的方形包装,尺寸为1* 1,2 * 2,3 * 3,4 * 4,5 * 5,6 6.这些产品总是以与产品高度h相同,尺寸为66 ...

  4. 大型php网站性能和并发访问优化方案

    网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢? ...

  5. Java学习之面试题整理

    1,java 基本数据类型有几种?哪几种?(面试题) 8种 byte short int long float double char boolean 2,int类型是几个字节?(面试题) 4字节 3 ...

  6. 关于thinkphp框架中模型笔记

    模型这一块,感觉学习的不是很清楚,单独水一贴thinkphp中模型的学习笔记. 0x01 模型类简介 数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名, 把一张表对应为一个类,其中 ...

  7. [CODEVS1537] 血色先锋队 - BFS

    题目描述 Description 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...

  8. MySQL注入--Payload

    MySQL注入--Payload Mirror王宇阳 2019-10-22 SQL的注入流程一般如下: 1.判断是否有SQL注入漏洞(判断注入点) 2.判断数据库的系统架构.数据库名.web应用类型等 ...

  9. 玩转u8g2 OLED库,一篇就够(分篇)

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  10. Leetcode(10)正则表达式匹配

    Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...