[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的逆元,那么只要先把乘 ...
随机推荐
- SQLServer中的top、MySql中的limit、Oracle中的rownum
(1)在SQL Server中,我们使用 select top N * from tablename来查询tablename表中前N条记录. (2)在MySQL中,我们使用select * from ...
- Hadoop and Big Data
Hadoop(1): HDFS Basics Hadoop(2):HDFS Block Management Hadoop(3): Prepare inputs for MapReduce mappe ...
- 绕过安全狗Apache4.0版本
参数拦截:script.空格and空格.空格or空格.union select.user() 绕过: and.order by绕过: 内联注释 union select绕过: union%23%0a ...
- git --> 工作使用流程
[git]------git开发过程中的使用流程------[WangQi] 001.创建仓库 002.新建项目 003.初始化仓库 这一步不需要做 git init : 文件夹中会多出一个隐藏 ...
- springboot启动时报错 错误: 找不到或无法加载主类 com.xxx.xxx.Application
1. Q1 错误: 找不到或无法加载主类 com.xxx.xxx.Application 解决办法:啥也不动,maven clean下,重启 1. Q2 layui控制下拉框高度 解决 .layui- ...
- static定义属性
static关键字在Java程序开发过程中主要进行属性和方法的定义. static 定义属性: 类中的最主要的组成就是属性和方法,那么在说static之前,先看看一下问题: 范例:定义一个描述球的信息 ...
- herizai_CD2所做答案
//herizai_CD1第一题 #include<iostream> #include<iomanip> using namespace std; void print1(i ...
- Vue 基础 day02
Vue Devtools 安装 https://chrome.google.com/webstore/search/vue%20devtools?hl=zh-CN 需要翻墙 过滤器 概念: Vue.j ...
- mysql 多表查询 以及 concat 、concat_ws和 group_concat
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只返 ...
- java 泛型的内部原理:类型擦除以及类型擦除带来的问题
一.Java泛型的实现方法:类型擦除前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(ty ...