牛客练习赛 67——ST表

A.牛牛爱字符串

注意原字符串有空格,不要用cin

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{IO;int T=1;//cin>>T;while(T--){string s;while(getline(cin,s)){vector<string> ans;int n=s.size();for(int i=0;i<n;i++){if(s[i]<'0'||s[i]>'9') continue;string now="";while(i<n&&s[i]>='0'&&s[i]<='9'){now+=s[i];i++;}reverse(now.begin(),now.end());while(now.size()>1&&now.back()=='0') now.pop_back();reverse(now.begin(),now.end());ans.push_back(now);}      for(auto t:ans) cout<<t<<' ';cout<<'\n';}}return 0;
}

B.牛牛爱位运算

&只会越运算越小,直接选择最大的数即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int a[N],n;
int main()
{IO;int T=1;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);cout<<a[n]<<'\n';}return 0;
}

C.牛牛爱博弈

打表找规律,懂得都懂
最终只要nnn不是333的倍数先手必胜

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_set>
using namespace std;
const int N=110;
int sg[N];
// int dfs(int u)
// {
//     if(sg[u]!=-1) return sg[u];
//     unordered_set<int> mp;
//     for(int i=0;(1<<i)<=u;i++) mp.insert(dfs(u-(1<<i)));//     for(int i=0;;i++)
//         if(!mp.count(i)) return sg[u]=i;
// }
int main()
{IO;int T=1;cin>>T;memset(sg,-1,sizeof sg);while(T--){cin>>n;if(n%3) cout<<"Alan\n";else cout<<"Frame\n";}// for(int i=0;i<=100;i++)// {//     cout<<i<<' ';//     if(dfs(i)) cout<<"Alan\n";//     else cout<<"Frame\n";// }return 0;
}

D. 牛妹爱数列

f[i][0/1]f[i][0/1]f[i][0/1]表示:考虑前iii个序列,把他们全变成0/10/10/1的最小翻转次数
转移:考虑最后一步是单点修改还是前缀修改。
如果是单点修改f[i][1]=min(f[i][1],f[i−1][1]+1−a[i]),f[i][0]=min(f[i][0],f[i−1][0]+a[i])f[i][1]=min(f[i][1],f[i-1][1]+1-a[i]),f[i][0]=min(f[i][0],f[i-1][0]+a[i])f[i][1]=min(f[i][1],f[i1][1]+1a[i]),f[i][0]=min(f[i][0],f[i1][0]+a[i])
如果是前缀修改f[i][1]=min(f[i][1],f[i−1][0]+a[i]+1),f[i][0]=min(f[i][0],f[i−1][1]+1−a[i]+1)f[i][1]=min(f[i][1],f[i-1][0]+a[i]+1),f[i][0]=min(f[i][0],f[i-1][1]+1-a[i]+1)f[i][1]=min(f[i][1],f[i1][0]+a[i]+1),f[i][0]=min(f[i][0],f[i1][1]+1a[i]+1)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int f[N][2];
int a[N],n;
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];memset(f,0x3f,sizeof f);f[0][0]=f[0][1]=0;for(int i=1;i<=n;i++){f[i][0]=min(f[i-1][0]+a[i],f[i-1][1]+1-a[i]+1);f[i][1]=min(f[i-1][0]+1-a[i]+1,f[i-1][1]+1-a[i]);}cout<<f[n][0]<<'\n';}return 0;
}

E.牛妹游历城市

