难度:☆☆☆☆☆☆

/*
由观察可知 同种颜色的减去他的父亲值相同
我们考虑把询问的两个数分别减去小于它的最大斐波那契数。
*/
#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的更多相关文章

  1. 「2017 山东三轮集训 Day7 解题报告

    「2017 山东三轮集训 Day7」Easy 练习一下动态点分 每个点开一个线段树维护子树到它的距离 然后随便查询一下就可以了 注意线段树开大点... Code: #include <cstdi ...

  2. 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生

    题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...

  3. 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP

    [LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...

  4. P3900 [湖南集训]图样图森破

    P3900 [湖南集训]图样图森破 链接 分析: 感觉像个暴力. 可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度. 此时如果回文串两端都没有到这个 ...

  5. 2017 山东二轮集训 Day7 国王

    2017 山东二轮集训 Day7 国王 题目大意 给定一棵树,每个点有黑白两种颜色,定义一条简单路径合法当且仅当路径上所有点黑色与白色数量相等,求有多少非空区间 \([L,R]\) ,使得所有编号 \ ...

  6. loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对   题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...

  7. 2019暑期金华集训 Day7 分治

    自闭集训 Day7 分治 主定理 由于我沉迷调题,这个地方没听课. 某些不等式 咕了 nth_element 使用快速排序的思想,选一个中间点,看左右有多少个. 期望复杂度\(O(n)\). 首先把一 ...

  8. 2019暑期金华集训 Day7 动态规划

    自闭集训 Day7 动态规划 LOJ6395 首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可. 然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数 ...

  9. 考前停课集训 Day7 嘞

    Day7 正如一个大佬提醒的那样,棕名是会被嘲讽的 果然…… 在洛谷里…… 算了. 不必在意. 马上就要退役了. NOIP,开始的地方,也是结束的地方. 如果一群OIer比你小 还会嘲讽你, 你就该退 ...

随机推荐

  1. 第一节 课程简介与HTML5概述

    第一节 课程简介与HTML5概述 *********************************************************** 1.1课程简介 教学目的: 从基础入手到能够运 ...

  2. ubuntn下 apt的用法和yum的比较(转)

    centos有yum安装软件,Ubuntu有apt工具. apt简单的来说,就是给Ubuntu安装软件的一种命令方式. 一.apt的相关文件 /etc/apt/sources.list 设置软件包的获 ...

  3. python- 常见算法 python内置模块

    1.冒泡排序 需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序 原理:相邻两个值进行比较,将较大的值放在右侧,依次比较! li=[39,11,43,88,765,9]for ...

  4. ES设置字段搜索权重——Query-Time Boosting

    Query-Time Boosting In Prioritizing Clauses, we explained how you could use the boost parameter at s ...

  5. L83

    Kids Gulp 7 Trillion Calories Per Year Kids from the ages of 2 to 19, consume about seven trillion c ...

  6. properties文件的解析

    此文章是从网上看到一篇实用小文章,感觉不过,摘录下来的!如有问题,可及时联系,可立刻做相应处理! Java读取.properties 配置文件的几种方法 在做java工程时, 经常会将一些配置信息放到 ...

  7. codeforces 658D D. Bear and Polynomials(数学)

    题目链接: D. Bear and Polynomials time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  8. Java命名规范(简略)

    1.包 全部小写,由域名定义前缀. 例如:teach.golddrem.javagroup 2.类 开头字母大写,后边每个单词的首字母都大写.如果有缩写,缩写部分全部大写. 例如:Informatio ...

  9. javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  10. 重学JAVA基础(三):动态代理

    1.接口 public interface Hello { public void sayHello(); } 2.实例类 public class Hello2 { public void sayH ...