牛客练习赛 58——树链剖分

A - 牛能和宝石

签到题

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

B - 牛妹和01串

签到题

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

C - 矩阵消除游戏

m,nm,nm,n很小考虑直接枚举
行列都枚举会TLE,考虑优化:如果行确定那么选择列可以贪心。

TLE代码——枚举行列
//lajiTLE代码
#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;
typedef pair<int,int> pii;
const int N=20;
int a[N][N];
int n,m,k;
vector<int> state[N];
int lowbit(int x)
{return x&-x;
}
int calc(int x)
{int res=0;while(x){x-=lowbit(x);res++;}return res;
}
ll solve(int r,int c)
{ll res=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if((r>>i&1)||(c>>j&1)) res+=a[i][j];return res;
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>m>>k;for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j];k=min(k,min(n,m));for(int i=0;i<1<<min(n,m);i++) state[calc(i)].push_back(i);ll res=0;for(int r=0;r<=k;r++){int c=k-r;for(int i=0;i<state[r].size();i++){int nowr=state[r][i];for(int j=0;j<state[c].size();j++){int nowc=state[c][j];res=max(res,solve(nowr,nowc));}}}cout<<res<<'\n';}return 0;}
AC代码——枚举行贪心列
#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;
typedef pair<int,int> pii;
const int N=20;
int a[N][N];
int n,m,k;
vector<int> state[N];
int lowbit(int x)
{return x&-x;
}
int calc(int x)
{int res=0;while(x){x-=lowbit(x);res++;}return res;
}
int b[N];
ll solve(int row,int cnt)
{ll res=0;for(int j=0;j<m;j++){b[j]=0;for(int i=0;i<n;i++){if(row>>i&1) continue;b[j]+=a[i][j];}}sort(b,b+m);reverse(b,b+m);for(int i=0;i<n;i++)if(row>>i&1)for(int j=0;j<m;j++) res+=a[i][j];for(int i=0;i<cnt;i++)res+=b[i];return res;
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>m>>k;for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j];k=min(k,min(n,m));for(int i=0;i<1<<min(n,m);i++) state[calc(i)].push_back(i);ll res=0;for(int r=0;r<=k;r++){int c=k-r;for(int i=0;i<state[r].size();i++){int nowr=state[r][i];res=max(res,solve(nowr,c));}}cout<<res<<'\n';}return 0;}

D - 迷宫

题解好像是dp做的,我dijkstra瞎搞出来了。
分析题目不难知道向上走和向左走没什么用,于是只考虑向右走和向下走

向右走的代价为0(不需要堵路)。
如果能向右走,那么如果在该点向下走那么就要花费1代价(堵路),否则向下走的代价为0。

#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<int,int> pii;
const int N=1010;
int g[N][N];
int n,m;
int dist[N][N];
bool st[N][N];
char s[N][N];
struct node
{int d,x,y;bool operator<(const node& o) const{return d>o.d;}
};
void bfs()
{memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);dist[1][1]=0;priority_queue<node> q;q.push({0,1,1});while(q.size()){int x=q.top().x,y=q.top().y;q.pop();if(st[x][y]) continue;st[x][y]=1;int a,b;int ok1=1,ok2=0;a=x,b=y+1;if(a<1||b<1||a>n||b>m||g[a][b]) ok1=0;else {if(dist[a][b]>dist[x][y]){dist[a][b]=dist[x][y];q.push({dist[a][b],a,b});}}a=x+1,b=y;if(a<1||b<1||a>n||b>m||g[a][b]) ok2=0;else {if(dist[a][b]>dist[x][y]+ok1){dist[a][b]=dist[x][y]+ok1;q.push({dist[a][b],a,b});}}}
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++) cin>>s[i]+1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)g[i][j]=s[i][j]-'0';bfs();if(dist[n][m]==0x3f3f3f3f) cout<<-1<<'\n';else cout<<dist[n][m]<<'\n';}return 0;}

E - 最大GCD

