
F2. Guess the K-th Zero (Hard version)(分块)
发布日期:2021-05-08 05:35:23
浏览次数:12
分类:原创文章
本文共 1871 字,大约阅读时间需要 6 分钟。
思路:先分块,再块中二分。暴力修改400ms
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define debug(a) cout<<#a<<"="<<a<<endl;using namespace std;const int maxn=2e5+1000;typedef int LL;inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;}struct P{ LL l,r,sum;}block[maxn];LL ask(LL l,LL r){ cout<<"? "<<l<<" "<<r<<endl; LL num;cin>>num; cout.flush(); return num;}bool check(LL mid){ LL res=block[mid].r;///区间长度 LL num=res-block[mid].sum;///0的总数 return num;}int main(void){ cin.tie(0);std::ios::sync_with_stdio(false); LL n,t;cin>>n>>t; LL p=20; LL cnt=(n+p-1)/p;///要分成的总块数 bool flag=1; while(t--){ LL pos;cin>>pos; if(flag==1){ flag=0; for(LL i=1;i<=cnt;i++){ LL l=(i-1)*p+1; LL r=(i)*p; block[i].l=l;block[i].r=min(r,n); block[i].sum=ask(1,min(r,n));///记录块的前缀和 } } LL l=1;LL r=cnt;// while(l<r){// LL mid=(l+r)>>1;// if(check(mid)>=pos){///1到mid的0的个数// r=mid;// }// else l=mid;// } LL choice=l; for(LL i=l;i<=r;i++){ LL res=block[i].r;///1~r的区间长度 LL num1=block[i].sum;///1~i块的区间1数量 if(res-num1>=pos){ choice=i; break; } } ///choice此时为找到的块 LL L=block[choice].l;LL R=min(n,block[choice].r); while(L<R){ LL mid=(L+R)>>1; LL num=ask(1,mid);///1的个数 LL cnt=(mid-num);///1~mid的0的个数 if(cnt>=pos) R=mid; else L=mid+1; } cout<<"! "<<L<<endl; cout.flush(); ///暴力修改 for(LL i=choice;i<=cnt;i++){ block[i].sum++; } } return 0;}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月23日 22时22分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
数据库
2019-03-05
jvm-02
2019-03-05
ThreadLocal的使用总结
2019-03-05
jvm-05
2019-03-05
spring boot@Value和bean执行顺序问题
2019-03-05
从浏览器输入网址到服务器返回经历的过程
2019-03-05
解决Genymotion无法拖拽的问题
2019-03-05
中国石油大学《计算机文化基础》在线考试(客观题)
2019-03-05
中国石油大学《 管理心理学(行政管理专业禁选)》在线考试
2019-03-05
机器学习(numpy/matplotlib/scipy)学习笔记
2019-03-05
HTML CSS JS 特殊字符表
2019-03-05
codeforces The Eternal Immortality 题解
2019-03-05
蓝桥杯 历届试题 幸运数 (堆+DFS)
2019-03-05
微信js-sdk使用简述(分享,扫码功能等)
2019-03-05
selenium 的介绍和爬取 jd数据
2019-03-05
python-selenium优化方案
2019-03-05
服务器 centos 系统漏洞快速修复简易方法
2019-03-05
【分享-一键在线抠图】在线免费去除图片背景
2019-03-05