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 ...
随机推荐
- 一、Windows10下python3和python2同时安装
python2.exe.python3.exe和pip2.pip3设置 说明:安装安装python3和python2请参考本系列教程(一) 1.添加python2到系统环境变量 打开,控制面板\系统和 ...
- input修改placeholder文字颜色
少废话,上代码: <style> input::-webkit-input-placeholder{ color:red; } input::-moz-placeholder{ /* Mo ...
- 利用HBuilder将vue项目打包成移动端app
事先准备,开发完成的web app项目(也可以利用vue-cli脚手架构建vue模板项目),npm run dev可以正常预览的项目 1,将项目目录下config文件内index.js中assetsP ...
- 毫秒倒计时小Demo
Demo截图: Demo:Demo 上代码: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Dubbo原理解析-Dubbo内核实现之SPI简单介绍
转自:https://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 Dubbo 采用微内核+插件体系,使得设计优雅,扩展性强.那所谓 ...
- Swift 学习- 05 -- 集合类型
// 集合类型 // swift 提供 Arrays , Sets 和 Dictionaries 三种基本的集合类型用来存储数据 , 数组(Arrays) 是有序数据的集, 集合(Sets)是无序无重 ...
- 解决 安装或卸载软件时报错Error 1001 的问题
卸载或安装程序时出错1001:错误1001可能发生在试图更新.修复或卸载windows os中的特定程序时.此问题通常是由于程序的先前安装损坏而引起的. 错误“1001”通常会遇到,因为程序的先前安装 ...
- Ajax中onreadystatechange函数不执行,是因为放在open()后
今天动手写Ajax时遇到的问题:按照下面的顺序来写Ajax,功能是alert出txt文档的内容,在Chrome下可以执行onreadystatechange中的事件,在IE11及以下.FF就不能执行o ...
- SSM框架应用
一.更新用户密码功能的实现 1. 新建页面 profile.jsp,添加三个输入框和提交按钮:用户输入当前密码.输入新密码.再次确认密码和重置按钮.修改密码按钮: 2. 前台 js(JavaScrip ...
- SQLServer 2014 本地机房HA+灾备机房DR解决方案
SQLServer 2014 主数据中心HA+灾备机房DR解决方案 SQLServer 2008 的时候使用 local WSFC+DR Mirror方式,对象是单数据库 两个单独的 WSFC 上使用 ...