四连测Day1
题目:链接: https://pan.baidu.com/s/163ycV64ioy7uML7AvRDTGw 密码: p86i
T1:
倍增求LCA,minn数组记录最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline long long read()
{
long long f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return ans*f;
}
long long q,a[],fa[][],minn[][];
struct node{
long long x;long long y;
long long nex;
}ss[];
long long head[];
long long cnt=;
void add(long long a,long long b)
{
ss[cnt].x=a,ss[cnt].y=b;
ss[cnt].nex=head[a],head[a]=cnt++;
return;
}
long long deep[];
void dfs(long long f,long long fath)
{
deep[f]=deep[fath]+;
minn[f][]=min(a[f],a[fath]);
fa[f][]=fath;
for(long long i=;(<<i)<=deep[f];i++) fa[f][i]=fa[fa[f][i-]][i-],minn[f][i]=min(minn[f][i-],minn[fa[f][i-]][i-]);
for(long long i=head[f];i!=-;i=ss[i].nex)
if(ss[i].y!=fath) dfs(ss[i].y,f);
}
long long n,m,s;
long long lca(long long u,long long v)
{
long long sry=min(a[u],a[v]);
// cout<<sry<<endl;
if(deep[u]<deep[v]) swap(u,v);
for(long long i=;i>=;i--)
if(deep[u]-(<<i)>=deep[v]) sry=min(sry,minn[u][i]),u=fa[u][i];
// cout<<sry<<" "<<u<<" "<<v<<endl;
if(u==v) return sry;
for(long long i=;i>=;i--)
{
if(fa[u][i]==fa[v][i]) continue;
else
{
sry=min(sry,minn[u][i]),sry=min(sry,minn[v][i]);
u=fa[u][i],v=fa[v][i];
}
}
// cout<<fa[u][0]<<endl;
return min(sry,a[fa[u][]]);
}
int main()
{
memset(head,-,sizeof(head));
n=read(),q=read();
for(long long i=;i<=n;i++) a[i]=read();
for(long long i=;i<n;i++)
{
long long u=read(),v=read();
add(u,v),add(v,u);
}
dfs(,);
for(long long i=;i<=q;i++)
{
long long u=read(),v=read();
printf("%d\n",lca(u,v));
// return 0;
}
}/*
5 5
8 100 502 9 3
2 4
4 1
1 3
1 5
3 5
1 5
2 3
2 1
3 4
*/
T2:
桶排序,因为告诉你a[i]最大为1048575,异或和为a[i]^a[i+1]^……a[j],拿sort会超时
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read()
{
int f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
int a[],x[];
int n,s[];
int main()
{
n=read();int q=read();
for(int i=;i<=n;i++) s[i]=read();
for(int i=;i<=n;i++)
{
int sum=;
for(int j=i;j<=n;j++) sum^=s[j],a[sum]++;
}
int cnt=;
for(int i=;i<=;i++)
while(a[i]!=) x[++cnt]=i,a[i]--;
for(int i=;i<=q;i++)
{
int xx=read();
printf("%d\n",x[xx]);
}
}
T3:
先将每一个点想成一个区间,r[i]表示i的祖先节点所在区间的最右号,l同理,f为祖先,j=r[find(j)]+1表示因为j号节点的区间右侧为r[find(j)],所以可得。
将边权从小到大排序,区间覆盖即可
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read()
{
int f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
int n,m;
int f[],r[],l[];
int find(int x)
{
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
struct node{
int ll,rr,v;
}x[];
bool cmp(node xx,node yy)
{
return xx.v<yy.v;
}
int ans,sum;
void merge(int x1,int x2)
{
int t1=find(x1),t2=find(x2);
f[t2]=t1;
l[t1]=min(l[t1],l[t2]);
r[t1]=max(r[t1],r[t2]);
}
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++) f[i]=l[i]=r[i]=i;
for(int i=;i<=m;i++) x[i].ll=read(),x[i].rr=read(),x[i].v=read();
sort(x+,x+m+,cmp);
for(int i=;i<=m;i++)
{
int j=r[find(x[i].ll)]+;
while(j<=x[i].rr)
{
ans++;
sum+=x[i].v;
merge(x[i].ll,j);
j=r[find(j)]+;
}
if(ans==n-)
{
printf("%d\n",sum);
return ;
}
}
cout<<-;
}
/*
5 4
1 2 1
3 4 2
3 5 3
1 4 1
*/
四连测Day1的更多相关文章
- 四连测Day4
四连爆炸 卡我常数 好像被AluminumGod拉到了创客...哇我这个天天爆炸的水平可能会被其他三位dalao吊起来打 orz Edmond-Karp_XiongGod orz Deidara_Wa ...
- 【2018.8.10】四连测day4 题解
T1:给出一棵 $n$ 个节点的无根树,其中 $m$ 个节点是特殊节点,求对于任意 $i ∈ [0, m]$,包含 $i$ 个特殊节点的联通块个数$\mod 998244353$. $1<=n, ...
- ZROI 提高十连测 Day1
第一天的提高模拟测 考前特意睡了20min 还是歇菜了,果然自己菜是真实的. 题目质量海星 但是我都不会这是真的...题目由于是花钱买的这里就不放了 LINK:problem 熟悉我的人应该都知道账号 ...
- 四连测总结(XYX)
目录 成绩 总结 事后... 成绩 telephonewire monkey 总分 0 56 56 cowjog guard path temperature 总分 0 40 0 68 108 cba ...
- 十连测Day1 题解
A. 奥义商店 有一个商店,n个物品,每个物品有一个价格和一种颜色. 有m个操作,操作有两种,一种是修改一个位置的价格,另一种是购买,每次购买指定一个公差d和一个位置k,找到包含这个位置k公差为d的同 ...
- 四连测Day3
题目链接:https://pan.baidu.com/s/1_vsHfMI_qO-9IDxmFLkHfg 密码: uza8 T1: 小奥的一笔画,判连通性,查奇偶点即可 #include<ios ...
- 四连测Day2
题目:链接: https://pan.baidu.com/s/1ef_9hGBhczW0B4dz5IUKmw 密码: qgjy T1: hash后直接二分查询即可 #include<iostre ...
- 正睿OI提高组十连测 day1 总结
可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...
- (四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)的博客
滑雪场的高度差 时间限制: 1 Sec 内存限制: 128 MB 题目描述 滑雪场可以看成M x N的网格状山地(1 <= M,N <= 500),每个网格是一个近似的平面,具有水平高度 ...
随机推荐
- 使用advanced_installer将.net web程序打包为安装程序
当项目开发完成之后,需要给客户使用时,总不能将发布后的文件全部放一起压缩后直接给客户吧,然后客户需要自行搭建环境修改配置等等,体验太差了,这时候我们就需要使用一种打包工具了,查了一些资料之后,我选择使 ...
- Linux命令应用大词典-第26章 模块和内核管理
26.1 lsmod:显示内核中模块的状态 26.2 get_module:查看内核模块详细信息 26.3 modinfo:显示内核模块信息
- Github协作图想
首先 git pull 从远程拉下代码,并在本地与本地代码自动合并 在本地解决冲突后,可将本地代码进行远程推送 版本库的Repository中存储的是版本树状链,每一根链接线代表每一次的修改,每一个节 ...
- 统计单词数:string函数使用
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- 56[LeetCode] .Merge Intervals
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...
- The Activation Function in Deep Learning 浅谈深度学习中的激活函数
原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html 版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激 ...
- URAL 1519 Formula 1(插头DP,入门题)
Description Background Regardless of the fact, that Vologda could not get rights to hold the Winter ...
- 嵌入式码农的10年Bug调试经验,值得一看
下面这些都是我经历过的会导致难点bug的问题: 1.事件顺序.在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如果我们没有接收到此事件会怎么样?如果此事件接连发生两次会怎么样?哪怕通 ...
- allocator类
一.动态数组 [new的局限性] new将内存分配和对象构造组合在一起,同样delete将对象析构和内存释放组合在一起 我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起(我们知道对象应有什 ...
- c#基类继承
[ 塔 · 第 三 条 约 定 ] 编写一个多边形作为基类(成员:定点数)抽象方法(子类实现):体积.边长 正三角形类:成员 边长 长方形类:成员 长宽 using System; using Sys ...