164分 rank11/64

  这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3~额十几分钟吧

  然额付出总是与回报成反比的,T1切了,T2超时60分,T3拿到了4分的好成绩,但某位不愿透露姓名的王鹤松说,他花了将近俩小时在T1上,20分钟T2,结果T1没有切掉,T2  比我高十分(QWQ)

  这场考试下来发现自己还是有点儿紧张,中间去了好几次WC

  对于这场考试,遗憾的是时间分配不均,没有拿到足够高的分数来给自己上保险,不过稍稍宽慰而又难受的是T2我想到了正解,就是没有排序,结果TLE 60,否则我会切掉他,拿到最好的一次成绩

T1 斐波那契 没啥可说的,一遍过

#include<iostream>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int n;
long long f[];
long long search(long long x){
int l=,r=,mid,ans;
while(l<r){
mid=(l+r)>>;
if(f[mid]>=x) r=mid;
else l=mid+;
}
return x-f[r-];
}
long long lca(long long x,long long y){
while(x!=y){
while(x<y) y=search(y);
while(x>y) x=search(x);
}
return x;
}
int main(){
scanf("%d",&n);
f[]=f[]=f[]=;
for(int i=;;i++){
f[i]=f[i-]+f[i-];
if(f[i]>=(long long)1e12) break;
}
long long x,y;
while(n--){
scanf("%lld%lld",&x,&y);
long long w=lca(x,y);
printf("%lld\n",w);
}
}

T2 数颜色

  线段树套数状数组,分块,带修莫队,树套树……都可以拿到分甚至AC

  我是想到了另一个正解,就是维护颜色的前缀和,比如 i 点颜色为 j ,那么一个数组记录 f[i]=tmp[j]  ,tmp是一个桶记录到目前为止j的个数,然后查询时只需要找到 l~r 区间的后一个颜色为j的 点 ,以及从 l 往前的第一个颜色为j的点,二者f[]差值即为该区间的颜色为j的个数,而修改时只需要把i和i+1 颜色互换,且如果颜色不一样,交换f[]值(因为如果颜色一样,f[i],f[i+1]不变)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,a[],tmp[],f[];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
tmp[a[i]]++;
f[i]=tmp[a[i]];
}
int x,l,r,c;
while(m--){
scanf("%d",&x);
if(x==){
scanf("%d%d%d",&l,&r,&c);
while(r>=l&&a[r]!=c) r--;
if(r<l) printf("0\n");
else{
l--;
while(l&&a[l]!=c) l--;
printf("%d\n",f[r]-f[l]);
}
}
else{
scanf("%d",&l);
r=l+;
swap(a[l],a[r]);
if(a[l]!=a[r]){
swap(f[l],f[r]);
} }
}
}

TLE 60

  而优化的算法就是将 数组以颜色为第一要素,点的位置为第二要素二元组排序,在待查询的颜色所在的区间二分查找位置在l~r之间的点,这种点的个数就是答案

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int L=<<|;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
int n,m,to[],s[],t[];
struct node{
int a,id;
}f[];
inline int read(){
register int ret;
register char r;
while(r=getchar(),r<''||r>'');ret=r-;
while(r=getchar(),r>=''&&r<='')ret=ret*+r-;
return ret;
}
inline int cmp(node x,node y){
return (x.a==y.a)?x.id<y.id:x.a<y.a;
}
inline int search(int L,int R,int c){
int l=s[c],r=t[c],mid,ansl,ansr;
if(f[l].id>R||f[r].id<L) return ;
while(l<=r){
mid=(l+r)/;
if(f[mid].id>=L) r=mid-,ansl=mid;
else l=mid+;
}
l=s[c],r=t[c];
while(l<=r){
mid=(l+r)/;
if(f[mid].id<=R) l=mid+,ansr=mid;
else r=mid-;
}
if(ansl>ansr) return ;
return ansr-ansl+;
}
int main(){
n=read(),m=read();
for(register int i=;i<=n;i++){
f[i].a=read();
f[i].id=i;
}
sort(f+,f+n+,cmp);
for(register int i=;i<=n;i++){
if(f[i].a!=f[i-].a){
t[f[i-].a]=i-;
s[f[i].a]=i;
}
to[f[i].id]=i;
}
t[f[n].a]=n;
int x,l,r,c;
while(m--){
x=read();
if(x==){
l=read(),r=read(),c=read();
printf("%d\n",search(l,r,c));
}
else{
l=read();
r=l+;
if(f[to[l]].a!=f[to[r]].a){
f[to[l]].id=r;
f[to[r]].id=l;
swap(to[l],to[r]);
}
}
}
}

1000多ms

