头一次做图巨的模拟题OWO

自从上一次听图巨讲课然后骗了小礼物以后一直对图巨印象挺好的233

T1:

对于XY取对数=Y*log(x)

对于Y!取对数=log(1*2*3*...*Y)=log1+log2+log3+...+logY

因为数字大小不超过1e5,直接累加最后比较就可以了

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int t,x,y;
double a,b;
int main()
{
freopen("yuuutsu.in","r",stdin);
freopen("yuuutsu.out","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%d%d",&x,&y);
a=y*log(x);
b=;
for(int i=;i<=y;i++){
b+=log(i);
}
if(a<=b)printf("Yes\n");
else printf("No\n");
}
return ;
}

T2:

每一次操作会让区间整体加或减->在差分数组上首位加减

列出目标序列的差分数组,可以进行操作让一个位置的数字移动k步,如果有大小相同的数字撞在一起就会消掉,不同的话可以合并。想起星空这道题,不同的是今天的T2只能走k一种步数且差分值并不只代表一种状态

目标是要让所有的值变成0,又想到一道跳斑马线的题……?考虑把位置对于k取模余数不同的数字分开处理。维护位置对于k取模后余数为下标,记录差分值之和的m数组。用树状数组维护当前的m是否都为0。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e6+;
int n,k,q,a[N],sum[N],m[N];
long long tree[N];
void add(int x,int y){
for(;x<=k;x+=(x&-x))tree[x]+=y;
}
long long ask(int x){
long long num=;
for(;x;x-=(x&-x))num+=tree[x];
return num;
}
int main()
{
freopen("august.in","r",stdin);
freopen("august.out","w",stdout);
scanf("%d%d%d",&n,&k,&q);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
m[i%k]+=a[i]-a[i-];
}
m[(n+)%k]+=-a[n];
for(int i=;i<k;i++){
add(i+,(m[i]!=));
}
if(!ask(k))printf("Yes\n");
else printf("No\n");
for(int i=,x,pos;i<=q;i++){
scanf("%d%d",&pos,&x);
int pos0=pos%k,pos1=(pos+)%k;
int val=(m[pos0]!=),val1=(m[pos1]!=);
m[pos0]=m[pos0]-a[pos]+a[pos-];
m[pos1]=m[pos1]-a[pos+]+a[pos];
a[pos]+=x;
m[pos0]=m[pos0]+a[pos]-a[pos-];
m[pos1]=m[pos1]+a[pos+]-a[pos];
add(pos0+,(m[pos0]!=)-val);
add(pos1+,(m[pos1]!=)-val1);
if(!ask(k))printf("Yes\n");
else printf("No\n");
}
return ;
}

发现自己对于m是否都为0的处理过于麻烦了…这是何种山路十八弯的脑回路才会想到这种处理…

其实是中途思路锅了,保留了树状数组的写法XD其实直接记一个m不为0的数量,每次m变化的时候进行更新就好了

T3:

将问题转化成,对于树上的一个点,会对多少区间产生贡献。

线段树维护子树中存在哪些位置的点,线段树下标是在a数组中的位置。如果这个点可以对一段区间产生贡献,那么这段区间在线段树种一定是连续的1,中间若存在0则代表这段区间中在更高的地方存在点。在线段树上统计答案,记录线段树每个节点从左端点开始最长的一段1的长度lonl,从右端点开始最长的一段1的长度lonr,以及包含的区间个数val。val=左儿子的val+右儿子的val+左儿子lonr*右儿子lonl(端点在两边的区间数量)。这样计算一定不重不漏,有线段树分治的意味。

