我好菜啊。。。。。。

%%%迪神AK

虽然考试成绩不太好,但至少能想到正解了,也不会菜到打不出暴力。

T1:想了半天不会,发现直接打高精可以拿到80分,就赶紧码完扔了,结果正解是利用double避免了高精运算

解法:%%迪神,高精压位,同时只记录前300位进行比较。

or利用double和除法,最后和1比较

or正解:double,对所有数取log再进行比较

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL double
#define N 1000050
using namespace std;
int x,y;
inline void work1()
{
LL a1=,a2=0.0;
a1=1.0*y*log(x);
for(int i=;i<=y;++i)a2+=1.0*log((double)i);
if(a1>a2)puts("No");
else puts("Yes");
}
int main()
{
freopen("yuuutsu.in","r",stdin);
freopen("yuuutsu.out","w",stdout);
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d",&x,&y);
work1();
}
fclose(stdin);fclose(stdout);
}

T2:考场正解,细节打炸。将原数列差分掉,然后利用就可以将下标mod k进行操作了。

注意特判:差分的区间为左闭右开。所以当右端点为n+1时是可以随意加的。然而当左端点为0时不能随便加,因为是左闭右开呀

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 2000050
#define re register
using namespace std;
LL s1[N];
inline int read()
{
int s=,b=;char c=getchar();
while(c>''||c<''){if(c=='-')b=;c=getchar();}
while(c>=''&&c<='')s=s*+c-'',c=getchar();
if(b)return -s;
return s;
}
int n,k,m;
int a[N],al,pd[N];
inline void add(int pos,int val)
{
pos%=k;
if(pd[pos])return;
if(s1[pos]==-val){s1[pos]=;--al;return;}
if(!s1[pos]){s1[pos]=val;++al;return;}
s1[pos]+=val;
}
int main()
{
freopen("august.in","r",stdin);
freopen("august.out","w",stdout);
n=read(),k=read(),m=read();
for(register int i=;i<=n;++i)a[i]=read();
for(register int i=n;i;--i)
a[i]-=a[i-],s1[i%k]+=a[i];
pd[(n+)%k]=;
for(int i=;i<k;++i){
if(pd[i])continue;
if(s1[i])++al;
}
if(al)puts("No");
else puts("Yes");
for(int i=,x,y;i<=m;++i)
{
x=read();y=read();
if(y){add(x,y);add(x+,-y);}
if(al)puts("No");
else puts("Yes");
}
fclose(stdin);fclose(stdout);
}

左端点为0不能加

T3:这题好好写一下。

考场上先打出了暴力,然后考虑加优化。

暴力:

 for(int i=,lca;i<=n;++i)
{
lca=a[i];ans+=c[lca];
for(int j=i-;j;--j){
lca=LCA(lca,a[j]);
ans+=c[lca];
}
}

暴力枚举右端点,发现左端点在一段区间内时lca是一定的。

那么这个东西可以用链表来维护。

链表记录lca的值(id)和这个lca对应左端点的数量(ct)

统计答案直接ct*id即可。

然而这种打法还是会被一条链的数据卡掉

