H 华华和月月种树

链接:https://ac.nowcoder.com/acm/contest/392/H

思路:先得到整棵树最终的形态,在这棵树上进行三种操作,用dfs跑下,第二种操作就直接对最终形态树上这个点子树区间操作,第一种操作的时候是新加一个点,此时我们将那个点的权值设为0就好了,最后单点查询。。,很简单的数据结构题。

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 4e5+;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
vector<int>g[M];
int sum[M<<],lazy[M<<],a[M],b[M],cnt,head[M],in[M],out[M];
int tot,op[M]; void dfs(int u,int fa){
in[u] = ++tot;
for(int i = ;i < g[u].size();i++){
int v = g[u][i];
if(v != fa)
dfs(v,u);
}
out[u] = tot;
} void pushdown(int l,int r,int rt){
if(lazy[rt]){
mid;
lazy[rt<<] += lazy[rt];
lazy[rt<<|] += lazy[rt];
sum[rt<<] += lazy[rt]*(m-l+);
sum[rt<<|] += lazy[rt]*(r-m);
lazy[rt] = ;
}
} void update(int L,int R,int c,int l,int r,int rt){
if(L <= l&&R >= r){
sum[rt] += (r-l+)*c;
lazy[rt] += c;
return ;
}
pushdown(l,r,rt);
mid;
if(L <= m) update(L,R,c,lson);
if(R > m) update(L,R,c,rson);
} void update1(int p,int c,int l,int r,int rt){
if(l == r){
sum[rt] = ;
return;
}
pushdown(l,r,rt);
mid;
if(p <= m) update1(p,c,lson);
else update1(p,c,rson);
} int query(int p,int l,int r,int rt){
if(l == r){
return sum[rt];
}
pushdown(l,r,rt);
mid;
if(p <= m) return query(p,lson);
else return query(p,rson);
} int main()
{
ios::sync_with_stdio();
cin.tie(); cout.tie();
int n;
cin>>n;
int cnc = ;
for(int i = ;i <= n;i ++){
cin>>op[i]>>a[i]; a[i] ++;
if(op[i] == ){
cnc ++; b[i]= cnc;
g[a[i]].push_back(cnc);
g[cnc].push_back(a[i]);
}
else if(op[i] == ) cin>>b[i];
}
dfs(,);
for(int i = ;i <= n;i ++){
if(op[i] == ){
update(in[a[i]],out[a[i]],b[i],,tot,);
}
else if(op[i] == ){
update1(in[b[i]],,,tot,);
}
else{
cout<<query(in[a[i]],,tot,)<<endl;
}
}
return ;
}

F 华华开始学信息学

链接:https://ac.nowcoder.com/acm/contest/392/F

思路: 分块思维+bit, 和去年沈阳网络赛的J一样的思路,只不过那道是在树上的,这道相当于简化版,我们直接将D大小大于400的用bit暴力更新,小于400的用数组标记下就好了

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 2e5+;
ll c[M],n,vis[M];
vector<ll>v;
void add(ll x,ll v){
while(x <= n){
c[x] += v;
x += (x&-x);
}
} ll getsum(ll x){
ll ret = ;
while(x){
ret += c[x];
x -= (x&-x);
}
return ret;
} int main()
{
ll m,x,op,y;
cin>>n>>m;
for(ll i = ;i <= m;i ++){
cin>>op>>x>>y;
if(op == ){
if(x <= ){
if(!vis[x])
v.push_back(x);
vis[x] += y;
}
else{
for(ll j = x;j <= n;j += x){
add(j,y);
}
}
}
else{
ll ans = ;
for(auto &k: v){
ans += (y/k - (x-)/k)*vis[k];
}
ans += getsum(y) - getsum(x-);
cout<<ans<<endl;
}
}
}

J 月月查华华的手机

链接:https://ac.nowcoder.com/acm/contest/392/J

