难度:☆☆☆☆☆☆

/*
由观察可知 同种颜色的减去他的父亲值相同
我们考虑把询问的两个数分别减去小于它的最大斐波那契数。
*/
#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. Linux 下使用C语言 gets()函数报错

    在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 ...

  2. 基于android的GPS移植调用关系【转】

    本文转载自:http://blog.csdn.net/jshazk1989/article/details/6877823 版权声明:本文为博主原创文章,未经博主允许不得转载. http://down ...

  3. POJ 1330 Nearest Common Ancestors 【最近公共祖先LCA算法+Tarjan离线算法】

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20715   Accept ...

  4. BZOJ 1726 [Usaco2006 Nov]Roadblocks第二短路:双向spfa【次短路】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1726 题意: 给你一个无向图,求次短路. 题解: 两种方法. 方法一: 一遍spfa,在s ...

  5. javascript(7)

    js中基于对象==js面向对象 js中没有类class,但是它 JavaScript是一种面向(基于)对象的动态脚本语言,是一种基于对象和事件驱动并具有安全性能的脚本语言.它具有面向对象语言所特有的各 ...

  6. str_2.判断两个字符串是否互为旋转词

    1. 字符串str的前面任意部分挪到后面形成的字符串叫做字符串str的旋转词 $str1 = "2ab1"; $str2 = "ab12"; $ret = is ...

  7. android自定义控件(四) View中的方法

    onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int ...

  8. OpenCV——PS滤镜算法之Spherize 球面化(凸出效果)

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  9. 四连测Day4

    四连爆炸 卡我常数 好像被AluminumGod拉到了创客...哇我这个天天爆炸的水平可能会被其他三位dalao吊起来打 orz Edmond-Karp_XiongGod orz Deidara_Wa ...

  10. HihoCoder1649 : 漏写的数字([Offer收割]编程练习赛38)(模拟题)

    描述 小A今年刚上幼儿园,正在学习写100以内的数字.幼儿园的老师留了一项作业,要求小A从某个100以内的数X开始一直写到另一个100以内的数Y(Y - X > 1). 不过粗心的小A在作业中漏 ...