深入挖掘它的性质。每插入一个新的右端点,会把链表内所有节点更新到新端点的祖先链上。(显然

那么新加入的节点就一定会加到链表的队尾。且设当前加入的为a[j],那么a[j]和a[j-1]的lca之前的点是共用的。

那么不断利用a[j]和a[j-1]的lca去弹掉链表的队尾。最后在队尾加入a[j]和a[j-1]的lca和a[j]即可

考虑在每个节点再维护一个答案的前缀和(an)

a[j]和a[j-1]的lca之前的所有的节点内所有东西(id,ct,an)都不变。

那么直接更新a[j]和a[j-1]的lca和a[j]的答案即可。

流程:

新开节点,插入队尾,在队中删除不合法的节点并更新a[j]和a[j-1]的lca控制区间长度。

 #include<bits/stdc++.h>
#define LL long long
#define re register
#define N 200050
using namespace std;
inline int read()
{
int s=,b=;char c=getchar();
while(c>''||c<''){if(c=='-')b=;c=getchar();}
while(c>=''&&c<='')s=s*+c-'',c=getchar();
if(b)return -s;
return s;
}
int n,m,a[N],c[N],kkk,num;
struct node{int pre,ne,ct,id;LL an;}li[N*];
LL ans;
int he[N],ne[N],to[N],fa[N],tot;
inline void addedge(int x,int y){to[++tot]=y;ne[tot]=he[x];he[x]=tot;}
int tp[N],dep[N],dfl[N],dfr[N],sz[N],hs[N],cnt;
int po[N];
inline void dfs1(int g)
{
dep[g]=dep[fa[g]]+;sz[g]=;
for(int i=he[g];i;i=ne[i])
{
dfs1(to[i]);
if(sz[to[i]]>sz[hs[g]])hs[g]=to[i];
sz[g]+=sz[to[i]];
}
}
inline void dfs2(int g)
{
dfl[g]=dfr[g]=++cnt;
po[cnt]=g;
if(hs[fa[g]]==g)tp[g]=tp[fa[g]];
else tp[g]=g;
if(hs[g])dfs2(hs[g]);
for(int i=he[g];i;i=ne[i])
if(to[i]!=hs[g])dfs2(to[i]);
dfr[g]=cnt;
}
inline int LCA(int x,int y)
{
if(dep[x]>dep[y])swap(x,y);
if(dfl[x]<=dfl[y]&&dfr[x]>=dfl[y])return x;
while(tp[x]!=tp[y])
{
if(dep[tp[x]]>dep[tp[y]])swap(x,y);
y=fa[tp[y]];
}
if(dep[x]>dep[y])return y;
else return x;
}
inline void del(int x)
{
int a1=li[x].pre,a2=li[x].ne;
if(a1)li[a1].ne=a2;
if(a2)li[a2].pre=a1;
if(!a2)kkk=a1;
}
int main()
{
freopen("sagittarius.in","r",stdin);freopen("sagittarius.out","w",stdout);
n=read();
for(int i=;i<=n;++i){fa[i]=read();addedge(fa[i],i);}
dfs1();dfs2();
for(int i=;i<=n;++i)a[i]=read();
for(int i=;i<=n;++i)c[i]=read();
ans+=c[a[]];li[++num].ct=;
li[num].id=a[];kkk=num;
li[num].an=c[a[]];
for(int j=;j<=n;++j){
li[++num].id=a[j];li[num].ct=;
li[kkk].ne=num;li[num].pre=kkk;
kkk=num;int i,t;
for(i=li[kkk].pre;i;i=li[i].pre){
t=LCA(li[i].id,li[li[i].ne].id);
if(t!=li[i].id){li[i].id=t;
if(li[i].id==li[li[i].ne].id){
li[i].ct+=li[li[i].ne].ct;
del(li[i].ne);
}
}
else {
if(li[i].id==li[li[i].ne].id){
li[i].ct+=li[li[i].ne].ct;
del(li[i].ne);
}
break;
}
}
if(!i)i=;
for(;i;i=li[i].ne)li[i].an=li[li[i].pre].an+1ll*c[li[i].id]*li[i].ct;
ans+=li[kkk].an;
}
cout<<ans<<endl;
}

代码和题解有些出入,但本质上是一样的

复杂度证明:在每个点最多插入两个节点,每个节点被删除一次。复杂度为O(n)

但由于还要求lca,复杂度变为O(nlogn)。(然而你用tarjan求lca做到O(n)我也没意见)

CSPS模拟94的更多相关文章

  1. CSPS模拟 94

    以后干脆不要在准备提交的代码里放调试信息. 再也不忘删printf可是memset还是看不见... T1 玄学错误,不想研究.skyh帮我研究出来了.HACKDATA:1 1 T2 傻逼做法. 发现一 ...

  2. csp-s模拟测试94

    csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...

  3. 反省——关于csp-s模拟50

    本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...

  4. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

  5. csp-s模拟测试98

    csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...

  6. csp-s模拟测试97

    csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...

  7. csp-s模拟测试96

    csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...

  8. csp-s模拟测试95

    csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...

  9. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

随机推荐

  1. Quartz入门以及相关表达式使用

    目的: 1.Quartz简介及应用场景 2.Quartz简单触发器 SimpleTrigger介绍 3.Quartz表达式触发器CronTirgger介绍 4.Quartz中参数传递 5.Spring ...

  2. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  3. maven配置阿里镜像

    在conf\settings.xml 在<mirrors>里面添加   <mirror>    <id>nexus-aliyun</id>    < ...

  4. truncate删除一个分区,测试全局索引是否失效

    目的,有一个清理数据的需求,需要删除历史的一个分区所有记录信息,但是存在主键global索引,如何更好的维护. 如下测试流程一 提前创建好一个已时间created 字段作为分区键的范围分区表 SQL& ...

  5. 关于Windows下的访问控制模型

    在探索Windows操作系统的过程中,发现很多有意思 的东西. Windows下的访问控制模型也是我在Github上浏览代码时,无意中发现的. 项目地址 https://github.com/Krut ...

  6. 起始路由改成分区(Areas)的RouteConfig.cs配置方法

    public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/ ...

  7. C#基础加强笔记

    1面向对象 类:包含字段.属性.函数.构造函数 字段:存储数据 属性:保护字段 get set 函数:描述对象的行为 构造函数:初始化对象,给对象的每个属性赋值 面向对象的好处:让程序具有扩展性 类决 ...

  8. 【转载】Sqlserver使用Convert函数进行数据类型转换

    在Sqlserver数据库中,可以使用Convert函数来进行数据类型的转换,如将数字类型decimal转换为字符串nvarchar类型,或者将字符串类型转换为数字类型都可以使用Convert函数来实 ...

  9. element-ui default-checked-keys 会把节点下所有子节点全部勾选解决方法

    <el-tree class="filter-tree" :data="permissionData" :props="props" ...

  10. 安装xshell、xftp

    1.Xshell的软件的下载.安装 xshell是一个终端模拟软件,而且是远程近程都可以. 就是模拟服务器所在的linux,在xshell中可以输入命令, 就像在服务器的linux中输入命令一样.一般 ...