CSPS模拟94
我好菜啊。。。。。。
%%%迪神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的更多相关文章
- CSPS模拟 94
以后干脆不要在准备提交的代码里放调试信息. 再也不忘删printf可是memset还是看不见... T1 玄学错误,不想研究.skyh帮我研究出来了.HACKDATA:1 1 T2 傻逼做法. 发现一 ...
- csp-s模拟测试94
csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...
- 反省——关于csp-s模拟50
本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...
- csp-s模拟测试99
csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
- csp-s模拟测试96
csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
- csp-s模拟测试93
csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...
随机推荐
- k8s安装ingress
1. 环境准备 安装nginx-ingress-controller和backend cd /etc/yum.repos.d/mainfests 下载镜像的脚本 vi ingressnginx.sh ...
- vue防止闪屏小技巧:[v-cloak]
css 内添加此属性[v-cloak] { display: none; } html中引入即可 <div v-cloak> {{ message }} </div> 如果觉得 ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team [单调栈上二分]
也许更好的阅读体验 \(\mathcal{Description}\) 给n个数,与一个数m,求\(a_i\)右边最后一个至少比\(a_i\)大\(m\)的数与这个数之间有多少个数 \(2\leq n ...
- Markdown试试
from os import time print("haha") from os import time print("haha") time.time()! ...
- Authentication failed for "http://xxxxxx"
1.配置用户信息 git config --global user.name [username] git config --global user.email [email] 2.查询用户信息 ...
- 3_PHP表达式_3_有关变量或常量状态的函数
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 1. 数据类型查看函数 PHP为变量或常量提供了查看数据类型的函数,其中包括gettype()和var_dump( ...
- 【已解决】老型号电脑需要按F1键才能进入系统
[已解决]老型号电脑需要按F1键才能进入系统 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Tue, 16 Jul 2019 20:49:00 +0800 问题描述:电脑因 ...
- webdispatch配置
PRDPISP01:/sapmnt/WIP/profile # su - wipadm PRDPISP01:wipadm 23> cdpro PRDPISP01:wipadm 24> ls ...
- [转]預防 Android Dex 64k Method Size Limit
转载自:http://ingramchen.io/blog/2014/09/prevention-of-android-dex-64k-method-size-limit.html 08 Septem ...
- for循环的耗时问题
结论——用变量来缓存数组长度,效率会更高