四连测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),每个网格是一个近似的平面,具有水平高度 ...
随机推荐
- Siki_Unity_2-1_API常用方法和类详细讲解(上)
Unity 2-1 API常用方法和类详细讲解(上) 任务1&2:课程前言.学习方法 && 开发环境.查API文档 API: Application Programming I ...
- leetcode-岛屿的个数
岛屿的个数 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...
- [C++]STL中的容器
C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...
- win7下本地运行spark以及spark.sql.warehouse.dir设置
SparkSession spark = SparkSession .builder() .master("local[*]") .enableHiveSupport() .con ...
- ubuntu networking 与 network-manager
刚遇到的坑,因为操作不当导致网络中断,于是手动配置了/etc/network/interfaces , 修复了系统之后发现ubuntu-desktop中的有线链接不见了,百度了一下说是networki ...
- vector:动态数组
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确.它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存 ...
- UVa 10082 - WERTYU 解题报告 - C语言
1.题目大意: 输入一个错位的字符串(字母全为大写),输出原本想打出的句子. 2.思路: 如果将每个输入字符所对应的应输出字符一一使用if或者switch,则过于繁琐.因此考虑使用常量数组实现. 3. ...
- 你真的了解JAVA里的String么
Java中String类细节问题 (考察点Java内存分配问题) 1. String str1 = "abc"; System.out.println(str1 == &quo ...
- ACM 第十五天
计算几何基础 练习题 C - Wasted Time Mr. Scrooge, a very busy man, decided to count the time he wastes on all ...
- 201621044079 week13 网络
作业13-网络 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以 ...