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

夜莺与玫瑰

题解

联赛$T1$莫比乌斯$\%\%\%$

 

 $dead$  $line$是直线

首先横竖就是$n+m$这比较显然

枚举方向向量

首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所有斜着的直线

$i,j$表示当自己向右$i$个单位长度,向下$j$单位长度

我们相同斜率下只算最短的线贡献,(因为其他长度下方案数都包含在最短里面了)

我们方向向量$i$,$j$的$gcd(i,j)==1$时我们枚举的才是当前斜率最短长度,

然后考虑贡献

考虑容斥,先算出来当前长度下所有线段再减去重合的

$(n-a)*(m-b)$是总方案数,考虑重合部分

假设我们有一个4*4点阵

. . . .

. . . .

. . . .

. . . .

我们算1,1方向向量贡献

\ \ \ .

\ \ \ \

\ \ \ \

. \ \ \

只有

\ \ \ .

\ \ \ \

\ \ \ \

. \ \ \

标蓝才有贡献,别的都是算重的

定义前趋为$x-1$ $y-1$,后继$x+1$ $y+1$

观察这些线发现符合条件就是前趋不在点阵而后继在点阵数量

例如$1$,$1$这个点$+$方向向量得到$-1$ $-1$ 和$2$ $2$

因为$-1$ $-1$不在点阵内所以是合法的

,我们把他们都提到与边界相重

看他们相减后是否在边界中即可

重复的部分就是$max((n-2*a),0)*max((m-2*b),0)$

$\sum\limits_ {a=1}^{a<=n} \sum\limits_{b=1}^{b<=m} [gcd(a,b)==1](n-a)*(m-b)-max((n-2*a),0)*max((m-2*b),0)$

这样我们还是$AC$不了$T=10000$稍巨

所以我们预处理一下,让查询变成$O(n)$的$(其实可以是O(1))然而出题人还卡空间$

把原式子拆成$(n-a)*m-(n-a)*b$每一个$gcd(a,b)==1$都会对第一个式子造成贡献,而后面那个式子就是$(n-a)*{\sum\limits_{b=1}^{b<=m} [gcd(a,b)==1] b}$

维护前缀和$tot(a,m)$表示$b=1--m所有数中$与$a$,$gcd==1$的个数和为$tot(a,m)$,

$sum(a,m)$表示$b=1--m$中所有$gcd(a,b)==1$对应$\sum\limits_{b=1}^{b<=m} [gcd(a,b)==1] b$和为$sum(a,m)$

所以式子$\sum\limits_ {a=1}^{a<=n} \sum\limits_{b=1}^{b<=m} [gcd(a,b)==1](n-a)*(m-b)$可以化为$(n-a)*(tot(a,m)*m-sum(a,m))$

后面这个式子类似

首先如果$(n-2*a)<=0$或$(m-2*b)<=0$就不用减了

所以$m-2*b>0$才可以即$b<\frac{m}{2}$

所以后面式子可以化为$(n-2*a)*(tot(a,\frac{m}{2})*m-2*sum(a,\frac{m}{2}))$

总式子就是$\sum\limits_{a=1}^{a<=n} (n-a)*(tot(a,m)*m-sum(a,m))-(n-2*a)*(tot(a,\frac{m}{2})*m-2*sum(a,\frac{m}{2}))$

单单是这样你还是$AC$不了$4000*4000$枚举$gcd$很慢,你需要递推

代码

#include<iostream>
#include<cstdio>
using namespace std;
int T,n,m,sum[4100][4100];
const int mod=1073741824;
short num[4100][4100],g[4100][4100];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main(){for(register int i=1;i<=4001;i++){g[i][i]=g[0][i]=g[i][0]=i;for(register int j=1;j<i;j++){g[i][j]=g[j][i]=g[j][i%j];}}for(register int i=1;i<=4001;i++){for(register int j=1;j<=4001;j++){sum[i][j]=sum[i][j-1];num[i][j]=num[i][j-1];if(g[i][j]==1) sum[i][j]=(sum[i][j]+j)%mod,num[i][j]++;}}scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);long long ans=0;for(register int i=1;i<n;i++){ans=(ans+(num[i][m]*m%mod-sum[i][m]%mod)*(n-i)%mod)%mod;if(2*i<n) ans=ans-(num[i][m/2]*m%mod-2*sum[i][m/2]%mod)*(n-i*2)%mod;}ans=(ans*2%mod+n+m)%mod;printf("%lld\n",(ans+mod)%mod);}
}
View Code

夜莺

玫瑰花精

题解

抱歉,题解没时间写了

