我好菜啊。。。。。。

%%%迪神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. 2019杭电多校三 C. Yukikaze and Demons (点分治)

    大意: 给定树, 每个点有一个十进制数位, 求有多少条路径组成的十进制数被$k$整除. 点分治, 可以参考CF715C, 转化为求$10^a x+b\equiv 0(mod\space k)$的$x$ ...

  2. 转 实现类似QQ的窗体停靠

    [DllImport("User32.dll")] public static extern bool PtInRect(ref Rectangle Rects, Point lp ...

  3. mysql建表常用命令

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...

  4. Tomcat安装及环境配置

    欢迎任何形式的转载,但请务必注明出处. 本章内容 安装 环境变量入口 三个系统变量配置 测试安装配置是否成功 安装之前请安装jdk并进行环境配置(点击进入jdk教程) 一.安装 点击进入官网下载 二. ...

  5. Java 之 IO 异常的处理【了解】

    一.JDK7 前的处理 前面的 Demo 中,一直把异常抛出,而在实际中并不能这样处理,建议使用 try...catch...finally 代码块,处理异常部分. 格式: try{ 可能会产出异常的 ...

  6. FreeRTOS 任务挂起和恢复

    在使用RTOS的时候一个实时应用可以作为一个独立的任务.每个任务都有自己的运行环境, 不依赖于系统中其他的任务或者RTOS调度器. 任何一个时间点只能有一个任务运行,具体运行哪个任务是由RTOS调度器 ...

  7. volatile和锁

    让编译器不要将变量缓存到寄存器,而是每次去访问主板上的内存 可见性 对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入 原子性 对任意单个volatile变量的 ...

  8. 关于#error

    很简单的一个东西,但是感觉使用价值没有太大.实现了以下,结果如下: 执行到#error语句的时候直接停止编译,在下面输出设定好的错误信息. 来自为知笔记(Wiz)

  9. laravel模型关联评论

    用户模型 public function show(Post $post,LogManager $log){ $post->load("comments"); //这种方式是 ...

  10. Linux安全:Linux如何防止木马

    (一)解答战略 去企业面试时是有多位竞争者的,因此要注意答题的维度和高度,一定要直接秒杀竞争者,搞定高薪offer. (二)解答战术 因为Linux下的木马常常是恶意者通过Web的上传目录的方式来上传 ...