题目:链接: 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的更多相关文章

  1. 四连测Day4

    四连爆炸 卡我常数 好像被AluminumGod拉到了创客...哇我这个天天爆炸的水平可能会被其他三位dalao吊起来打 orz Edmond-Karp_XiongGod orz Deidara_Wa ...

  2. 【2018.8.10】四连测day4 题解

    T1:给出一棵 $n$ 个节点的无根树,其中 $m$ 个节点是特殊节点,求对于任意 $i ∈ [0, m]$,包含 $i$ 个特殊节点的联通块个数$\mod 998244353$. $1<=n, ...

  3. ZROI 提高十连测 Day1

    第一天的提高模拟测 考前特意睡了20min 还是歇菜了,果然自己菜是真实的. 题目质量海星 但是我都不会这是真的...题目由于是花钱买的这里就不放了 LINK:problem 熟悉我的人应该都知道账号 ...

  4. 四连测总结(XYX)

    目录 成绩 总结 事后... 成绩 telephonewire monkey 总分 0 56 56 cowjog guard path temperature 总分 0 40 0 68 108 cba ...

  5. 十连测Day1 题解

    A. 奥义商店 有一个商店,n个物品,每个物品有一个价格和一种颜色. 有m个操作,操作有两种,一种是修改一个位置的价格,另一种是购买,每次购买指定一个公差d和一个位置k,找到包含这个位置k公差为d的同 ...

  6. 四连测Day3

    题目链接:https://pan.baidu.com/s/1_vsHfMI_qO-9IDxmFLkHfg 密码: uza8 T1: 小奥的一笔画,判连通性,查奇偶点即可 #include<ios ...

  7. 四连测Day2

    题目:链接: https://pan.baidu.com/s/1ef_9hGBhczW0B4dz5IUKmw 密码: qgjy T1: hash后直接二分查询即可 #include<iostre ...

  8. 正睿OI提高组十连测 day1 总结

    可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...

  9. (四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)​​​​​​​的博客

    滑雪场的高度差 时间限制: 1 Sec  内存限制: 128 MB 题目描述 滑雪场可以看成M x N的网格状山地(1 <= M,N <= 500),每个网格是一个近似的平面,具有水平高度 ...

随机推荐

  1. 使用advanced_installer将.net web程序打包为安装程序

    当项目开发完成之后,需要给客户使用时,总不能将发布后的文件全部放一起压缩后直接给客户吧,然后客户需要自行搭建环境修改配置等等,体验太差了,这时候我们就需要使用一种打包工具了,查了一些资料之后,我选择使 ...

  2. Linux命令应用大词典-第26章 模块和内核管理

    26.1 lsmod:显示内核中模块的状态 26.2 get_module:查看内核模块详细信息 26.3 modinfo:显示内核模块信息

  3. Github协作图想

    首先 git pull 从远程拉下代码,并在本地与本地代码自动合并 在本地解决冲突后,可将本地代码进行远程推送 版本库的Repository中存储的是版本树状链,每一根链接线代表每一次的修改,每一个节 ...

  4. 统计单词数:string函数使用

    题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...

  5. 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 ...

  6. The Activation Function in Deep Learning 浅谈深度学习中的激活函数

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html 版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激 ...

  7. URAL 1519 Formula 1(插头DP,入门题)

    Description Background Regardless of the fact, that Vologda could not get rights to hold the Winter ...

  8. 嵌入式码农的10年Bug调试经验,值得一看

    下面这些都是我经历过的会导致难点bug的问题: 1.事件顺序.在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如果我们没有接收到此事件会怎么样?如果此事件接连发生两次会怎么样?哪怕通 ...

  9. allocator类

    一.动态数组 [new的局限性] new将内存分配和对象构造组合在一起,同样delete将对象析构和内存释放组合在一起 我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起(我们知道对象应有什 ...

  10. c#基类继承

    [ 塔 · 第 三 条 约 定 ] 编写一个多边形作为基类(成员:定点数)抽象方法(子类实现):体积.边长 正三角形类:成员 边长 长方形类:成员 长宽 using System; using Sys ...