暴力建图边数达到恐怖的n2n^2n2不光空间开不下,而且时间跑不过,不可取。
考虑优化建图:建立323232个虚拟源点(编号n+1…n+32)n+1 \dots n+32)n+1n+32)如果一个点iiiaia_iai的二进制表示中第j(0≤j≤31)j(0\leq j\leq 31)j(0j31)位是1,那么连一条边i−>n+j+1i->n+j+1i>n+j+1权值是1<<j1<<j1<<j的边,并且连一条n+j+1−>in+j+1->in+j+1>i权值是000的边。然后不难发现原图中的所有边都可以转化成新图的边,同样新图的所有边都能转化成原图的边。 但是并不影响求最短路比如权值是101011101010的两个点,我们会建立边权是10、1000、100000这些路径,但是发现这些相当于重边,不会影响答案。
博主的图非常清楚直接秒懂

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
const int N=111010,M=1000010;
const ll INF=0x3f3f3f3f3f3f3f3f;
int h[N],e[M],ne[M],idx;
ll w[M],a[N];
ll dist[N];
bool st[N];
int n;
void add(int a,int b,ll c)
{e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
void dijkstra()
{memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);dist[1]=0;priority_queue<pli,vector<pli>,greater<pli>> q;q.push({0,1});while(q.size()){int t=q.top().second;q.pop();if(st[t]) continue;st[t]=1;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]){dist[j]=dist[t]+w[i];q.push({dist[j],j});}}}
}
int main()
{IO;int T=1;cin>>T;while(T--){cin>>n;memset(h,-1,sizeof h);idx=0;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++)for(int j=0;j<32;j++)if(a[i]>>j&1){add(i,j+n+1,1ll<<j);add(j+n+1,i,0ll);}dijkstra();if(dist[n]==INF) cout<<"Impossible\n";else cout<<dist[n]<<'\n';}return 0;
}

学习ST表,F明天补了

F.牛妹的苹果树

方法一:线段树(动态)+欧拉序ST表求lca
首先有一个引理:树的直径具有可合并的性质,同一棵树上两个区间的直径的两个端点分别为 (a,b)(a,b)(a,b)(c,d)(c,d)(c,d),那么合并两个区间后的新的直径的端点一定在a,b,c,d{a,b,c,d}a,b,c,d中,通过枚举端点计算它们的距离(6种情况),取最大值可以得到两个区间合并的直径。 其正确性证明和两遍dfs求树的直径的证明过程类似。
由此我们考虑线段树维护区间直径即可。求lca最好用欧拉序+ST表的,这个我不会可以借鉴大佬写法线段树+ST表求lca
方法二:ST表维护直径(静态)+ST表求lca
由于本题为区间静态问题,并且直径有区间可重复计算的性质,考虑用ST表维护直径ST表维护直径

