牛客小白月赛12 H(dfs序+线段树),F(分块思想+bit),J(二分)
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(二分)的更多相关文章
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
- 牛客小白月赛12 H 华华和月月种树 (离线dfs序+线段树)
链接:https://ac.nowcoder.com/acm/contest/392/H 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...
- 牛客小白月赛12 H 华华和月月种树
题目链接: 题意:有三个操作 操作 1:表示节点 i 长出了一个新的儿子节点,权值为0,编号为当前最大编号 +1(也可以理解为,当前是第几个操作 1,新节点的编号就是多少). 操作 2:表示华华上线做 ...
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K ...
- 牛客网 牛客小白月赛1 H.写真がとどいています
H.写真がとどいています 链接:https://www.nowcoder.com/acm/contest/85/H来源:牛客网 这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就 ...
- 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘
链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...
- 牛客小白月赛2 H 武 【Dijkstra】
链接:https://www.nowcoder.com/acm/contest/86/H来源:牛客网 题目描述 其次,Sεlιнα(Selina) 要进行体力比武竞赛. 在 Sεlιнα 所在的城市, ...
- 牛客小白月赛4 H 相邻的糖果 思维
链接:https://www.nowcoder.com/acm/contest/134/H来源:牛客网 题目描述 有n个盒子摆成一排,每个盒子内都有ai个糖果. 现在你可以执行以下操作: ·你可以选择 ...
- 牛客小白月赛16 H 小阳的贝壳 (差分+线段树)
链接:https://ac.nowcoder.com/acm/contest/949/H来源:牛客网 题目描述 小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colico ...
随机推荐
- HDU - 1166 - 敌兵布阵 线段树的单点修改,区间求和
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- 网络编程-C/S架构
什么是C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),本章的重点就是教大家写一个C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 计算机基础知识 作为应用 ...
- 第十二届湖南省赛 A - 2016 ( 数学,同余转换)
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 ...
- html总结:float实现span和input输入框同行
例: <input type="text" name="ytdwname" value="<%=user.getYtdwname() %& ...
- 【问题解决方案】之 Word 公式编辑器 使用小tips
输入空格:shift+Ctrl+space 换行:直接回车.之后在上方菜单栏中选择"在等号处对齐"
- Handling duplicate form submission in Spring MVC
javaweb开发之防止表单重复提交 - u012843873的博客 - CSDN博客 https://blog.csdn.net/u012843873/article/details/5526212 ...
- 阿里云CodePipeline vs Jenkins
产品概述_产品简介_CodePipeline-阿里云 https://help.aliyun.com/document_detail/56512.html CodePipeline管理控制台https ...
- js在微信、微博、QQ、Safari唤起App的解决方案
首先看下完整的流程: 简单说下universal link 在iOS9之前,唤起方式和现在安卓是一个的,都是使用scheme进行唤起,这种方式有个小问题,每次唤起,都会给个提示:是否打开xx应用,这样 ...
- React-Native之截图组件view-shot的介绍与使用
React-Native之截图组件view-shot的介绍与使用 一,需求分析 1,需要将分享页生成图片,并分享到微信好友与朋友圈. 二,react-native-view-shot介绍 1,可以截取 ...
- 编写自己的composer项目
编写自己的composer项目 composer的出现给php开发带来极大的便利, 配合phpunit的测试工具, 也可以更好的规范php开发. 尽管这些标准不是官方提供的, 但现在大部分的php ...