CSP-S 模拟测试94题解
T1 yuuustu:
可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$
然后我就用神奇0.4骗分水过
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
struct BigInt{
int a[];
BigInt(){memset(a,,sizeof(a));a[]=a[]=;}
BigInt friend operator * (BigInt x,int y){
int len=x.a[],las=;
for(register int i=;i<=len;++i){
x.a[i]=x.a[i]*y+las;
las=x.a[i]/;
x.a[i]%=;
if(i==len&&las) ++len;
}
return x.a[]=len,x;
}
void print(){
for(int i=a[];i>=;--i) cout<<a[i];
}
};
inline bool chk(BigInt a,BigInt b){
for(int i=;i<=a.a[];++i) if(a.a[i]!=b.a[i]) return ;
return ;
}
inline bool cmp(BigInt a,BigInt b){//x^y y!
if(a.a[]==b.a[]) if(chk(a,b)) return ;
if(a.a[]^b.a[]) return a.a[]<b.a[];
else{
for(register int i=a.a[];i>=;--i){
if(a.a[i]==b.a[i]) continue;
if(a.a[i]>b.a[i]) return ;
else if(a.a[i]<b.a[i]) return ;
}
}
}
void work_1(int x,int y){
if(x>y*0.4) puts("No");
else puts("Yes");
}
int main(){
freopen("yuuutsu.in","r",stdin);
freopen("yuuutsu.out","w",stdout);
int T;
scanf("%d",&T);register int x,y;
while(T--){
scanf("%d%d",&x,&y);
if(x>||y>){work_1(x,y);continue;}
BigInt Fir,Sec;
Fir.a[]=Fir.a[]=;
Sec.a[]=Sec.a[]=;
for(register int i=;i<=y;++i) Fir=Fir*x;
for(register int i=;i<=y;++i) Sec=Sec*i;
//Fir.print();puts("");Sec.print();
if(cmp(Fir,Sec)) puts("Yes");
else puts("No");
}
fclose(stdin);
fclose(stdout);
return ;
}
yuuutsu
T2 august:
先考虑暴力,我们一个一个考虑每个位置,暴力每个位置置为零,当到最后k个时,看一下是否都为零,如果是Yes,否则No。
考虑优化这个过程因为是个区间修改,所以考虑差分,我们维护一个差分数组,发现只有在模k相等的位置才会互相影响,所以维护一个sum数组,含义为模k为i的下标的差分数组之和,这样只要看他是否全为0即可。每次修改只需维护一个桶,每次修改两个位置就好。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+;
int a[N],tong[N];
int main(){
freopen("august.in","r",stdin);
freopen("august.out","w",stdout);
int n,k,q,cnt=;
scanf("%d%d%d",&n,&k,&q);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
for(int i=;i<=n+;++i) tong[i%k]+=(a[i]-a[i-]);
for(int i=;i<k;++i) if(tong[i]) cnt++;
if(cnt) puts("No");
else puts("Yes");
for(int i=;i<=q;++i){
int pos,w;
scanf("%d%d",&pos,&w);
if(tong[pos%k]){
tong[pos%k]+=w;
if(!tong[pos%k]) cnt--;
}
else{
tong[pos%k]+=w;
if(tong[pos%k]) cnt++;
}
++pos,w*=-;
if(tong[pos%k]){
tong[pos%k]+=w;
if(!tong[pos%k]) cnt--;
}
else{
tong[pos%k]+=w;
if(tong[pos%k]) cnt++;
}
if(cnt) puts("No");
else puts("Yes");
}
}
august
T3 sagittarius:
考场上一直想如何去掉非LCA的祖先的贡献,没有想出来,看了题解后发现是非常巧妙的差分处理,即我们设出一个新权值$wt[x]=val[x]-val[fa[x]]$,这样就避免了重复贡献,再用新权值乘以他的子树中所有连续区间即可,发现这个东西暴力统计是布星的,所以我们考虑用线段树合并维护每一个区间(这里所说的区间是子树)从左端点开始的最长连续区间,从右端点开始的最长连续区间和区间内的连续子区间数,则$sn[x]=sn[ls[x]]+sn[rs[x]]+rm[ls[x]]*lm[rs[x]]$,$lm$和$rm$的维护分类讨论即可。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+,M=N*;
#define int long long
int first[N],nex[N<<],to[N<<],tot;
int fa[N],d[N],val[N],rk[N],ans,n,a[N],wt[N];
int root[M],lm[M],rm[M],sn[M],ls[M],rs[M];
void add(int a,int b){
to[++tot]=b,nex[tot]=first[a],first[a]=tot;
}
void update(int p,int l,int r){ int mid=l+r>>;
if(lm[ls[p]]==mid-l+) lm[p]=lm[ls[p]]+lm[rs[p]];
else lm[p]=lm[ls[p]];
if(rm[rs[p]]==r-mid) rm[p]=rm[rs[p]]+rm[ls[p]];
else rm[p]=rm[rs[p]];
sn[p]=sn[ls[p]]+sn[rs[p]]+lm[rs[p]]*rm[ls[p]];
}
int merge(int x,int y,int l,int r){
if(!x||!y) return x|y;
int mid=(l+r)>>;
ls[x]=merge(ls[x],ls[y],l,mid);
rs[x]=merge(rs[x],rs[y],mid+,r);
update(x,l,r);
return x;
}
int cnt=;
void insert(int &x,int l,int r,int pos){
if(!x) x=++cnt;
if(l==r) return lm[x]=,rm[x]=,sn[x]=,void();
int mid=(l+r)>>;
if(pos<=mid) insert(ls[x],l,mid,pos);
else insert(rs[x],mid+,r,pos);
update(x,l,r);
}
void dfs(int x){
insert(root[x],,n,rk[x]);
wt[x]=val[x]-val[fa[x]];
for(int i=first[x];i;i=nex[i]){
int y=to[i];
if(y==fa[x]) continue;
dfs(y);
root[x]=merge(root[x],root[y],,n);
}
ans+=wt[x]*sn[root[x]];
//cout<<"x=="/*<<x<<" ans=="*/<<sn[root[x]]<<endl;
}
signed main(){
freopen("sagittarius.in","r",stdin);
freopen("sagittarius.out","w",stdout);
scanf("%lld",&n);
for(int i=;i<=n;++i) {
scanf("%lld",&fa[i]);
add(fa[i],i);
add(i,fa[i]);
}
//for(int i=1;i<=n;++i) cout<<fa[i]<<" ";cout<<endl;
for(int i=;i<=n;++i) scanf("%lld",&a[i]),rk[a[i]]=i;
//for(int i=1;i<=n;++i) cout<<rk[i]<<" ";cout<<endl;
for(int i=;i<=n;++i) scanf("%lld",&val[i]);
dfs();
printf("%lld\n",ans);
}
sagittarius
CSP-S 模拟测试94题解的更多相关文章
- [CSP-S模拟测试94]题解
A.凉宫春日的忧郁 高精硬上似乎跑不过,其实可以都取个$log$.那么只需要比较$y\times log ^x$和$\sum \limits _{i=1}^y log^i$就好了. #include& ...
- 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的逆元,那么只要先把乘 ...
随机推荐
- scratch少儿编程第一季——02、scratch界面介绍
各位小伙伴大家好: 上期我们简单的介绍了Scratch的一些基本信息,和scratch软件的下载. 今天我们一起来了解一下Scratch的编程界面的介绍. 关于版本我考虑之后还是决定基于Scratch ...
- Scratch—实现一个按钮的动画效果
上次介绍了利用克隆体操作生成菜单按钮,今天讲一讲如何让一个按钮具有动画的效果:当鼠标移到某个按钮上面时,显示动画效果 让菜单按钮有虚像效果 让菜单具有逐渐变大的效果 改变菜单按钮的颜色 其他的特效都是 ...
- APK反编译教程
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- (十一)shiro与ssm整合
所有代码在:here pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h ...
- Android 集成 支付宝支付
调用代码: ALiPayUtil.pay(getActivity(), new ALiPayUtil.PayResponse() { @Override public void success(Pay ...
- c# 163网易发送邮件
是4.0的,说以添加包是 代码: public class SendEmailInfo { /// <summary> /// 发送邮件 /// </summary> /// ...
- 【前端】安装wampserver提示丢失MSVCR100.dll的解决方法
先装Visual C++,再装wampserver 下载的时候请注意选择对应的32bit还是64bit的.然后安装. 再安装wamp
- VBA连接操作符
VBA支持以下连接运算符. 假设变量A=5,变量B=10,则 - 运算符 描述 示例 + 将两个值添加为变量,其值是数字 A + B = 15 & 连接两个值 A & B = 510 ...
- 前端:table、thead、th、tr、td
table:表格:thead:表头:tr:行:td:单元格:th:一行的首个单元格 tbody包含行的内容下载完优先显示,不必等待表格结束.另外,还需要注意一个地方.表格行本来是从上向下显示的.但是, ...
- go语言学习(基本数据类型)
值类型: int/uint :根据系统确定是32还是64位.此外还有int8/uint8.int16/uint16.int32/uint32.int64/uint64 byte:字节型,相当于uint ...