F. 数学上来先打表
题解:
搞这题搞了一天
思维不是很难
就是暴力压位bitset
分块做法速度更快
但是stl里的不能实现这个功能
所以手动实现
64位压一位
到65535跑一下1的个数
然后(x>>16)&65535+...计算出1的个数
眼查错果然还是不靠谱以后还是写对拍吧
另外的难点在于这题很卡空间
我们建立dfs树
这样把总空间变为最大消耗空间
合并bitset的时候我们利用启发式合并
并且bitset只存出现了的位置
就是那些64位都没有出现的就不存了
空间是nlogn的,但是还是挺卡的吧
使用动态开数组的技巧替代vector
*int=calloc(大小,sizeof())
另外这个东西不会自动释放空间
所以我们要free()这个东西
代码:
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define rint int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
const int N=1.1e5;
struct bi{
ull *v;
int *pos,cnt;
bi() { cnt=;}
}B[N];
int head[N],count2[N],count3[N],pos[N],pos2[N],pos3[N],pos4[N],fa[N],ans[N];
IL void js2(bi &a,bi b,int p)
{
if (p==)
{
int sad;
sad=;
}
bi c;
int tmp=a.cnt+b.cnt;
c.v=(ull*)calloc(tmp+,sizeof(ull));
c.pos=(int*)calloc(tmp+,sizeof(int));
rint x=a.cnt,y=b.cnt;
c.cnt=;
rint i=,j=;
while (i<=x&&j<=y)
{
if (a.pos[i]<b.pos[j]) c.v[++c.cnt]=a.v[i],c.pos[c.cnt]=a.pos[i],i++;
else if (a.pos[i]>b.pos[j]) c.v[++c.cnt]=b.v[j],c.pos[c.cnt]=b.pos[j],j++;
else
{
// if (a.v[i]^b.v[j])
c.v[++c.cnt]=a.v[i]^b.v[j],c.pos[c.cnt]=b.pos[j];
i++; j++;
}
}
while (j<=y) c.v[++c.cnt]=b.v[j],c.pos[c.cnt]=b.pos[j],j++;
while (i<=x) c.v[++c.cnt]=a.v[i],c.pos[c.cnt]=a.pos[i],i++;
free(a.v); free(a.pos);
a=c;
}
struct re{
int a,b,c,d;
}e[N*],a[N];
bool cmp(re x,re y)
{
return(x.a<y.a);
}
int l;
void arr(int x,int y,int x1,int y1)
{
e[++l].a=head[x];
e[l].b=y;
e[l].c=x1;
e[l].d=y1;
head[x]=l;
}
#define js(x) (count2[x&65535]+count2[(x>>16)&65535]+count2[(x>>32)&65535]+count2[(x>>48)&65535])
int find(int x)
{
return fa[x]==x?x:find(fa[x]);
}
vector<re> ve[N];
void dfs(int x)
{
int l=(int)(ve[x].size())-;
rep(i,,l)
{
int x1=pos4[find(ve[x][i].a)],x2=ve[x][i].b,x3=ve[x][i].c;
int cnt=;
rep(i,,B[x1].cnt)
if (cnt+js(B[x1].v[i])<x2)
cnt+=js(B[x1].v[i]);
else
{
ull o=B[x1].v[i];
rep(j,,)
if ((o>>j)&)
{
cnt++;
if (cnt==x2)
{
ans[x3]=*(B[x1].pos[i]-)+j+; break;
}
}
break;
}
if (cnt<x2) ans[x3]=-;
}
for (rint u=head[x];u;u=e[u].a)
{
rint v=e[u].b;
rint x1=find(e[u].c),x2=find(e[u].d),tmp=;
// bi tmp2;
bool tt=;
if (x1!=x2)
{
tt=;
if (count3[x1]>count3[x2]) swap(x1,x2);
fa[x1]=x2; count3[x2]+=count3[x1];
int k1=B[pos4[x1]].cnt,k2=B[pos4[x2]].cnt;
if (k1>k2)
{
tmp=pos4[x2];
// tmp2=B[pos4[x1]];
js2(B[pos4[x1]],B[pos4[x2]],);
pos4[x2]=pos4[x1];
} else
js2(B[pos4[x2]],B[pos4[x1]],pos4[x2]);
}
dfs(v);
if (tt)
{
fa[x1]=x1; count3[x2]-=count3[x1];
if (tmp)
{
pos4[x2]=tmp; js2(B[pos4[x1]],B[tmp],);
} else
{
js2(B[pos4[x2]],B[pos4[x1]],pos4[x2]);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
rep(i,,) count2[i]=count2[i>>]+(i&);
int n,m;
cin>>n>>m;
rep(i,,n) cin>>a[i].a,a[i].b=i;
rep(i,,n) pos4[i]=i,count3[i]=;
sort(a+,a+n+,cmp);
rep(i,,n) pos[a[i].b]=i,pos2[i]=a[i].a;
rep(i,,n)
{
B[i].v=(ull*)calloc(,sizeof(ull)); B[i].pos=(int*)calloc(,sizeof(int));
int t=pos[i]; t--;
B[i].pos[]=(t/)+; B[i].v[]=1ull<<(t%);
fa[i]=i;
B[i].cnt=;
}
int now,cnt,cnt2=;
now=cnt=;
pos3[]=;
rep(i,,m)
{
int kk,x,y;
cin>>kk;
if (kk==)
{
cin>>x>>y;
arr(now,++cnt,x,y);
pos3[i]=cnt;
now=cnt;
}
if (kk==)
{
cin>>x;
now=pos3[x];
}
if (kk==)
{
cin>>x>>y;
ve[now].push_back((re){x,y,++cnt2});
}
pos3[i]=now;
}
dfs();
rep(i,,cnt2)
if (ans[i]==-) cout<<-<<endl;
else cout<<pos2[ans[i]]<<endl;
return ;
}
F. 数学上来先打表的更多相关文章
- LibreOJ β Round #2 F. 数学上来先打表
传送门 题解 做法与题解基本无异,不过他说用vector我觉得用链表来得更好一些. #include<queue> #include<ctime> #include<bi ...
- 汕头市队赛 SRM10 T3 数学上来先打表
数学上来先打表 SRM 10 描述 给出 n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案:1.每条边连接两个不同的点,每两个点之间至多有一条边2.不存在三个点a,b,c使三个点间两两 ...
- 【STSRM10】数学上来先打表
[算法]DP+数学计数 [题意]给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边. 2.不存在 ...
- [loj519]数学上来先打表
建立操作树,即1和3操作时i-1向i连边,2操作中k向i连边,然后dfs一遍 那么当我们走到一个节点,就执行该操作(修改也是操作),退出后取消该操作即可 于是相当于要维护一个东西,支持:1.加边:2. ...
- 数学--数论--HDU 2582 F(N) 暴力打表找规律
This time I need you to calculate the f(n) . (3<=n<=1000000) f(n)= Gcd(3)+Gcd(4)+-+Gcd(i)+-+Gc ...
- [国家集训队]整数的lqp拆分 数学推导 打表找规律
题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在:求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐波 ...
- HDU 2802 F(N) 数论+打表
题目大意:f[n]-n^3=f[n-2]-(n-1)^3 (n >=3),f[1]=1,f[2]=7,求f[n]. 题目思路:将n^3移到到等式右边化简的到:f[n]=f[n-2]+3n*(n- ...
- 【NOIP模拟赛】 permutation 数学(打表)
biubiu~~~ 这道题卡读题卡得很死......首先他告诉我们读循环的时候要顺着圈读,然后又说这个圈在数列上要以最大数开始读,而且以这样的循环的首数排序,得到的序列与原序列一样那么他就是可行序列, ...
- Latex数学符号对应表
1. 希腊字母 字母 实现 字母 实现 $\alpha$ \alpha $\Alpha$ \Alpha $\beta$ \beta $\Beta$ \Beta $\gamma$ \gamma $\Ga ...
随机推荐
- MFCWinInet学习
http://blog.csdn.net/segen_jaa/article/details/6278167 背景: 功能:服务端下载文件 服务端:用Java写Sevlet进行有效性验证 客户端:用C ...
- Django-jinjia2的赋值
一 变量 1. 变量的形式是:{{ variable }},当模板引擎碰到变量时,引擎使用变量的值替代变量: 2. 使用“.”能够访问变量的属性: 3. 当模板引擎碰到“.”的时候,查找顺序是: a) ...
- 008_falcon磁盘io计算方法
一.falcon磁盘IO告警计算方法 (1)线上告警示例 [falcon]环境: prod 时间: 2018-11-10 22:29 共1条 [#主机磁盘io过高(appid)]主机hostname磁 ...
- $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...
- MySql 使用规范推荐(转)
在java应用开发中深知数据库的重要性,绝大多数情况下数据库的性能决定了程序的性能,前期如果埋下的坑越多到后期会成为整个程序的瓶颈,所以希望java开发者一定要重视!!!! 一.基础规范 1.使用In ...
- appium常用方法
1.输入中文 在capabilities中增加两项设置: capabilities.setCapability("unicodeKeyboard", "True" ...
- Swap交换分区概念
什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM (random acc ...
- httprouter与 fasthttp 的性能对比
关于协议: 本打算接入层使用gRPC,虽然基于HTTP 2.0 效率比较高,而且使用protobuf 能进行高效的序列化.但是本次系统需要和 JAVA进行对接,考虑到gRPC对JAVA的支持性不是很好 ...
- Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]
Codeforces 洛谷:咕咕咕 CF少有的大数据结构题. 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)= ...
- linux学习之软件包安装
本学习基于redhat系统或者centos系统 一.软件包的安装 1.rpm安装,rpm安装分为俩种,一种是直接安装xxx.rpm包,另一种是通过yum安装一系列的rpm包. #推荐使用yum安装,y ...