牛客小白月赛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 ...
随机推荐
- js总结:JavaScript入门
1. JavaScript-输出内容(document.write) 2.在html中引用js文件 3.定义变量 语法:var 变量名 说明: ⑴变量必须使用字母.下划线(_)或者美元符($)开始. ...
- shell脚本--编写CGI代码(shell结合html)以及环境变量
实现shell和html标签混合的方式编写代码: 推荐 初始CGI ,看完大概之后,大概对cgi有个大体的印象.下面是编写混合代码的示例: #!/bin/bash #index.cgi echo & ...
- 牛客OI周赛8-普及组
https://ac.nowcoder.com/acm/contest/543#question A. 代码: #include <bits/stdc++.h> using namespa ...
- laravel get和all区别
get ,all 都可以获取到模型 all 是直接获取所有,get 是在添加了许多约束之后获取模型,get前面如果不加约束条件的话,效果与all等同
- MyEclipse配置tomcat报错 - java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory : Unsupported major.minor version 51.0
1 开发Servlet程序时,MyEclipse配置好tomcat与JDK之后,启动时控制台报下列错误: 1 java.lang.UnsupportedClassVersionError: org/a ...
- 428.x的n次幂
实现 pow(x,n) 不用担心精度,当答案和标准输出差绝对值小于1e-3时都算正确 样例 Pow(2.1, 3) = 9.261 Pow(0, 1) = 0 Pow(1, 0) = 1 挑战 O(l ...
- Python 爬虫 解析库的使用 --- XPath
一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...
- php分割中文字符串为数组的简单例子
近日在做东西时,遇到要把中文字符进行逐字分割,试了很多方法,都不行,后来发现了一个超简单的方法: 分割字符串很简单,主要是用到函数preg_match_all.当处理含有中文的字符串时,可以用如下的方 ...
- python学习笔记(8)--random库的使用
伪随机数:采用梅森旋转算法生成的伪随机序列中元素 使用random库 一.基本随机函数 随机数需要一个种子,依据这个种子通过梅森旋转算法产生固定序列的随机数.seed(a=None) 初始化给定的随 ...
- 在ASP.NET程序中用程序动态向<head>便签里添加<meta>标签
在使用ASP.NET框架开发: 若要在Html网页中加入<meta>设置,但想通过程序动态加入: 1.如果是ASP.NET4.0以前版本: 使用HtmlMeta类加入<meta> ...