T3 分组

  因为要求出组数最少字典序最小的,所以倒着贪心求,能苟在这个小组了就苟着,实在不能苟了,再和他们分开另建一小组

  对于k=1,直接暴力枚举位置大于该点的点的颜色与该点颜色相加判断是否是平方数,来判断该兔子能否加入当前的小组,不能的话就在以这个兔子为最右的端点再开一个小组,  直到到头

  当然,这样做必定TLE,换一种判断方法,a[]最大131072,两个a[]相加最大值为262144,是512的平方,可以枚举1~512的平方,看x^2-a[i] 有没有在之前出现过,出现过则证  明会有矛盾,如此40分到手  

  对于k=2,只要把这个小组分成两个集合,且同一集合中没有互相矛盾的兔子就成立,用到了二分图的判定(交叉染色法),倒着枚举,然后把该点和与他矛盾的点连边,走一遍  DFS染色判断是否是二分图,不是的话把它当作新小组的右端点并记录,继续走

  PS:不要忘记清空颜色

  PSS: 判断时,图不一定联通,所以一开始我是for循环看那一个点没颜色,就从该点进入再跑一遍,结果TLE,后来我把for删了,直接从i点进入走一遍判断

  证明: 在走i点之前,设x点(位置在i右侧,已走过)所联通的那一块与另一块没有相连,而既然已经走到了 i,这就意味着x点所联通的与主体部分不联通的那一块是二分图,

  所以不需要在for 重新跑一遍,到i点时,唯一不确定是否是二分图的只有与i相连的那一块

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int n,K,a[],st[],v[],ms[],color[];
vector<int>son[];
int dfs(int x,int r,int l,int pre){
for(int i=;i<son[x].size();i++){
int y=son[x][i];
if(y==pre||y<l||y>r) continue;
if(!color[y]){
color[y]=color[x]^;
if(!dfs(y,r,l,x)) return ;
}
else if(color[y]==color[x]) return ;
}
return ;
}
int judge(int r,int l){
color[l]=;
if(!dfs(l,r,l,)) return ;
return ;
}
int main(){
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
if(K==){
int la=n;
for(int i=;i<=;i++) ms[i]=i*i;
for(int i=n;i;i--){
int flag=;
for(int j=;j<=;j++){
if(ms[j]<a[i]||!v[ms[j]-a[i]]) continue;
flag=;
break;
}
if(flag==){
for(int j=la;j>i;j--) v[a[j]]=;
st[++st[]]=i,la=i;
}
v[a[i]]=;
}
printf("%d\n",st[]+);
for(int i=st[];i;i--) printf("%d ",st[i]);
cout<<endl;
}
else{
int la=n;
for(int i=;i<=;i++) ms[i*i]=;
for(int i=n;i;i--){
for(int j=la;j>i;j--){
if(!ms[a[i]+a[j]]) continue;
son[i].push_back(j);
son[j].push_back(i);
}
if(!judge(la,i)){
st[++st[]]=i;
la=i;
son[i].clear();
}
for(int j=la;j>=i;j--) color[j]=;
}
printf("%d\n",st[]+);
for(int i=st[];i;i--) printf("%d ",st[i]);
cout<<endl;
}
}

20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」的更多相关文章

  1. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  2. NOIP模拟测试3「序列·熟练剖分·建造游乐园(play)」

    ---恢复内容开始--- 序列 刚调出来样例就A了,假装是水题. 因为是乱序,我们要求出来每两项之间最小公比,而不是直接比 求出来每两项之间最小公比,然后扫一遍就完了.(还要注意重复情况) 那么问题就 ...

  3. 【模拟8.03】斐波那契(fibonacci) (规律题)

    就是找规律,发现每个父亲和孩子的差值都是距儿子最大的fibonacc 也是可证的 f[i]表示当前月的兔子总数 f[i]=f[i-1]+f[i-2](f[i-2]是新生的,f[i-1]是旧有的) 然后 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  6. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  7. NOIP模拟测试12

    T1 斐波那契 一道找规律题,被我做成了贼难的题. 观察图片可知x=f[i-1]+j.(j为x的父亲)且j<=f[i-1],然后就二分找父亲没了. #include<bits/stdc++ ...

  8. 【20180808模拟测试】T2 k-斐波那契

    描述 k-斐波拉契数列是这样的 f(0)=k;f(1)=k;f(n)=(f(n-1)+f(n-2))%P(n>=2); 现在我们已经知道了f(n)=1,和P: k的范围是[1,P); 求k的所有 ...

  9. 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契

    牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...

随机推荐

  1. 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

    目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...

  2. solr 重要的知识点

    1 solr 查询参数说明 常用 ) q - 查询字符串,必须的. ) fl - 指定返回那些字段内容,用逗号或空格分隔多个. ) start - 返回第一条记录在完整找到结果中的偏移位置, 开始,一 ...

  3. 可用的NTP服务器地址

    国内可用的Internet时间同步服务器地址(NTP时间服务器)好在阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址 ntp1.aliyun.comntp2.aliyun.co ...

  4. Java中实现线程的方式

    Java中实现线程的方式 Java中实现多线程的方式的方式中最核心的就是 run()方法,不管何种方式其最终都是通过run()来运行. Java刚发布时也就是JDK 1.0版本提供了两种实现方式,一个 ...

  5. 【深入浅出-JVM】(3):浮点数

    -5 浮点数推导 二进制转十进制 1 10000001 01000000000000000000000 1 10000001 101000000000000000000000 如果指数位不全为 0 则 ...

  6. C语言指针学多了,你为什么会觉得晕?

    对于C语言中的指针概念,如果我告诉你,它是一个地址变量,你听了一头雾水,"地址?啥意思?"见你不理解,我说的详细点"指针变量跟其他变量一样,存储的是一个地址". ...

  7. 我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了

    我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了

  8. mongo去重统计

    表名:parkUserCost id: patkId: userId: phone: costVal: 适合特定条件下,对某些字段进行去重筛选.(比如限定抢购) 第一种,使用\(first操作符.\) ...

  9. TencentTbs腾讯浏览服务 x5内核使用

    Tencent TBS (下简称TBS) 腾讯浏览服务 What is it? 百度百科解释: 腾讯浏览服务(Tencent Browsing Service,以下简称TBS),由腾讯X5浏览服务升级 ...

  10. [小米OJ] 9. 移除 K 位得到最小值

    思路: 重复k次: 1.找到并且删除第一个 num[i] > num[i+1] 的第i位数字. 2.若删除过程中,序列变成递增序列,则直接删除最后一位. 注意除去字符串头的0 def solut ...