// O(nlogn)
#include<iostream>
#include<algorithm>
#include<cstring>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=300010,M=2*N;
int h[N],e[M],ne[M],idx;
ll w[M];
ll dist[N];
int dfn[N],eular[M],ST[M][20],cnt;
int lg[M];
pii f[N][20];
int n,q;
void add(int a,int b,ll c)
{e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}void dfs(int u,int fa)
{dfn[u]=++cnt;ST[cnt][0]=u;f[u][0]={u,u};for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;dist[j]=dist[u]+w[i];dfs(j,u);ST[++cnt][0]=u;}
}
int lca(int a,int b)
{a=dfn[a],b=dfn[b];if(a>b) swap(a,b);int len=lg[b-a+1];return dist[ST[a][len]]<dist[ST[b-(1<<len)+1][len]]?ST[a][len]:ST[b-(1<<len)+1][len];
}
ll calc(int a,int b)
{int pab=lca(a,b);return dist[a]+dist[b]-2*dist[pab];
}
void pre()
{for(int i=2;i<=cnt;i++) lg[i]=lg[i>>1]+1;for(int j=1;j<=lg[cnt];j++)for(int i=1;i+(1<<j)-1<=cnt;i++)ST[i][j]=dist[ST[i][j-1]]<dist[ST[i+(1<<j-1)][j-1]]?ST[i][j-1]:ST[i+(1<<j-1)][j-1];for(int j=1;j<=lg[n];j++)for(int i=1;i+(1<<j)-1<=n;i++){pii a=f[i][j-1],b=f[i+(1<<j-1)][j-1];f[i][j]={a.x,a.y};if(calc(a.x,b.x)>calc(f[i][j].x,f[i][j].y)) f[i][j]={a.x,b.x};if(calc(a.x,b.y)>calc(f[i][j].x,f[i][j].y)) f[i][j]={a.x,b.y};if(calc(a.y,b.x)>calc(f[i][j].x,f[i][j].y)) f[i][j]={a.y,b.x};if(calc(a.y,b.y)>calc(f[i][j].x,f[i][j].y)) f[i][j]={a.y,b.y};if(calc(b.x,b.y)>calc(f[i][j].x,f[i][j].y)) f[i][j]={b.x,b.y};}
}
ll query(int l,int r)
{int len=lg[r-l+1];pii a=f[l][len],b=f[r-(1<<len)+1][len];ll res=calc(a.x,a.y);res=max(res,calc(a.x,b.x));res=max(res,calc(a.x,b.y));res=max(res,calc(a.y,b.x));res=max(res,calc(a.y,b.y));res=max(res,calc(b.x,b.y));return res;
}
int main()
{memset(h,-1,sizeof h);cin>>n>>q;for(int i=1;i<n;i++){int a,b;ll c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}dfs(1,0);pre();while(q--){int l,r;cin>>l>>r;cout<<query(l,r)<<'\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】8月3日题目精讲—小A的最短路

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 3秒&#xff0c;其他语言6秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 小A这次来到一个景区去旅游&#xf…

Stack(nowcoder 11253-K)

正题 nowcoder 11253-K 题目大意 有n个数&#xff0c;依次加进栈中&#xff0c;每次加入前将栈顶比aia_iai​大的所有元素弹掉&#xff0c;加入后记bib_ibi​为栈的大小 现在给你b中的一些数&#xff0c;让你求a数组的一种合法方案&#xff0c;其中1~n在a中各出现了一次 解题…

P4424-[HNOI/AHOI2018]寻宝游戏【结论】

正题 题目链接:https://www.luogu.com.cn/problem/P4424 题目大意 nnn个mmm位二进制数&#xff0c;开始是一个000。 然后依次对所有二进制数进行nnn次andandand或者ororor操作。 qqq次询问给出二进制数rir_iri​&#xff0c;要求有多少种操作序列使得操作完后的数是rir_iri​…

ASP.NET Core中使用表达式树创建URL

当我们在ASP.NET Core中生成一个action的url会这样写&#xff1a;var url_urlHelper.Action("Index", "Home");这样的写法存在的问题在于我们传递了两个字符串类型的参数&#xff0c;而我们又无法避免对action和controller做重命名操作, 例如将index重命名…

牛客练习赛 66

A.平方数 讨论一下最接近它的两个平方数即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<cmath> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int main(…

在你的andorid设备上运行netcore (Linux Deploy)

最近注意到.net core 的新版本已经开始支持ARM 平台的CPU, 特意去Linux Deploy 中尝试了一下&#xff0c;真的可以运行 Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.9.65-perf armv8l)* Documentation: https://help.ubuntu.com/Ubuntu 16.04 LTS [running via Linux Deploy]La…

【每日一题】8月6日题目精讲—追债之旅

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 65536K&#xff0c;其他语言131072K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 小明现在要追讨一笔债务&#xff0c…

【结论】只不过是长的领带(luogu 6877)

正题 luogu 6877 题目大意 给你n1个数aia_iai​和n个数bib_ibi​&#xff0c;cic_ici​为不选aia_iai​时&#xff0c;重新调整剩下n个数的位置后&#xff0c;∑i1nmax(ai−aj)\sum \limits_{i1}^{n}max(a_i-a_j)i1∑n​max(ai​−aj​)的最小值,求c数组 解题思路 不难发现让…

P3273-[SCOI2011]棘手的操作【线段树,并查集】

正题 题目链接:https://www.luogu.com.cn/problem/P3273 题目大意 nnn个点有权值&#xff0c;要求支持操作 连接两个点单点加权联通块加权全图加权单点询问联通块询问最大值全图询问最大值 解题思路 把所有可能产生的联通块都变到一个区间里就好了 考虑怎么排这个东西&…

牛客练习赛 65 (待补E-网络流)

A.最值序列 排序后&#xff0c;前一半加后一半乘即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N500010; cons…

持续集成配置之Nuget

Intro本文是基于微软的 VSTS(Visual Studio Team Service) 做实现公众类库的自动打包及发布。之前自己的项目有通过 Github 上的 Travis 和 Appveyor&#xff0c;这次主要是用 VSTS 来做的&#xff0c;对比 appveyor 和 vsts 上的持续集成&#xff0c;vsts 上微软把常用的工具和…

【每日一题】8月7日题目精讲—双栈排序

来源&#xff1a;牛客网 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 Tom最近在研究一个有趣的排序问…

【期望DP】概率充电器(luogu 4284)

正题 luogu 4284 题目大意 给你棵树&#xff0c;第i个点自己通电的概率是wiw_iwi​&#xff0c;第j条边连接的两个点之间通电的概率是pjp_jpj​&#xff0c;问你通电的点个数的期望值 题目大意 设fif_ifi​为第i个点通电的概率&#xff0c;那么&#xff1a; fisolvej∈link{…

P3760-[TJOI2017]异或和【树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P3760 题目大意 给出nnn个数字的一个序列aaa&#xff0c;求它所有区间和的异或和 n≤105,∑ai≤106n\leq 10^5,\sum a_i\leq 10^6n≤105,∑ai​≤106 解题思路 开始写了个前缀和FFTFFTFFT发现要卡常然后就换了个方法。 每一…

手把手教你搭APM之Skywalking搭建指南(支持Java/C#/Node.js)

前言什么是APM?全称:Application Performance Management可以参考这里:现代APM体系&#xff0c;基本都是参考Google的Dapper&#xff08;大规模分布式系统的跟踪系统&#xff09;的体系来做的。通过跟踪请求的处理过程&#xff0c;来对应用系统在前后端处理、服务端调用的性能…

牛客练习赛 64——错排

A.怪盗-1412 111…1⏟⌊n2⌋444…4⏟m111…1⏟⌈n2⌉222…2⏟k\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lfloor \frac{n}{2} \rfloor \end {matrix}\begin{matrix} \underbrace{ 444\dots\ 4} \\ m \end{matrix}\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lceil \fra…

牛客网状压dp

状压dp 视频链接 &#xff08;如果想购买网课&#xff0c;可以用我的邀请码&#xff09; 用我的链接购买&#xff0c;我再反你10&#xff0c;一共花54多值 购买链接 不放心可以先加我好友2830872914 总试题链接 文章目录状压dp预备知识——位运算例题&#xff1a;引入&#x…

【线段树】海报(loj 3264)

正题 loj 3264 题目大意 有一个环&#xff0c;环上n个点&#xff0c;权值为a&#xff0c;有m次修改&#xff0c;每次修改一个aia_iai​&#xff0c;然后让你选取一些数&#xff0c;使环上不存在连续四个以上的数被选取&#xff0c;让你求所选数的最大权值和 解题思路 不难想…

P4338-[ZJOI2018]历史【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/P4338 题目大意 给出nnn个点的一棵树&#xff0c;和每个点进行accessaccessaccess的次数aia_iai​&#xff0c;要求安排一个顺序使得虚实边转换最多。 mmm次修改一个点让aia_iai​加上www后求答案 n,m∈[1,4∗105],ai,w∈[1,…

小G有一个大树

来源&#xff1a;牛客网 &#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小G想要把自己家院子里的橘子树搬到家门口&#xff08;QAQ。。就当小G是大力水手吧&…