湖南集训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比你小 还会嘲讽你, 你就该退 ...
随机推荐
- CALL FUNCTION 'BAPI_PO_CREATE1' 相关报错
*&---------------------------------------------------------------------**& Report ZQJ06*&am ...
- Java AQS详解(转)
原文地址 一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同 ...
- Hibernate load 和 Get的区别
load和get都可以取回一个对象,难道是方法重复吗?绝对不可能,那它们到底有那些区别呢? 在http://blog.chinaunix.net/u/484/showart_1093166.html这 ...
- Java基础之I/O流
一.数据流的基本概念 数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流.数据写入程序可以是一段.一段地向数据流管道中写入数据, ...
- NET LOCALGROUP命令详解(将用户添加到管理员组等)
NET LOCALGROUP [groupname [/COMMENT:"text"]] [/DOMAIN] groupname {/ADD [/COMMENT:"tex ...
- win下发现两个有用的快捷键
调出命令行工具:win+x然后a.默认是cmd的管理员模式,可以改成powershell. 从当前目录打开命令行:shift + 鼠标右键
- 初识Spacy
之所以想接触Spacy,是看到其自称为工业级的应用,所以想尝试下 windows下安装Spacy: 直接安装pip install spacy是会报错的 解决方法: 到 htt ...
- 文章预告的自我挖坑系列——D3.js 系列之星光闪烁
D3.js 是个神奇的工具,下面收集了一些与星星相关的可视化的例子,静待慢慢的把坑填上 雷达图http://bl.ocks.org/kevinschaul/8213691 星空 二维(一)h ...
- java-02 for循环,while循环
###############获取一个数字的每位数字############### #############1-100奇数和偶数和############## public class Sum { ...
- python之django入门
一.搭建开发环境 使用virualenv创建虚拟python环境 pip install virtualenv [root@master djiango]# find / -name virtuale ...