[CSP-S模拟测试94]题解
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]题解的更多相关文章
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- csp-s模拟测试94
csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- [CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...
随机推荐
- 如何在idea中查看jar包源码
文章目录 准备jar包 idea打开文件夹 最后一步 准备jar包 例如,我准备看resin的jar,在桌面准备了一份 idea打开文件夹 在idea中file====>open=====> ...
- SSM Maven MallDemo项目为例
一.创建maven项目 项目结构 创建一个空项目 1. mall (**pom**) 父模块,用于放置公共属性.依赖关系等. 2. mall-util (**jar**) 工具模块,用于放置常用工具类 ...
- SoapUI乱码问题处理方法
前言 每个工具都会有一些意想不到的“坑”,SoapUI也不例外.无论是参数或者响应报文,大家可能都遇到过乱码问题,这里记录一下几种解决乱码的方法. 一.修改显示字体 在File>>> ...
- 应用安全-CTF-格式串漏洞
主要影响c库中print家族函数 - > printf,sprintf,fprintf等 利用: SIP请求URI中格式串
- mooc-IDEA 列操作--005
十一.IntelliJ IDEA -列操作 实例:根据HTTP请求JSON文件,生成一个枚举类 Step1:创建一个枚举类,把要转换的JSON串粘贴进来. 最终要实现效果 Step2:选中第一个100 ...
- Haystack Python全文检索框架
Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...
- Linux中如何将系统调优
Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级.Linux服务器有各 ...
- 在学习linux磁盘管理期间学习的逻辑卷管理笔记
LVM(逻辑分区)的创建顺序:物理分区-物理卷-卷组-逻辑卷-挂载. 物理卷(Physical Volume,PV):就是指硬盘分区,也可以是整个硬盘或已创建的软RAID,是LVM的基本存储设备. 卷 ...
- Gradle打包问题Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0
前言 使用gradle打包react native的时候,出现了如下报错,下面和大家说一下解决的具体办法 Deprecated Gradle features were used in this bu ...
- 基于socket 实现单线程并发
基于socket 实现单线程并发: 基于协程实现内IO的快速切换,我们必须提前导入from gevent import monkey;monkey pacth_all() 以为 gevent spaw ...