我好菜啊。。。。。。

%%%迪神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. 2.33模型--去除字符串两头空格.c

    [注:本程序验证是使用vs2013版] #include <stdio.h> #include <stdlib.h> #include <string.h> #pr ...

  2. mysql 系统变量

    show variables; ---------------------------------+-------------------------------------------------- ...

  3. Python 2.7.x 和 3.x 版本的重要区别小结

    许多Python初学者都会问:我应该学习哪个版本的Python.对于这个问题,我的回答通常是"先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本.等学得差 ...

  4. Action请求后台出现Response already commited异常解决方法

    在编写导出功能使用action请求,在处理导出异常时期望跳转异常页,Controller中的方法返回类型String的url 在处理完逻辑导出文件后后台控制台出现 WARN  [org.springf ...

  5. elementUI图片墙上传

    elementUI提供了照片墙上传的功能,我们直接拿来用. 以下是实现代码: <template> <div style="padding: 50px;"> ...

  6. EntityFramework进阶(二)- DbContext预热

    本系列原创博客代码已在EntityFramework6.0.0测试通过,转载请标明出处 在DbContext首次调用的时候,会很慢,甚至会有5,6秒的等待,通常称为冷查询.再次调用的时候,几毫秒就能请 ...

  7. 发现一个对列排版挺好用的命令:column

    help [root@hdpool1 tmp]# column -h Usage: column [options] [file ...] Options: -c, --columns <wid ...

  8. OpenStack kilo版(6) 启动第一台虚拟机

    创建网络 提供者为external,类型为flat,网络名称为public,: root@controller:~# neutron net-create --shared --provider:ph ...

  9. 缺包与maven

    一. 缺包 1. 打开pom.xml 将依赖加入. 2. mvn clean install -DskipTests 3. scp target/lib/****.jar(刚刚的依赖的架包) 服务器地 ...

  10. MySQL 主从复制 详细实例讲解 与 常见错误解决方法

    一.主机ip 192.168.0.128 ,从机ip:192.168.0.130 分别测试是否能ping通对方,如果不能,请关闭防火墙或开放对应端口 二.主服务器配置 1.备份主服务器的数据 mysq ...