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. Python-Requests库详解

    查看一下是否安装requests库 什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关 ...

  2. c语言之字符输入输出和输入验证

    单字符I/O:getchar()和putchar() #include<stdio.h> int main(void) { char ch; while ((ch = getchar()) ...

  3. RabbitMQ防止消息丢失

    转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(3)— 消息的交换 1.简介 RabbitMQ中,消息丢失可以简单的分为 ...

  4. Prometheus & SoundCloud

    Prometheus 系统监控方案 一 - Vovolie - 博客园https://www.cnblogs.com/vovlie/p/Prometheus_CONCEPTS.html Prometh ...

  5. HowTos/Virtualization/VirtualBox - CentOS Wiki

    https://wiki.centos.org/HowTos/Virtualization/VirtualBox

  6. python3 常见的两种文件上传方法

    1.上传页面带input type格式send_keys传值方式上传不能大于60k(具体看开发设置的value)文件大小 fx.find_element_by_id('xx').send_keys(r ...

  7. [转帖]国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测

    国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测 https://www.cnbeta.com/articles/tech/830875.htm 全国产的 SSD 群联貌似是对岸的 不过不管怎么说 ...

  8. 【360图书馆】插入U盘自动攻击:BadUSB原理与实现

    插入U盘自动攻击:BadUSB原理与实现       漏洞背景 “BadUSB”是今年计算机安全领域的热门话题之一,该漏洞由Karsten Nohl和Jakob Lell共同发现,并在今年的Black ...

  9. 创建简单的表单Demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 三星 SCX-4521NS 网络打印机 在XP 下 强行 设置 安装

    添加打印机加上之后,图标是半虚的,状态脱机,网上找了很多方法都不好使. 包括官方的:http://www.samsung.com/cn/support/skp/faq/442292 然后死马当活马医, ...