思路:这道题范围给的很大,肯定不能用n*n的复杂度去写,最多只能 n*(logn), 因为子序列的字母之间是有先后关系的,我们先把母序列处理下,把每个字母的位置存到对应的vector里面,判断子序列时候合格时,我们遍历子序列每个字母,在当前字母对应的vector里二分取大于前一个字母位置的数,如果取不到那么这个子序列就不合格,如果取到了就保存下当前位置,继续遍历

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 1e6+;
vector<int>g[M];
int a[M];
int main()
{
string s,s1;
int n;
ios::sync_with_stdio();
cin.tie(); cout.tie();
cin>>s;
for(int i = ;i < s.size();i ++){
a[i] = s[i]-'a';
g[a[i]].push_back(i+);
}
cin>>n;
for(int i = ;i <= n;i ++){
cin>>s1;
int st = ,flag = ;
for(int j = ;j < s1.size();j ++){
int k = s1[j]-'a';
if(g[k].size()==){
flag = ;break;
}
int kk = upper_bound(g[k].begin(),g[k].end(),st) - g[k].begin();
if(kk >= g[k].size()){
flag = ;break;
}
st = g[k][kk];
}
if(!flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}

牛客小白月赛12 H(dfs序+线段树),F(分块思想+bit),J(二分)的更多相关文章

  1. 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?

    牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...

  2. 牛客小白月赛12 H 华华和月月种树 (离线dfs序+线段树)

    链接:https://ac.nowcoder.com/acm/contest/392/H 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...

  3. 牛客小白月赛12 H 华华和月月种树

    题目链接: 题意:有三个操作 操作 1:表示节点 i 长出了一个新的儿子节点,权值为0,编号为当前最大编号 +1(也可以理解为,当前是第几个操作 1,新节点的编号就是多少). 操作 2:表示华华上线做 ...

  4. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K ...

  5. 牛客网 牛客小白月赛1 H.写真がとどいています

    H.写真がとどいています   链接:https://www.nowcoder.com/acm/contest/85/H来源:牛客网     这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就 ...

  6. 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘

    链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  7. 牛客小白月赛2 H 武 【Dijkstra】

    链接:https://www.nowcoder.com/acm/contest/86/H来源:牛客网 题目描述 其次,Sεlιнα(Selina) 要进行体力比武竞赛. 在 Sεlιнα 所在的城市, ...

  8. 牛客小白月赛4 H 相邻的糖果 思维

    链接:https://www.nowcoder.com/acm/contest/134/H来源:牛客网 题目描述 有n个盒子摆成一排,每个盒子内都有ai个糖果. 现在你可以执行以下操作: ·你可以选择 ...

  9. 牛客小白月赛16 H 小阳的贝壳 (差分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/949/H来源:牛客网 题目描述 小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colico ...

随机推荐

  1. vue报错信息

    1.Property or method "xxx" is not defined on the instance but referenced during render. 原因 ...

  2. threading模块,python下的多线程

    一.GIL全局解释器锁 In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nativ ...

  3. Beta阶段冲刺汇总(团队)

    写在前面 汇总成绩排名链接 1.作业链接 第十一次作业--项目Beta冲刺(团队) 2.评分准则 本次作业包括现场Beta答辩评分(映射总分为100分)+博客分(总分120分)+贡献度得分,其中博客分 ...

  4. windows中在vs code终端使用bash

    vs code Visual Studio Code的缩写,很好用的一个编辑器. 终端 vs code的终端(命令行)在windows中,默认使用的是powershell,如下图所示: powersh ...

  5. 17-vue-cli脚手架安装和webpack-simple模板项目生成

    ue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一.安 ...

  6. JS—ajax及async和defer的区别

    ###1.ajax  “Asynchronous Javascript And XML”(异步 JavaScript 和 XML) 使用: 如不考虑旧版本浏览器兼容性, // 第一步创建xhr对象 v ...

  7. java随笔3 spring 的注入执行逻辑顺序

  8. day 7-2 multiprocessing开启多进程

    一. multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多 ...

  9. hive字符函数

  10. hive数学函数

    round 四舍五入 ceil向上 取整 floor向下取整 hive >  select floor(45.8); ok 45