首先暴力把每个aia_iai的约数搞出来,用一个vector存储一下,d[i]d[i]d[i]表示存在约数是iiiaia_iai所在的位置下标。询问同样先把所有约数搞出来,然后逆序去vector<int> d[]二分查找看看是否在所给区间内即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m;
vector<int> d[N];
int main()
{//IO;int T=1;//cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++){int a;cin>>a;for(int j=1;j<=a/j;j++){if(a%j) continue;d[j].push_back(i);if(j!=a/j) d[a/j].push_back(i);}}while(m--){int l,r,x;cin>>l>>r>>x;vector<int> dx;for(int i=1;i<=x/i;i++){if(x%i) continue;dx.push_back(i);if(i!=x/i) dx.push_back(x/i);}sort(dx.begin(),dx.end());reverse(dx.begin(),dx.end());for(auto t:dx){if(!d[t].size()) continue;int lnow=lower_bound(d[t].begin(),d[t].end(),l)-d[t].begin();if(lnow>=d[t].size()) continue;if(d[t][lnow]<=r) {cout<<t<<'\n';break;}}}}return 0;}

F - XOR TREE

分析一下不难发现每个点对答案的贡献有以下规律:

  • 如果路径点数是奇数个点,那么等效于所有偶数次序的点被记录一次
  • 如果路径点数是偶数个点,那么所有点都被计入一次

①路径点数可以根据求树上路径距离间接求得
②对于一条路径上的奇偶点,可以根据端点的奇偶性+深度的奇偶性来确定。

因此树剖后根据dfs序建立两棵线段树分别维护深度是奇数和深度是偶数点的区间异或值。
查询和修改的时候只需要分类讨论以下即可。

#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=200010;
//***************************************************************
int read()
{int x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();return x;
}
//***************************************************************
int n,q;
int w[N],a[N],b[N];
int h[N],e[2*N],ne[2*N],idx;
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int fa[N],dep[N],sz[N],son[N];
void dfs1(int u,int p)
{sz[u]=1;    fa[u]=p,dep[u]=dep[p]+1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==p) continue;dfs1(j,u);sz[u]+=sz[j];if(sz[j]>sz[son[u]])son[u]=j;}
}
int timestamp,dfn[N],top[N];
void dfs2(int u,int t)
{dfn[u]=++timestamp;top[u]=t;if(!son[u]) return;dfs2(son[u],t);for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa[u]||j==son[u]) continue;dfs2(j,j);}
}
int lca(int u,int v)
{while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]]) swap(u,v);u=fa[top[u]];}return dep[u]<dep[v]?u:v;
}
int dist(int u,int v)
{return dep[u]+dep[v]-2*dep[lca(u,v)];
}
struct node1
{struct node2{int l,r;int val;}tree[N<<2];void pushup(int u){tree[u].val=tree[u<<1].val^tree[u<<1|1].val;}void build(int u,int l,int r,int w[]){tree[u]={l,r};if(l==r) {tree[u].val=w[l];return;}int mid=l+r>>1;build(u<<1,l,mid,w),build(u<<1|1,mid+1,r,w);pushup(u);}void modify(int u,int pos,int val){if(tree[u].l==tree[u].r){tree[u].val=val;return;}int mid=tree[u].l+tree[u].r>>1;if(pos<=mid) modify(u<<1,pos,val);else modify(u<<1|1,pos,val);pushup(u);}int query(int u,int l,int r){if(tree[u].l>=l&&tree[u].r<=r) return tree[u].val;int v=0;int mid=tree[u].l+tree[u].r>>1;if(l<=mid) v^=query(u<<1,l,r);if(r>mid) v^=query(u<<1|1,l,r);return v;}int cquery(int u,int v){int val=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]]) swap(u,v);val^=query(1,dfn[top[u]],dfn[u]);u=fa[top[u]];}if(dep[u]>dep[v]) swap(u,v);val^=query(1,dfn[u],dfn[v]);return val;}
}A,B;
int main()
{//IO;int T=1;//cin>>T;while(T--){n=read(),q=read();memset(h,-1,sizeof h);for(int i=1;i<=n;i++) w[i]=read();for(int i=1;i<n;i++){int u,v;u=read(),v=read();add(u,v),add(v,u);}dfs1(1,0);dfs2(1,1);for(int i=1;i<=n;i++){if(dep[i]&1) a[dfn[i]]=w[i];else b[dfn[i]]=w[i];}A.build(1,1,n,a);B.build(1,1,n,b);while(q--){int op,x,y;op=read(),x=read(),y=read();if(op==1){if(dep[x]&1) A.modify(1,dfn[x],y);else B.modify(1,dfn[x],y);}else{int d=dist(x,y);int res=0;if(d&1){res=A.cquery(x,y)^B.cquery(x,y);}else{if(dep[x]&1) res=B.cquery(x,y);else res=A.cquery(x,y);}cout<<res<<'\n';}}}return 0;}

要加油哦~

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

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

相关文章

确认过眼神,你是ApacheWay的人 | COSCon‘18 特辑

*大会官网&#xff1a;http://coscon.kaiyuanshe.cn/*报名链接&#xff1a;点击文末“阅读原文”如果您对 Apache 感兴趣那么中国开源年会COSCon18将是您不可错过的一站写在大会前为什么本土开源项目对 Apache 青睐相加我们用实际数据说话Apache 顶级项目Apache CarbonData Car…

P6793-[SNOI2020]字符串【广义SAM,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P6793 题目大意 给出两个长度为nnn的字符串&#xff0c;取出他们所有长度为kkk的连续子串分别构成两个可重集合A,BA,BA,B。 你每次可以花费xxx点代价修改AAA中一个字符串长度为xxx的后缀&#xff0c;求至少花费多少代价能够…

【DP】Bovine Genetics G(P7152)

正题 P7152 题目大意 对于一个原串&#xff08;只有四种字符&#xff09;&#xff0c;先将所有相邻且相同的字符分割开&#xff0c;对分割得到的若干段翻转&#xff0c;得到编辑后的字符串&#xff0c;现在给出编辑后的字符串&#xff08;有一些位置不确定&#xff09;&#…

牛客练习赛 57——manacher算法 树形dp?

A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N5; char g[N][N]; int main() {//IO;int …

1148 Werewolf - Simple Version 甲级

题意&#xff1a; 有n个玩家&#xff0c;有两个狼人&#xff0c;有两人说慌&#xff08;其中一个为狼人一个为非狼人&#xff09;&#xff0c;找出狼人是谁&#xff1f; 题解&#xff1a; 暴力枚举 先枚举i和j为狼人&#xff0c;然后从1号开始假设其说谎&#xff0c;然后判断…

asp.net core 错误定位 vs2017 远程调试部署在centos上的asp.net core程序

前言程序运行中会出现各种BUG。 排除BUG有三种方式。一、访问页面直接报错误信息出于安全&#xff0c;服务器是关闭这个功能的。在centos上可以用 命令设置环境变量来解决&#xff1a; export ASPNETCORE_ENVIRONMENTDevelopment二、console输出console.WriteLine(" hel…

P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】

正题 题目链接:https://www.luogu.com.cn/problem/P4585 题目大意 nnn个集合&#xff0c;开始每个集合中有一个数字。 开启新的一天并且往集合sss中插入数字vvv询问ddd天以内插入的数字&#xff08;包括最开始的&#xff09;中l∼rl\sim rl∼r集合内的数字异或上xxx的最大值。…

【图论】Tree之最小方差树(bzoj 3754)

正题 bzoj 3754 题目大意 求最小方差生成树 解题思路 可以枚举数值之和&#xff0c;然后跑最小生成树 每次加25&#xff0c;这样可以提高速度&#xff0c;且如果平均数接近&#xff0c;那么所选的边和答案会相同&#xff0c;再暴力跑一遍即可 code #include<cmath> …

1147 Heaps

题意&#xff1a; 给一个二叉树的层次遍历&#xff0c;问是什么类型的堆&#xff0c;是大顶堆还是小顶堆&#xff0c;然后输出这个树的后续遍历 题解&#xff1a; 大小堆根直接比较a[i]与a[i/2]即可 因为给的树的层次遍历&#xff0c;i就是i/2儿子 后序遍历&#xff0c;对于…

AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控界面

在日常系统工作中&#xff0c;我们为了洞察系统的问题和运作情况通常会记录日志的方式来进行分析&#xff0c;但是在很多情况下都是被动的在出问题后才会去查日志。在很多时候&#xff0c;我们可能更需要相对实时的了解整个系统或者某一时段的运行的情况&#xff0c;诸如系统出…

ACL Beginner Contest 总结——F多项式待补

A - Repeat ACL 签到题1 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; typed…

P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为nnn的串TTT&#xff0c;用0∼90\sim 90∼9填充所有的...。 然后给出mmm个串和它们的价值。 一个填充方案的价值等于&#xff1a;若TTT中出现了ccc个给出的串&#xff0c;那价值等于它们的价值乘积…

微软向Linux表白: 向Linux社区开放60000多项专利

10 月 10 日&#xff0c;微软在博客中宣布正式加入开放创新网络&#xff08;Open Invention Network, 简称“OIN”&#xff09;&#xff0c;向所有开源专利联盟的成员开放其专利组合。对开源&#xff0c;微软是认真的OIN 的首席执行官 Keith Bergelt 在采访中说道&#xff1a;微…

【线段树】扇形面积并(P3997)

正题 P3997 题目大意 给若干扇形&#xff0c;问你叠了至少k次的面积 解题思路 把园展开&#xff0c;然后用线段树维护每个点的出现次数 当最大次数大于k&#xff0c;用log的时间查找该点&#xff0c;然后计算结果&#xff0c;因为最多只有2*n次查找&#xff0c;所以不会TLE…

Codeforces Round #675 (Div. 2)——F主席树待补?

A - Fence 把凑得那条边当成最长的边&#xff0c;如果abcd那么将会共线&#xff0c;只要稍微abc大一点即可满足四边形。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath…

牛客网dp专题 数位dp

文章目录数位dp例题&#xff1a;NC116652 uva11038 How many 0sNC15035 送分了QAQNC20669 诡异数字NC20665 7的意志NC17385 Beautiful NumbersCF55D NC108918 Beautiful numbers习题&#xff1a;NC17867 明七暗七NC19327 好朋友NC19945 [CQOI2016]手机号码NC20268 [SCOI2009]WI…

YbtOJ#463-序列划分【二分答案,线段树,dp】

正题 题目链接:https://www.ybtoj.com.cn/problem/463 题目大意 给出长度为nnn的序列A,BA,BA,B。要求划分成若干段满足 对于任何i<ji<ji<j&#xff0c;若iii和jjj不是同一段的&#xff0c;要求满足Bi>AjB_i>A_jBi​>Aj​每一段AiA_iAi​的最大值的和不能超…

微软技术大会预览:DevOps顾问是怎样开发自己的产品的

“没有人比我们更懂DevOps”&#xff0c;这句话不是谁都敢说的。从无人问津到整个IT行业趋之若鹜&#xff0c;DevOps火起来也不过是3年的事情&#xff0c;但是leansoftX.com的DevOps资深顾问都是在这个行业已经摸爬滚打了10年的老兵了&#xff0c;从一开始的SDLC&#xff0c;到…

【双指针】Square Pasture G(P7153)

正题 P7153 题目大意 给你平面上的若干点&#xff0c;让你画一个正方形&#xff0c;问框住的点有多少种组合 解题思路 先枚举正方形左右两边的点&#xff0c;然后用双指针计算正方形移动过程中1框住的点 然后把所有点x,y坐标取反&#xff0c;再做一次&#xff0c;这样可以把…

Neat Tree

Neat Tree 题意&#xff1a; n个数&#xff0c;每个区间的贡献为区间内最大值减最小值&#xff0c;问这个n个数的总贡献是多少&#xff1f;也就是n所能组成的所有区间的贡献值之和 题解&#xff1a; 我们可以用单调栈来做 第i个数对答案的贡献值为h[i] * 作为最大值出现的次…