对于 100%的数据
可以考虑线段树。首先我们对区间[1..n]建立一棵线段树。对于每一个节点,
维护 4 个值。分别是 l,r,mid,p。l 表示在当前结点线段树所在区间最左边的花精所在的位置,r 表示最右边的花精所在的位置。mid 表示在这个小区间[l,r]中的
两只花精之间的最长距离除以 2 后的值。p 表示取 mid 值时所在的紧邻的两只
花精的中间位置,也就是在[l,r]中的答案值。
对于 1 询问:访问线段树的第一个节点,我们比较 l-1,n-r,mid 的值哪
个更大,就选哪个,它们的答案依次是 1,n,p。假设我们求得的位置是 fairy[x]。
然后访问[fairy[x],fairy[x]]所在的线段树的叶子节点,初始化它的值,然后回溯,
进行合并。对于 tr[x].l 与 tr[x].r 可以通过两个儿子的 l,r 信息得出。对于 tr[x].mid
值,首先在左右儿子的 mid 值中去一个最大的值。其次考虑一种情况,就是夹在
两个线段之间的距离,可以通过(tr[x+x+1].l-tr[x+x].r) / 2 的值得出在于 mid
进行比较,然后 p 就随着 mid 的值的更新而更新。
对于 2 询问:访问询问花精所在的位置,直接将它的叶子节点
[fairy[x],fairy[x]]删除,然后回溯时,再做一次合并操作。
View Code

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
struct tree{ll l,r,mid,ql,qr,p;
}tr[A];
ll n,m;
ll in[A];
void built(ll x,ll l,ll r){tr[x].l=l,tr[x].r=r;if(l==r){return ;}ll mid=(l+r)>>1;built(x<<1,l,mid);built(x<<1|1,mid+1,r);
}
void update(ll x){
//    printf("ql=%lld qr=%lld\n",tr[x].ql,tr[x].qr);if(tr[x<<1].ql) tr[x].ql=tr[x<<1].ql;else  tr[x].ql=tr[x<<1|1].ql;if(tr[x<<1|1].qr) tr[x].qr=tr[x<<1|1].qr;else  tr[x].qr=tr[x<<1].qr;tr[x].mid=tr[x<<1].mid;tr[x].p=tr[x<<1].p;if(tr[x<<1].qr&&tr[x<<1|1].ql){
//        ll minn=tr[x].mid;if((tr[x<<1|1].ql-tr[x<<1].qr)/2>tr[x].mid){tr[x].mid=(tr[x<<1|1].ql-tr[x<<1].qr)>>1;tr[x].p=(tr[x<<1].qr+tr[x<<1|1].ql)>>1;
//            minn=tr[x].mid;
        }if(tr[x<<1|1].mid>tr[x].mid){tr[x].mid=tr[x<<1|1].mid;tr[x].p=(tr[x<<1|1].p);
//            minn=tr[x].mid;
        }}    
