四连测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),每个网格是一个近似的平面,具有水平高度 ...
随机推荐
- RAP2环境搭建整理(超详细)
RAP2是阿里开源的接口管理平台,最近搭建了一下,将部署文档整理如下: 如果途中遇坑会在文章末尾记录下来嘻嘻 首先,确定环境是否部署好. RAP2所需的环境为: node.js 8.9.4+ mysq ...
- git基础(1)
一.获取git仓库(两种方法)1.现有目录初始化 git init目录有文件(非空文件)进行跟踪执行:git add+文件名提交:git commit -m(提交信息说明) 2.克隆现有代码仓库的代码 ...
- leetcode合并区间
合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...
- Python爬虫模拟登录带验证码网站
问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...
- 交换学生 (Foreign Exchange,UVa10763)
题目描述: 解题思路: 开一个数组,读入一次交换两个数,如果最后数组不变,即符合匹配 #include<iostream> #include<cstdio> #include& ...
- browsersync 插件
自从发现了这个 browsersync 插件 ... 在也不用每次改一行代码就去手动刷新 HTML 页面了省去了很多繁琐的操作,当有多个显示器的时候,更加的方便,在IDEA上编辑代码之后,点击 com ...
- lock+Condition
关键字 synchronized+wait/notify/notifyAll可以实现等待/通知模式,类ReentrantLock可以实现同样的功能,但需要借助Condition对象.Condition ...
- django request bug
bug描述:django请求request接收数据时,如果参数中包含分号时,会导致分号后面的消息丢失. 比如前台js调用代码 $.post('/get_params', { "A" ...
- [CH0304]IncDec Sequence
和NOIP2018DAY1T1类似的题目,但思维难度高多了. 这题既可以抬高路面,也可以降低路面,而且目标平面不确定,就难起来了. 但是两道题的基本思路几乎一样,同样我们将 2~n 的高度差分,1之所 ...
- CDH组件目录\主机资源分配\端口
目录: /var/log/cloudera-scm-installer : 安装日志目录. /var/log/* : 相关日志文件(相关服务的及CM的). /usr/share/cmf/ : 程序安装 ...