题目:链接: 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. uvaoj455Periodic Strings(枚举)

    A character string is said to have period k if it can be formed by concatenating one or more repetit ...

  2. 第二篇 CSS快速入门

    学CSS 和 JS的路线: 1. 首先,学会怎么找到标签.只有找到标签,才能操作标签——CSS通过选择器去找标签 2. 其次,学会怎么操作标签对象. CSS概述 CSS是Cascading Style ...

  3. 第三模块:面向对象&网络编程基础 第1章 面向对象

    我的失败与梦想(一) 我的失败与梦想之为何创办路飞学城 01-编程范式 02-面向过程编程 03-面向对象编程介绍 04-定义类与实例化出对象 05-如何使用类 06-如何使用对象 07-属性查找与绑 ...

  4. Objective-C 构造方法 分类 类的深入研究

    构造方法 1.对象创建的原理 new的拆分两部曲 Person *p = [Person alloc]; 分配内存(+alloc) Person *p = [p init]; 初始化(-init) 合 ...

  5. TW实习日记:第27天

    今天依旧是磨洋工的一天,说真的,被存在各种问题的后端接口把耐心和动力都给磨没了.于是一天就又在沟通接口问题中度过了,完善了一个新功能,将一个新功能开发到了一半.效率可真是够低的,唉.然后不知道为什么突 ...

  6. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

  7. lintcode12 带最小值操作的栈

    实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 建一个栈helpStack,用来存放从 ...

  8. I Hate It:线段树:单点修改+区间查询

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. Period :KMP

    I - Period Problem Description For each prefix of a given string S with N characters (each character ...

  10. python读取日志,存入mysql

    1.从 http://www.almhuette-raith.at/apache-log/access.log 下载 1万条日志记录,保存为一个文件,读取文件并解析日志,从日志中提取ip, time_ ...