维护节点x的线段树的时候,对所有儿子进行线段树合并,再把x点insert进去。注意当前节点线段树root的区间个数要减去节点儿子们的区间个数,才能用来累计答案。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=;
int n,tot,cnt;
int ver[N],Next[N],head[N];
int a[N],b[N],pos[N],T[N],L[N*],R[N*],lonl[N*],lonr[N*];
long long ans,sum[N],val[N*];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
void update(int p,int l,int r){
int mid=(l+r)/;
if(lonl[L[p]]==mid-l+)lonl[p]=mid-l++lonl[R[p]];
else lonl[p]=lonl[L[p]];
if(lonr[R[p]]==r-mid)lonr[p]=r-mid+lonr[L[p]];
else lonr[p]=lonr[R[p]];
val[p]=val[L[p]]+val[R[p]]+1ll*lonr[L[p]]*lonl[R[p]];
}
void change(int &p,int p0,int l,int r){
if(!p){
p=p0;
return;
}
int mid=(l+r)/;
if(L[p0])change(L[p],L[p0],l,mid);
if(R[p0])change(R[p],R[p0],mid+,r);
update(p,l,r);
}
void ins(int &p,int l,int r,int pos){
if(!p)p=++cnt;
if(l==r){
lonl[p]=lonr[p]=;
val[p]=;
return;
}
int mid=(l+r)/;
if(pos<=mid)ins(L[p],l,mid,pos);
else ins(R[p],mid+,r,pos);
update(p,l,r);
}
void dfs(int x){
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
dfs(y);
sum[x]+=sum[y];
change(T[x],T[y],,n);
}
ins(T[x],,n,pos[x]);
long long num=val[T[x]];
ans+=(num-sum[x])*b[x];
sum[x]=num;
}
int main()
{
freopen("sagittarius.in","r",stdin);
freopen("sagittarius.out","w",stdout);
scanf("%d",&n);
for(int i=,x;i<=n;i++){
scanf("%d",&x);
add(x,i);
// st[i][0]=x;
}
for(int i=;i<=n;i++)scanf("%d",&a[i]),pos[a[i]]=i;
for(int i=;i<=n;i++)scanf("%d",&b[i]),ans+=b[i];
dfs();
printf("%lld\n",ans);
return ; }

2019.10.30 csp-s模拟测试94 反思总结的更多相关文章

  1. csp-s模拟测试94

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

  2. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  5. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  6. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  7. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  8. 2019/10/17 CSP模拟 总结

    T1 补票 Ticket 没什么好说的,不讲了 T2 删数字 Number 很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂 ...

  9. 2019.8.10 NOIP模拟测试16 反思总结【基本更新完毕忽视咕咕咕】

    一如既往先放代码,我还没开始改… 改完T1滚过来了,先把T1T2的题解写了[颓博客啊] 今天下午就要走了,没想到还有送行的饯别礼,真是欣喜万分[并没有] 早上刚码完前面的总结,带着不怎么有希望的心情开 ...

随机推荐

  1. 如何使用Python-GnuPG和Python3 实现数据的解密和加密

    介绍 GnuPG包提供用于生成和存储加密密钥的完整解决方案.它还允许您加密和签名数据和通信. 在本教程中,您将创建一系列使用Python 3和python-gnupg模块的脚本.这些脚本允许您对多个文 ...

  2. 14.data.js

    dict_data = { "_id":1, name:"王五", age:55, gender:true } db.stu.insert(dict_data) ...

  3. 学习笔记css3

    边框 盒子圆角 border-radius:5px / 20%: border-radius:5px 4px 3px 2px; 左上,右上,右下,左下 盒子阴影 box-shadow:box-shad ...

  4. 在python2中的编码

    在python2中的编码 #_author:star#date:2019/10/29'''字符编码:ASCII:只能存英文和拉丁字符,gb2312:只能6700中文,1980年gbk1.0:存了200 ...

  5. 思维构造,建图——cf1159E

    很好的题 /* nexti:pi右边第一个比pi大的数的下标 把每个[i,a[i]]都看成一段区间,区间只能在端点处交叉,以此来判断是否有解 特别的,如果a[i]=-1,那么把a[i]=i+1,不对其 ...

  6. js实现iframe刷新

    今天要用到iframe的框架刷新,在网上找到了关于这方面内容,整理如下: (1)一般页面的刷新——reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForc ...

  7. Android数据适配器Adapter简介

    1.简介 Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,在常见的View(List View,Grid View)等地方都需要用到Adapter! ...

  8. codeforces 1099E-Nice table

    传送门:QAQQAQ 题意:给你一个矩阵只有AGCT,若对于每一个2*2的子矩阵中的四个字母互不相同,则称为这个矩阵是nice的,问至少变矩阵中的几个点可以使矩阵变nice 思路:没什么思路……就是大 ...

  9. 2019牛客暑假多校赛(第二场) F和H(单调栈)

    F-Partition problem https://ac.nowcoder.com/acm/contest/882/F 题意:输入一个数n,代表总共有2n个人,然后每个人对所有人有个贡献值,然后问 ...

  10. PKU OJ A Bug's life

    http://bailian.openjudge.cn/tm2018/G/ #include <iostream> #include <vector> #include < ...