湖南集训day7
难度:☆☆☆☆☆☆
/*
由观察可知 同种颜色的减去他的父亲值相同
我们考虑把询问的两个数分别减去小于它的最大斐波那契数。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 3000007
#define ll long long using namespace std;
ll n,m,x,y,ans,cnt1,cnt2;
ll feb[N]; inline ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline ll swap(ll x, ll y)
{
ll tmp=x;x=y;y=tmp;
} int main()
{
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout);
feb[]=feb[]=;
for(int i=;i<=;i++) feb[i]=feb[i-]+feb[i-];
m=read();
while(m--)
{
x=read();y=read();
for(int i=;x!=y;i--)
{
if(x>feb[i]) x-=feb[i];
if(y>feb[i]) y-=feb[i];
}
printf("%lld\n",x);
}
fclose(stdin);fclose(stdout);
return ;
}
/*
在vector里二分左右端点计算答案即可
也可以用动态开点线段树
分块和主席树写好看了应该也能搞过去
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm> #define N 300010 using namespace std;
vector<int>a[];
int pos[N];
int n,m,l,r,k,x; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
n=read();m=read();
for(int i=;i<=n;i++) pos[i]=read(),a[pos[i]].push_back(i);
for(int i=;i<=;i++)
sort(a[i].begin(),a[i].end());
for(int i=;i<=m;i++)
{
int opt;opt=read();
if(opt==)
{
l=read();r=read();k=read();
int ll=,rr=a[k].size()-,ans=-,mid;
while(ll<=rr)
{
mid=ll+rr>>;
if(a[k][mid]>=l) ans=mid,rr=mid-;
else ll=mid+;
}
if(ans==-){printf("0\n");continue;}
ll=,rr=a[k].size()-;int ans2=-;
while(ll<=rr)
{
int mid=ll+rr>>;
if(a[k][mid]<=r) ans2=mid,ll=mid+;
else rr=mid-;
}
if(ans2==-){printf("0\n");continue;}
else printf("%d\n",ans2-ans+);
}
else
{
x=read();
if(pos[x]==pos[x+]) continue;
else
{
a[pos[x]][lower_bound(a[pos[x]].begin(),a[pos[x]].end(),x)-a[pos[x]].begin()]++;
a[pos[x+]][lower_bound(a[pos[x+]].begin(),a[pos[x+]].end(),x+)-a[pos[x+]].begin()]--;
swap(pos[x],pos[x+]);
}
}
}
}
/*
k==1 从后往前找最长的不冲突的,这样可以保证字典序最小
枚举k,k*k-a[i]==a[j]说明a[i]与a[j]的和是一个完全平方数。 k==2 部分分可以二分图染色
用并查集“敌人集合”维护冲突关系。
注意特判数相等的情况(k*k==a[j]*2)
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 131073 using namespace std;
int n,m,K;
int a[N],b[N],f[N<<];
bool vis[N],dvis[N],issqr[N<<]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int find(int x){
return f[x]>?(f[x]=find(f[x])):x;
} void merge(int u,int v)
{
u=find(u),v=find(v);
if(u!=v)
{
if(f[u]>f[v]) swap(u,v);
f[u]+=f[v];f[v]=u;
}
} bool check(int u,int v)
{
int r1=find(u),r2=find(u+N);
int s1=find(v),s2=find(v+N);
if(r1==s1 || r2==s2) return true;
merge(r1,s2);merge(r2,s1);
return false;
} void solve1()
{
for(int i=n,j=n;i;)
{
for(bool flag=;j;j--)
{
for(int k=;k*k-a[j]<N;k++)
{
if(k*k-a[j]<=) continue;
if(vis[k*k-a[j]])
{
flag=;break;
}
}
if(!flag) break;vis[a[j]]=;
}
if(!j) break;b[++m]=j;
for(;i>j;i--) vis[a[i]]=;
}
} void solve2()
{
memset(f,-,sizeof f);
for(int i=;i*i<*N ;i++) issqr[i*i]=;
for(int i=n,j=n;i;)
{
for(bool flag=;j;j--)
{
if (vis[a[j]])
{
if (issqr[a[j]+a[j]])
{
if (dvis[a[j]]) break;
for (int k=;k*k-a[j]<N;k++)
{
if (k*k-a[j]<=) continue;
if (vis[k*k-a[j]] &&k*k!=a[j]*)
{
flag=;break;
}
}
if (!flag)break; dvis[a[j]]=;
}
}
else
{
for(int k=;k*k-a[j]<N;k++)
{
if(k*k-a[j]<=) continue;
if(vis[k*k-a[j]])
{
if(check(k*k-a[j],a[j]))
{
flag=;break;
}
}
}
if(!flag) break;vis[a[j]]=;
}
}
if(!j) break;b[++m]=j;
for(;i>j;i--) f[a[i]]=f[a[i]+N]=-,vis[a[i]]=,dvis[a[i]]=;
}
} int main()
{
freopen("division.in", "r", stdin);
freopen("division.out", "w", stdout);
scanf("%d%d",&n,&K);
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
if (K==) solve1();
else solve2();
printf("%d\n",m+);
for (int i=m;i;i--) printf("%d ",b[i]);
putchar('\n');
return ;
}
湖南集训day7的更多相关文章
- 「2017 山东三轮集训 Day7 解题报告
「2017 山东三轮集训 Day7」Easy 练习一下动态点分 每个点开一个线段树维护子树到它的距离 然后随便查询一下就可以了 注意线段树开大点... Code: #include <cstdi ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP
[LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...
- P3900 [湖南集训]图样图森破
P3900 [湖南集训]图样图森破 链接 分析: 感觉像个暴力. 可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度. 此时如果回文串两端都没有到这个 ...
- 2017 山东二轮集训 Day7 国王
2017 山东二轮集训 Day7 国王 题目大意 给定一棵树,每个点有黑白两种颜色,定义一条简单路径合法当且仅当路径上所有点黑色与白色数量相等,求有多少非空区间 \([L,R]\) ,使得所有编号 \ ...
- loj #6077. 「2017 山东一轮集训 Day7」逆序对
#6077. 「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...
- 2019暑期金华集训 Day7 分治
自闭集训 Day7 分治 主定理 由于我沉迷调题,这个地方没听课. 某些不等式 咕了 nth_element 使用快速排序的思想,选一个中间点,看左右有多少个. 期望复杂度\(O(n)\). 首先把一 ...
- 2019暑期金华集训 Day7 动态规划
自闭集训 Day7 动态规划 LOJ6395 首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可. 然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数 ...
- 考前停课集训 Day7 嘞
Day7 正如一个大佬提醒的那样,棕名是会被嘲讽的 果然…… 在洛谷里…… 算了. 不必在意. 马上就要退役了. NOIP,开始的地方,也是结束的地方. 如果一群OIer比你小 还会嘲讽你, 你就该退 ...
随机推荐
- CSS相对|绝对(relative/absolute)定位
1.破坏性和包裹性 position:absolute与float:left,两者有两大共性:包裹性,破坏性. 包裹性 包裹性换种说法就是让元素inline-block化,例如一个div标签默认宽度是 ...
- SQL 数据类型 numeric varchar char
Numeric(10,2) 指字段是数字型,长度为10 小数为两位的 简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR VS CHAR VARCHAR ...
- poj1753 Flip Game —— 二进制压缩 + dfs / bfs or 递推
题目链接:http://poj.org/problem?id=1753 Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- PYTHON 爬虫笔记六:PyQuery库基础用法
知识点一:PyQuery库详解及其基本使用 初始化 字符串初始化 html = ''' <div> <ul> <li class="item-0"&g ...
- android程序的真正入口
代码出自MtAndroid 3.1.2完全开发手册,适用于Android平台. 概述 android程序的真正入口是Application类的onCreate方法.它的继承关系如下所示: java.l ...
- 分享知识-快乐自己:Struts2中 获取 Request和Session
目录结构: POM: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnco ...
- Linux_服务器_06_VMware虚拟机下安装CentOS7.0图文教程
二.参考资料 1.VMware虚拟机下安装CentOS7.0图文教程
- 无言以队Alpha阶段项目复审
小组的名字和链接 优点 缺点,bug报告 (至少140字) 最终名次 (无并列) 甜美女孩 http://www.cnblogs.com/serendipity-zeng/p/9937832.html ...
- Ice php配置
1) Removed the php extension directories and recompiled apache/PHP2) Rebooted the machine.3) I remov ...
- Linux(Ubuntu16.04)+GitLab8.17deb安装包搭建Git仓库(代码管理系统)
1 下载GitLab安装包 2 执行安装命令 3 验证是否安装和启动成功 4 修改管理员密码 5 其它说明 5.1修改访问URL 5.2修改邮件配置 5.3修改web端口 1下载GitLab安装包 ...