A.凉宫春日的忧郁

高精硬上似乎跑不过,其实可以都取个$log$。那么只需要比较$y\times log ^x$和$\sum \limits _{i=1}^y log^i$就好了。

#include<bits/stdc++.h>
using namespace std;
int T;
double x,y;
void work()
{
scanf("%lf%lf",&x,&y);
double res1=y*log2(x);
double res2=0;
for(int i=1;i<=y;i++)
res2+=log2(double(i));
if(res1<=res2)puts("Yes");
else puts("No");
} int main()
{
freopen("yuuutsu.in","r",stdin);
freopen("yuuutsu.out","w",stdout);
scanf("%d",&T);
while(T--)work();
return 0;
}

B.漫无止境的八月

显然目标区间合法的充要条件是:把位置按照$mod \ K$意义分组,每组的权值和应该相等。

必要性:每次操作对于每一组的改变量都相同,所以最终的和也必然相等。

充分性:……很显然吧。

直接Hash表维护就好了,每次修改完判断是不是只有一种权值和即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#define ol
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=2e6+5;
int n,K,Q,a[N],sum[N];
struct Hashtable
{
#define mod 19260817
int tot,head[19260820],nxt[N],to[N],val[N];
int &operator [] (int v)
{
int x=v%mod;
for(int i=head[x];i;i=nxt[i])
if(to[i]==v)return val[i];
to[++tot]=v;nxt[tot]=head[x];
head[x]=tot;
return val[tot]=0;
}
}s;
int main()
{
#ifdef ol
freopen("august.in","r",stdin);
freopen("august.out","w",stdout);
#endif
n=read();K=read();Q=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
sum[i%K]+=a[i];
for(int i=0;i<K;i++)
s[sum[i]]++;
if(s[sum[0]]==K)puts("Yes");
else puts("No");
while(Q--)
{
int x=read(),val=read();
a[x]+=val;
s[sum[x%K]]--;
sum[x%K]+=val;
s[sum[x%K]]++;
if(s[sum[0]]==K)puts("Yes");
else puts("No");
}
return 0;
}

C.射手座之日

构造一个新的点权$v'[x]=v[x]-v[fa[x]]$,那么区间权值就成了区间内所有元素的$lca$的权值和,从每个点的角度考虑就是它作为一些连续点的祖先的方案数再乘上点权。

对于每个点建一棵线段树,维护左侧起最长连续段的端点,右侧起最长连续段的端点和方案数,线段树合并即可,维护过程类似于《山海经》。

方案数就是可以取的连续区间数,即$\frac {(r-l+1)(r-l+2)}{2}$,除以2可以留在外面做。

#include<cstdio>
#include<iostream>
#include<cstring>
#define ol
using namespace std;
typedef long long ll;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=2e5+5;
int n,fa[N],a[N],pos[N];
int to[N<<1],head[N],nxt[N<<1],tot;
ll v[N],ans;
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int root[N],type,lp[N*30],rp[N*30],ls[N*30],rs[N*30];
ll w[N*30];
void up(int k,int l,int r)
{
int mid=l+r>>1;
lp[k]=lp[ls[k]];rp[k]=rp[rs[k]];
w[k]=w[ls[k]]+w[rs[k]];
if(rp[ls[k]]&&lp[rs[k]])
{
w[k]-=1LL*(mid-rp[ls[k]]+1)*(mid-rp[ls[k]]+2)+1LL*(lp[rs[k]]-mid)*(lp[rs[k]]-mid+1);
w[k]+=1LL*(lp[rs[k]]-rp[ls[k]]+1)*(lp[rs[k]]-rp[ls[k]]+2);
}
if(lp[ls[k]]==mid)lp[k]=lp[rs[k]]?lp[rs[k]]:mid;
if(rp[rs[k]]==mid+1)rp[k]=rp[ls[k]]?rp[ls[k]]:mid+1;
}
void update(int &k,int l,int r,int pos)
{
if(!k)k=++type;
if(l==r)
{
lp[k]=rp[k]=l;w[k]=2;
return ;
}
int mid=l+r>>1;
if(pos<=mid)update(ls[k],l,mid,pos);
else update(rs[k],mid+1,r,pos);
up(k,l,r);
}
int merge(int x,int y,int l,int r)
{
if(!x||!y)return x+y;
if(l==r)return x;
int mid=l+r>>1;
ls[x]=merge(ls[x],ls[y],l,mid);
rs[x]=merge(rs[x],rs[y],mid+1,r);
up(x,l,r);
return x;
}
void dfs(int x)
{
update(root[x],1,n,pos[x]);
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
dfs(y);
merge(root[x],root[y],1,n);
}
ans+=w[root[x]]/2*v[x];
}
int main()
{
#ifdef ol
freopen("sagittarius.in","r",stdin);
freopen("sagittarius.out","w",stdout);
#endif
n=read();
for(int i=2;i<=n;i++)
{
fa[i]=read();
add(fa[i],i);
}
for(int i=1;i<=n;i++)
a[i]=read(),pos[a[i]]=i;
for(int i=1;i<=n;i++)
v[i]=read();
for(int i=n;i;i--)
v[i]-=v[fa[i]];
dfs(1);
printf("%lld\n",ans);
return 0;
}

[CSP-S模拟测试94]题解的更多相关文章

  1. CSP-S 模拟测试94题解

    T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...

  2. csp-s模拟测试94

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

  3. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  4. CSP-S 模拟测试92 题解

    话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...

  5. CSP-S 模拟测试57题解

    人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...

  6. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

  7. CSP-S 模拟测试 45 题解

    由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...

  8. [CSP-S模拟测试97]题解

    A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...

  9. [CSP-S模拟测试96]题解

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

随机推荐

  1. python中的包和文件夹的区别

    python的模块,就不得不说包(package),package是module的集合,在一个package中有很多的module, 还是以之前的index.py与baiduHq.py模块为案例,说明 ...

  2. js提交图片转换为base64

    $("#picAjax").change(function () { var strs = ""; var file = $("#picAjax&qu ...

  3. 欧拉函数&欧拉定理&降幂 总结

    欧拉函数&欧拉定理&降幂 总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300214 这年头不总结一下是真的容易忘,老了老 ...

  4. (三:NIO系列) Java NIO Channel

    出处: Java NIO Channel 1.1. Java NIO Channel的特点 和老的OIO相比,通道和NIO流(非阻塞IO)主要有以下几点区别: (1)OIO流一般来说是单向的(只能读或 ...

  5. React手稿之 React-Saga

    Redux-Saga redux-saga 是一个用于管理应用程序副作用(例如异步获取数据,访问浏览器缓存等)的javascript库,它的目标是让副作用管理更容易,执行更高效,测试更简单,处理故障更 ...

  6. 显式Mapping设置与常见参数介绍

    原文:显式Mapping设置与常见参数介绍 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ ...

  7. struts2 spring 优缺点

    struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发.优点:Struts跟Tomcat.Turbine等诸多Apache项目一样,是开源软件,这是它的一大 ...

  8. FFmpeg从入门到出家(FLV文件结构解析)

    FLV(FLASH VIDEO),是一种常用的文件封装格式,目前国内外大部分视频分享网站都是采用的这种格式.其标准定义为<Adobe Flash Video File Format Specif ...

  9. 常用Linux Shell命令组合

    序号 任务 命令组合 1 删除0字节文件 find . -type f -size 0 -exec rm -rf {} \;find . type f -size 0 -delete 2 查看进程,按 ...

  10. #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ

    题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...