//    printf("x=%lld l%lld--r%lld <<1%lld %lld |1%lld %lld区间 leftson mid=%lld mid=%lld x.mid=%lld p=%lld p=%lld p=%lld \n",x,tr[x].ql,tr[x].qr,tr[x<<1].ql,tr[x<<1].qr,tr[x<<1|1].ql,tr[x<<1|1].qr,tr[x<<1].mid,tr[x<<1|1].mid,tr[x].mid,tr[x].p,tr[x<<1].p,tr[x<<1|1].p);return ;
}
void change(ll x,ll pla,ll val){if(tr[x].l==tr[x].r){if(val==1){tr[x].ql=tr[x].l;tr[x].qr=tr[x].r;
//            printf("x=%lld l=%lld r=%lld\n",x,tr[x].l,tr[x].r);tr[x].p=0;tr[x].mid=0;return ;}else {tr[x].ql=0,tr[x].qr=0,tr[x].p=0,tr[x].mid=0;
//            printf("x=%lld ql=%lld qr=%lld\n",x,tr[x].ql,tr[x].qr);return ;}}ll mid=(tr[x].l+tr[x].r)>>1;if(mid>=pla) change(x<<1,pla,val);else change(x<<1|1,pla,val);update(x);
}
int main(){scanf("%lld%lld",&n,&m);built(1,1,n);for(ll i=1,opt,a,b;i<=m;i++){scanf("%lld%lld",&opt,&a);if(opt==1){if(tr[1].ql==0){in[a]=1;printf("%lld\n",in[a]);change(1,in[a],1);continue ;}ll minn=-0x7ffffff;
//            printf("mid=%lld ql-1=%lld n-qr=%lld\n",tr[1].mid,tr[1].ql-1,n-tr[1].qr);if(tr[1].ql-1>minn){minn=tr[1].ql-1;in[a]=1;}if(tr[1].mid>minn){minn=tr[1].mid;in[a]=tr[1].p;}if(n-tr[1].qr>minn){minn=n-tr[1].qr;in[a]=n;}printf("%lld\n",in[a]);change(1,in[a],1);}else change(1,in[a],-1);}
}
View Code

影子

题解

以为是神仙$dp$,然后是神仙并查集,

 觉得官方题解写的很明白

将所有点按照权值从大到小排序,对于当前点和比当前点权值大的点和并到一个集合内,并查集维护当前集合直径和对应端点,

合并两个并查集时当前直径可以是其中一个集合中直径或两个集合交叉取

 

 例如集合$AEB$ $CDF$ 合并时直径可以是$A-C$ $A-D$ $B-C$ $B-D$ (交叉取)$A-B$,$C-D$(原本集合)

需要用到两点之间距离$lca$在线回答就行了

合并并查集时$ans=max(ans,直径长度*a[i])$

一个问题是当前点是否在集合内,其实并不会造成影响,你已经将点从大到小排好序了,你当前枚举如果之前出现过那么已经在之前处理过了

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 500000
struct moo{ll l,r,len,fa;
}fa[A];
struct vvv{ll v,id;friend bool operator < (const vvv & a,const vvv & b){return a.v>b.v;}
}v[A];
ll dis[A],f[A][25],head[A],nxt[A],ver[A],edg[A],deep[A],va[A];
ll t,n,m,ans=0,tot=0;
void add(ll x,ll y,ll z){nxt[++tot]=head[x],head[x]=tot,ver[tot]=y,edg[tot]=z;
}
ll find(ll x){
//    printf("%lld.fa=%lld\n",x,fa[x].fa);if(x!=fa[x].fa)fa[x].fa=find(fa[x].fa);return fa[x].fa;
}
inline ll lca(ll x,ll y)
{if(deep[x]>deep[y])swap(x,y);for(ll i=t;i>=0;i--){if(deep[x]==deep[y]) break;if(deep[x]<=deep[f[y][i]]) y=f[y][i];}if(x==y) return x;for(ll i=t;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];return f[x][0];
}
void merge(ll x,ll y,ll edgval,ll now){ll maxx=0;x=find(fa[x].fa),y=find(fa[y].fa);fa[y].fa=x;ll l1=fa[x].l,r1=fa[x].r,l2=fa[y].l,r2=fa[y].r;ll dis1=fa[x].len,dis2=fa[y].len,dis3=dis[l1]+dis[l2]-2*dis[lca(l1,l2)],dis4=dis[l1]+dis[r2]-2*dis[lca(l1,r2)],dis5=dis[r1]+dis[l2]-2*dis[lca(r1,l2)],dis6=dis[r1]+dis[r2]-2*dis[lca(r1,r2)];if(dis2>fa[x].len){fa[x].l=l2,fa[x].r=r2;fa[x].len=dis2;}if(dis3>fa[x].len){fa[x].l=l1,fa[x].r=l2;fa[x].len=dis3;}if(dis4>fa[x].len){fa[x].l=l1,fa[x].r=r2;fa[x].len=dis4;}if(dis5>fa[x].len){fa[x].l=r1,fa[x].r=l2;fa[x].len=dis5;}if(dis6>fa[x].len){fa[x].l=r1,fa[x].r=r2;fa[x].len=dis6;}ans=max(ans,fa[x].len*va[now]);
//    printf("l1=%lld r1=%lld l2=%lld r2=%lld  dis1=%lld dis2=%lld dis3=%lld dis4=%lld dis5=%lld dis6=%lld fa[x].len*va[now]=%lld dis[l1]=%lld+dis[l2]=%lld-2*dis[lca(l1,l2)]=%lld %lld lca=%lld ve[%lld]=%lld\n",l1,r1,l2,r2,dis1,dis2,dis3,dis4,dis5,dis6,fa[x].len*va[now],dis[r1],dis[r2],2*dis[lca(r1,r2)],dis[r1]+dis[r2]-2*dis[lca(r1,r2)],lca(r1,r2),now,va[now]);
}void dfs(ll x,ll pre,ll de){deep[x]=de;for(ll i=head[x];i;i=nxt[i]){ll y=ver[i];if(y==pre) continue ;dis[y]=dis[x]+edg[i];f[y][0]=x;dfs(y,x,de+1);}
}
void mem(){memset(head,0,sizeof(head));memset(fa,0,sizeof(fa));tot=0;ans=0;
}
int main(){    
//    freopen("b.in","r",stdin);
    ll T;scanf("%lld",&T);while(T--){scanf("%lld",&n);mem();t=log(n)/log(2)+1;for(ll i=1;i<=n;i++){scanf("%lld",&v[i].v);v[i].id=i;va[i]=v[i].v;fa[i].fa=i;fa[i].l=fa[i].r=i;}//    printf("n=%lld\n",n);for(ll i=1,a,b,c;i<=n-1;++i){scanf("%lld%lld%lld",&a,&b,&c);add(a,b,c),add(b,a,c);}dfs(1,0,0);f[1][0]=1;for(ll j=1;j<=t;j++)for(ll i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];sort(v+1,v+n+1);for(ll i=1;i<=n;i++){ll x=v[i].id,val=v[i].v;for(ll j=head[x];j;j=nxt[j]){ll y=ver[j];if(va[y]>=va[x]){merge(x,y,edg[j],x);}}}printf("%lld\n",ans);}
}
View Code

 

转载于:https://www.cnblogs.com/znsbc-13/p/11494458.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

春天重试,因为冬天来了

好的&#xff0c;这实际上与冬天无关&#xff0c;众所周知&#xff0c;冬天已经到了 。 它是关于Spring Retry的&#xff0c;Spring是一个小的Spring框架库&#xff0c;它使我们可以将重试功能添加到应可重试的任何任务中。 这里有一个很好的教程 &#xff0c;解释了如何设置简…

python做些什么项目_Python 的练手项目有哪些值得推荐

1 Web方向的练手项目 这个其实是肯定不用多少的了。Python的练手项目就是可以做一个网站了。我们可以做一个属于自己的博客。在做博客的时候&#xff0c;我们可以巩固的知识点是 HtmlCSSJS的基础知识&#xff0c;以及熟练的运用Python的Web开发框架&#xff08;例如Django或者F…

删除某个时间段之前的文件

/* * 删除文件夹下$n分钟前创建的文件 * param $dir 要处理的目录&#xff0c;物理路径&#xff0c;结尾不加\ * param $n 过期时间&#xff0c;单位为分钟 * return void */function z_del_file_by_ctime($dir,$n){ if(is_dir($dir)){ if($dhopendir($dir)){ …

技术管理规划-路径跟资源

背景 评估团队的投入和产出或者给上级做汇报&#xff0c;都需要弄清楚需要投入多少资源&#xff0c;而资源主要跟两个因素息息相关&#xff0c;即团队目标&#xff0c;此外还有路径和手段&#xff1b; 增加人力前的三个问题&#xff1f; 1.资源的丰富性&#xff1f; 人&#xf…

python保存代码_python入门(5)使用文件编辑器编写代码并保存执行

原博文 2017-04-21 17:21 − python入门&#xff08;5&#xff09;使用文件编辑器编写代码并保存执行 两款文本编辑器&#xff1a; 一个是Sublime Text&#xff0c;免费使用&#xff0c;但是不付费会弹出提示框&#xff1a; 一个是Notepad&#xff0c;免费使用&#xff0c;有中…

lucene索引搜索_Lucene –快速添加索引和搜索功能

lucene索引搜索什么是Lucene&#xff1f; Apache LuceneTM是完全用Java编写的高性能&#xff0c;功能齐全的文本搜索引擎库。 它是一项适用于几乎所有需要全文本搜索的应用程序的技术&#xff0c;尤其是跨平台。 Lucene可以纯文本&#xff0c;整数&#xff0c;索引PDF&#xf…

从graphql endpoint获取schema文件

graphql server端有更新&#xff0c;client端需要重新获取schema文件用于创建新的api request&#xff0c;下面简要记录如何从graphql endpoint获取schema文件 You can simply install the CLI using npm or yarn by running the following command. This will add the graphql…

pythonclass全局变量_python的局部变量,全局变量,类变量,实例变量

定义&#xff1a; a、全局变量&#xff1a;在模块内、在所有函数外面、在class外面&#xff0c;这就是全局变量。 b、局部变量&#xff1a;在函数内、在class的方法内&#xff08;未加self修饰的&#xff09;&#xff0c;这就是局部变量。 c、 静态变量&#xff1a;在class内的…

使用JUnit 5测试异常

JUnit 5带来了令人敬畏的改进&#xff0c;它与以前的版本有很大的不同。 JUnit 5在运行时需要Java 8&#xff0c;因此Lambda表达式可以在测试中使用&#xff0c;尤其是在断言中。 这些断言之一非常适合测试异常。 设置项目 为了演示JUnit 5的用法&#xff0c;我使用了我的长期…

pytorch list转tensor_点赞收藏:PyTorch常用代码段整理合集

机器之心转载来源&#xff1a;知乎作者&#xff1a;张皓众所周知&#xff0c;程序猿在写代码时通常会在网上搜索大量资料&#xff0c;其中大部分是代码段。然而&#xff0c;这项工作常常令人心累身疲&#xff0c;耗费大量时间。所以&#xff0c;今天小编转载了知乎上的一篇文章…

csp-s模拟测试42「世界线·时间机器·密码」

$t3$不会 世界线 题解 题目让求的就是每个点能到点的数量$-$出度 设每个点能到的点为$f[x]$ 则$f[x]x \sum\limits_{y}^{y\in son[x]} U f[y]$ 用$bitset$优化一下即可,但单纯这样会炸内存,随意$yy$一下,时间换空间,像平衡树一样开个垃圾桶都行 代码 #include<bits/stdc.h&g…

python中的命名空间_深入理解Python中的命名空间和范围

Python中的命名空间和范围 在Python中&#xff0c;每个包、模块、类、函数和方法函数都拥有一个“名称空间”&#xff0c;其中解析了变量名称。下面本篇文章就来带大家认识一下Python中的命名空间和范围&#xff0c;希望对大家有所帮助。什么是命名空间&#xff1a; 命名空间是…

ubuntu16.04安装MATLAB R2017b步骤详解(附完整破解文件包)

https://blog.csdn.net/qq_32892383/article/details/79670871 转载于:https://www.cnblogs.com/BambooEatPanda/p/11523727.html

lisp将图元追加选择_汕尾幸运儿喜爱大乐透 两次买彩票就擒获8注追加二等奖254万元...

6月26日&#xff0c;中国体育彩票大乐透第19073期开奖&#xff0c;前区开出号码04﹑11﹑19﹑20﹑24&#xff0c;后区开出号码08﹑11。当期送出头奖2注&#xff0c;二等奖176注&#xff0c;其中汕尾一位幸运儿陈先生(化名)擒得追加二等奖8注&#xff0c;喜获奖金2541434元。两次…

什么是JAX-RS注释? (第3部分)

JAX-RS注释概述&#xff08;第3部分&#xff09; 这是一个由三部分组成的系列&#xff0c;介绍了用于实现REST端点的注释。 在JAX-RS批注的第二部分中&#xff0c;您了解了&#xff1a; Path注释和PathParam QueryParamter批注 Produces批注 Consumes批注 在这一部分中&a…

csp-c模拟测试43「A·B·C」

B 题解 $f[i][(gcd(prime[j]*prime[k]\%P,P))]\sum\limits_{k1}^{k<num} f[i-1][k]*phi(\frac{P}{prime[j]})$ 关于$phi(\frac{P}{prime[j]})$理解 $phi(\frac{P}{prime[j]})$是求$prime[j]$代表的数的个数 $Pk_0*prime[j]$ $x_1k_1*prime[j]$ $x_2k_2*prime[j]$ ....... 要…

小甲鱼python全部视频_小甲鱼全套教程之Python系列视频教程

Python 当前位置&#xff1a;主页 > 编程教程 > Python > 小甲鱼全套教程之Python系列视频教程 小甲鱼全套教程之Python系列视频教程 教程大小&#xff1a; 发布时间&#xff1a;2015-04-18   下载次数&#xff1a;次 本套小甲鱼全套教程之Python系列视频教程是比较…

如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...

原标题&#xff1a;高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动前言2020年12月1日&#xff0c;教育部基础教育课程教材发展中心徐州调研暨徐州市2020年高中语文教师“深度学习”研讨活动、徐州市2020年高中化学骨干教师“三新”培训在徐州市第三中学举办。参加…

技术管理角色认知-管理都需要做哪些事

背景 即管理的具体形式&#xff0c;关于what的问题&#xff1f;管理到底要做哪些事情&#xff1f; 派别定义说明过程管理是5个要素组成的一种普遍的人类活动&#xff0c;这5个要素是&#xff1a;计划&#xff0c;组织&#xff0c;指挥&#xff0c;协调&#xff0c;控制亨利法约…

带哨兵节点的链_HBA公链 | IPFS:区块链“不可能三角”的可能解

你知道区块链中的“不可能三角”吗&#xff1f;即区块链无法同时达到可扩展性&#xff08;Scalability&#xff09;、去中心化&#xff08;Decentralization&#xff09;和安全&#xff08;Security&#xff09;。这三个要素中只能同时兼顾两个&#xff0c;比如&#xff0c;要想…