[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的逆元,那么只要先把乘 ...
随机推荐
- 利用Python进行windows系统上的图像识别与点击(Mac OS系统也可以)
系统环境: 1.安装了python 2.安装了pyautogui模块 windows系统:无需安装依赖模块,在cmd中直接输入pip install pyautogui即可完成安装 Mac OS系统: ...
- Arduino入门之前
胡乱乱的,就买了,这个 arduino的板子. 哎...本来明明是 学动漫的,然后 不小心就开始 做软件了,然后 越跑越偏...现在 开始 做 硬件开发了... 其实 还有 树莓派 可供选择,算了,不 ...
- 介绍一款代理端口管理工具--Proxfier
官网下载地址: https://www.proxifier.com/download/ProxifierSetup.exe 用户名随意填注册码下边 5EZ8G-C3WL5-B56YG-SCXM9-6Q ...
- CGI 环境变量
CGI 环境变量 环境变量 意义 SERVER_NAME CGI脚本运行时的主机名和IP地址. SERVER_SOFTWARE 你的服务器的类型如: CERN/3.0 或 NCSA/1.3. GATE ...
- debian下使用shell脚本时出现了 declare:not found 解决方法
问题:出现declare:not found的提示 解决:原来,UBUNTU用的是dash(后来证明这个其实这个不是错误的原因:从#!/bin/bash到#!/bin/dash,依旧无法运行,在这写出 ...
- Ubuntu操作系统的总结操作
一.Ubuntu系统环境变量 Ubuntu Linux系统环境变量配置文件分为两种:系统级文件和用户级文件 1.系统级文件: /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件 ...
- Java枚举enum关键字
枚举的理解 枚举其实就是一个类,枚举类的实例是一组限定的对象 传统的方式创建枚举 [了解] 对比:单例类 1.构造器私有化 2.本类内部创建对象 3.通过public static方法,对外暴露该对象 ...
- CocosCreator与Laya2.0区别
1图集: Laya:直接拖拽res里面的图片,当生成图集后,会自动优先使用图集的 Cocos:应该先打图集,且图集里的图就是图集里的图,资源里的图就是资源里的.2者不同 addChild Laya:会 ...
- 问题 A: 组合数
问题 A: 组合数 时间限制: 1 Sec 内存限制: 128 MB提交: 1975 解决: 150[提交] [状态] [命题人:jsu_admin] 题目描述 求组合数C(N,M),以及C(N, ...
- P5445 [APIO2019]路灯
传送门· 对于询问 $(a,b)$ ,感觉一维很不好维护,考虑把询问看成平面上的一个点,坐标为 $(a,b)$ 每个坐标 $(x,y)$ 的值表示到当前 $x$ 和 $y$ 联通的时间和 考虑一个修改 ...