NOIP 模拟 六十九
0+30+40+90, 菜。。。。。
T1 取石子
考试扔了将近两个小时,最后也没有回忆起博弈论的相关内容。。
现在只会50pts。正解待补。
#include<bits/stdc++.h>
using namespace std;
int n,a[500001],ans;
signed main()
{ freopen("stone.in","r",stdin);
freopen("stone.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{ ans=0;
for(int j=1;j<=n;++j)
{ int tmp=a[j];
ans^=tmp%(i+1);
}
if(ans)printf("Alice ");
else printf("Bob ");
}
}
T2 大鱼吃小鱼
时间有限,快速拿了暴力30,然后走人。
其实线段树都码好了。在暴跳的过程中我认为就是暴跳,并没有分析出最多跳 $log$ 次,于是放弃了线段树。
改题时长时间困顿于吃完鱼节点的复原,其实节点不超过 $log^2$ 个,于是暴力修改即可。
要增强分析时间复杂度的能力。。
回归正题,一个明显的贪心是吃自己能吃的最大的鱼,找到第一个比自己体积大于等于的鱼(吃不了的),开吃,最终体积要先超过它,然后继续跳,直到吃不下了。因为每吃两次鱼体积要翻一倍,所以跳的次数是 $log$ 的。
线段树二分加上暴跳,复杂度 $O(nlog^2n)$。
#include<bits/stdc++.h>
#define int long long
#define N 1000500
using namespace std;
int n,q,w[N],san[N<<3],tot,ans,zhi,now,ne,tong1[N<<3];
bool bo=1,vis[N<<3],vvv=1;
struct jj
{int opt,s,k,w;}Q[N];
multiset<int>st;
struct tt{int sum,siz,tag;}tmp[N<<3];
struct zxb
{int sum[N<<3],siz[N<<3],tag[N<<3];
inline void pushup(int x)
{ if(!vis[x] and vvv){tong1[++zhi]=x,tmp[zhi]=(tt){sum[x],siz[x],tag[x]},vis[x]=1;}
sum[x]=sum[x<<1]+sum[x<<1|1];
siz[x]=siz[x<<1]+siz[x<<1|1];
return;
}
inline void pushdown(int x)
{
if(!vis[x<<1]){tong1[++zhi]=x<<1,tmp[zhi]=(tt){sum[x<<1],siz[x<<1],tag[x<<1]},vis[x<<1]=1;}
if(!vis[x<<1|1]){tong1[++zhi]=x<<1|1,tmp[zhi]=(tt){sum[x<<1|1],siz[x<<1|1],tag[x<<1|1]},vis[x<<1|1]=1;}
sum[x<<1]=sum[x<<1|1]=siz[x<<1]=siz[x<<1|1]=0;tag[x<<1]=tag[x<<1|1]=1;tag[x]=0;
}
inline void ins(int x,int l,int r,int pos,int val)
{ if(l==r)
{ siz[x]+=val;
sum[x]+=san[l]*val;
return;
}
int mid=(l+r)>>1;
if(mid<pos)ins(x<<1|1,mid+1,r,pos,val);
else ins(x<<1,l,mid,pos,val);
pushup(x);
}
inline int query(int x,int l,int r,int L,int R)
{ if(L>R)return 0;
if(l>=L and r<=R)return sum[x];
int mid=(l+r)>>1,res=0;
if(tag[x])pushdown(x);
if(mid<R and sum[x<<1|1])res+=query(x<<1|1,mid+1,r,L,R);
if(mid>=L and sum[x<<1])res+=query(x<<1,l,mid,L,R);
return res;
}
inline void calc(int x,int l,int r,int L,int R)
{ if(l==r and sum[x]>=ne)
{ if(!vis[x])
{tong1[++zhi]=x,tmp[zhi]=(tt){sum[x],siz[x],tag[x]},vis[x]=1;}
siz[x]-=(ne/san[l])+(ne%san[l]!=0);
ans+=(ne/san[l])+(ne%san[l]!=0);
now+=((ne/san[l])+(ne%san[l]!=0))*san[l];ne-=((ne/san[l])+(ne%san[l]!=0))*san[l];
bo=0;
sum[x]=siz[x]*san[l];
return;
}
if(r<=R)
{ if(sum[x]<=ne)
{ ne-=sum[x];now+=sum[x];
if(ne<=0)bo=1;ans+=siz[x];
if(!vis[x])
{tong1[++zhi]=x,tmp[zhi]=(tt){sum[x],siz[x],tag[x]},vis[x]=1;}
sum[x]=0;siz[x]=0;tag[x]=1;
return;
}
}
int mid=(l+r)>>1;
if(tag[x])pushdown(x);
if(mid>=R){(void)calc(x<<1,l,mid,L,R);pushup(x);return ;}
if(bo and sum[x<<1|1])calc(x<<1|1,mid+1,r,L,R);
if(bo and sum[x<<1])calc(x<<1,l,mid,L,R);
pushup(x);
}
}tree;
inline void work(int s,int k)
{ int need=k-s,val;now=s;ans=0;zhi=0;
while(need>0 and now<k)
{ auto it=st.lower_bound(now);
if(it==st.end())val=999999999999999999;
else val=*it;
ne=min(need,val-now+1);int lst=ne;
int pos=lower_bound(san+1,san+1+tot,now)-san;bo=1;--pos;
if(pos)tree.calc(1,1,tot,1,pos);
else break;
if(ne>0)break;if(it==st.end())break;
need-=(lst-ne);
}
if(ne>0)puts("-1");
else printf("%lld\n",ans);
for(int i=1;i<=zhi;++i)
{ int x=tong1[i];
vis[x]=0;
tree.sum[x]=tmp[i].sum;
tree.siz[x]=tmp[i].siz;
tree.tag[x]=0;
}
}
signed main()
{ freopen("fish.in","r",stdin);
freopen("fish.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;++i)scanf("%lld",&w[i]),san[++tot]=w[i],st.insert(w[i]);
scanf("%lld",&q);
for(int i=1;i<=q;++i)
{ scanf("%lld",&Q[i].opt);
if(Q[i].opt==1)scanf("%lld%lld",&Q[i].s,&Q[i].k),san[++tot]=Q[i].s;
if(Q[i].opt==2)scanf("%lld",&Q[i].w),san[++tot]=Q[i].w;
if(Q[i].opt==3)scanf("%lld",&Q[i].w),san[++tot]=Q[i].w;
}
sort(san+1,san+1+tot);
tot=unique(san+1,san+1+tot)-san-1;
san[++tot]=999999999999999999;
for(int i=1;i<=n;++i)
{ int pos=lower_bound(san+1,san+1+tot,w[i])-san;
vvv=0;
tree.ins(1,1,tot,pos,1);
}
vvv=1;
for(int i=1;i<=q;++i)
{ if(Q[i].opt==1)
{ if(Q[i].s>=Q[i].k){puts("0");continue;}
work(Q[i].s,Q[i].k);
}
if(Q[i].opt==2)
{ vvv=0;
int pos=lower_bound(san+1,san+1+tot,Q[i].w)-san;
tree.ins(1,1,tot,pos,1);st.insert(Q[i].w);
vvv=1;
}
if(Q[i].opt==3)
{ vvv=0;
int pos=lower_bound(san+1,san+1+tot,Q[i].w)-san;
tree.ins(1,1,tot,pos,-1);st.erase(st.find(Q[i].w));
vvv=1;
}
}
}
T3 黑客
我竟然错过了一道水题,难受。。。。。
暴力循环做除法。。复杂度 $O(999^2)$ 。不算gcd。
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
using namespace std;
int a,b,c,d,ans,maxn;
signed main()
{ freopen("hacker.in","r",stdin);
freopen("hacker.out","w",stdout);
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
for(int i=2;i<=999;++i)
{ for(int j=1;j<i;++j)
{ int base1=j,base2=i-j;
if(__gcd(base1,base2)!=1)continue;
int a1=a/base1+(a%base1!=0),b1=b/base1;
int a2=c/base2+(c%base2!=0),b2=d/base2;
int l=max(a1,a2),r=min(b1,b2);
if(l>r)continue;
ans=(ans+i*(r-l+1)%mod)%mod;
}
}
printf("%lld\n",ans);
}
T4 黑客
这是续集,一眼数位 dp,然后开冲,冲完了一发过小样例,爽!
然后打开大样例,测了一下跑的贼 jb 快,信心倍增,然后查看输出结果,。。。。。。。。。
WOC,md 高精,不是 mod 1e9+7 吗???!!!
然后经历了极其漫长的调试过程。。最后 tmd 0 0 没 jb 输出掉了十分!!
#include<bits/stdc++.h>
using namespace std;
pair<int,int>dp[502][1<<9];
int n,m,k,sta[11],tot=1;
bool f[502][1<<9];
int gao[131002+10][978];
long long work[978];
inline void add(int i1,int i2)
{ for(int i=1;i<=gao[i2][0];++i)gao[i1][i]+=gao[i2][i];
gao[i1][0]=max(gao[i1][0],gao[i2][0]);
for(int i=1;i<=gao[i1][0];++i)
{ if(gao[i1][i]>=10)
{ if(i==gao[i1][0])++gao[i1][0];
gao[i1][i+1]+=gao[i1][i]/10;
gao[i1][i]%=10;
}
}
}
inline void add1(int i1)
{ for(int i=1;i<=work[0];++i)gao[i1][i]+=work[i];
gao[i1][0]=max(1ll*gao[i1][0],work[0]);
for(int i=1;i<=gao[i1][0];++i)
{ if(gao[i1][i]>=10)
{ if(i==gao[i1][0])++gao[i1][0];
gao[i1][i+1]+=gao[i1][i]/10;
gao[i1][i]%=10;
}
}
}
inline void www(int zhi)
{ int tt=work[0];
for(int i=1;i<=tt;++i)
work[i]*=zhi;
for(int i=1;i<=work[0];++i)
if(work[i]>=10)
{ if(work[0]==i)++work[0];
work[i+1]+=work[i]/10;
work[i]%=10;
}
}
inline void caonima(int i1,int base)
{ memset(work,0,sizeof(work));
for(int i=0;i<=gao[i1][0];++i)work[i]=gao[i1][i];
if(base)for(int i=work[0];i;--i)work[i+base]=work[i],work[i]=0;
work[0]+=base;
}
inline pair<int,int>dfs(int x,int lim)
{ if(f[x][lim])return dp[x][lim];
f[x][lim]=1;
int tmp1=++tot,tmp2=++tot;
if(x==n+1) return dp[x][lim]=make_pair(1,0);
for(int i=1;i<=k;++i)
if(!(lim&(1<<i-1)))
{ pair<int,int>tmp=dfs(x+1,lim|sta[i]);
add(tmp1,tmp.first);
add(tmp2,tmp.second);
caonima(tmp.first,n-x);
www(i);
add1(tmp2);
}
return dp[x][lim]=make_pair(tmp1,tmp2);
}
signed main()
{ freopen("hacker2.in","r",stdin);
freopen("hacker2.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;++i)
{ int a,b;
scanf("%d%d",&a,&b);
sta[a]|=(1<<b-1);
}
gao[1][0]=1;gao[1][1]=1;
pair<int,int>ans=dfs(1,0);
int id1=ans.first,id2=ans.second;
if(!gao[id1][0])
{ cout<<0<<endl<<0<<endl;
return 0;
}
for(int i=gao[id1][0];i;--i)cout<<gao[id1][i];cout<<endl;
for(int i=gao[id2][0];i;--i)cout<<gao[id2][i];cout<<endl;
}
NOIP 模拟 六十九的更多相关文章
- NOIP 模拟 六十八
咕了十几场了,还是写一写吧.. T1 玩水 发现满足三个人路径不同必须要有2个及以上的斜线相同结构,需要注意如果同一行或者同一列的话必须要相邻才行. #include<bits/stdc++.h ...
- 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能
第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...
- “全栈2019”Java第六十九章:内部类访问外部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)
1.简介 在实际测试中,我们不仅需要读取Excle,而且有时候还需要读取CSV类的文件.如何去读取CSV的文件,宏哥今天就讲解和分享一下,希望对你能够有所帮助.前面介绍了如何读取excel文件,本篇介 ...
- FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码
之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...
- C#编程(六十九)----------DLR简介
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- NOIP 模拟 八十五
T1 冲刺NOIP2021模拟18 莓良心 容易发现答案和每一个 \(w_i\) 无关,我们只需要求出总和然后计算方案数. 对于每一个数贡献的方案数是相同的,首先是自己的部分就是\(\begin{Bm ...
- 第六十九篇、OC_录制语音和播放语音功能的实现
录制: 1.设置全局属性 NSURL *recordedFile;//存放路径 AVAudioPlayer *player;//播放 AVAudioRecorder *recorder;//录制 NS ...
随机推荐
- 【转】Linux tar命令详解
参考:https://blog.csdn.net/kkw1992/article/details/80000653 linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包 ...
- 阿里云服务器部署mongodb
在阿里云上买了个服务器,部署mongodb遇到一些坑,解决办法也是从网上搜集而来,把零零碎碎的整理记录一下. 服务器是:Alibaba Cloud Linux 下载安装 mongodb官网下载实在是太 ...
- QT学习日记篇-02-QT信号和槽
课程大纲: <1>给控件改名字 随着UI界面的控件变多,如果使用系统自带的名称,后期会让人不明觉厉,说白了,就是掌握C++的命名规则:易懂,条例清晰,人性化 方法:直接点击控件,进入右侧对 ...
- 在同一台计算机中运行多个MySQL服务
目录 一.问题的来源 二.配置 1. 修改原来MySQL系统的my.ini文件 2. 修改注册表 3. 重新启动服务 4. 最终效果 一.问题的来源 这个学期里我需要修读<数据库系统>的课 ...
- C# 实现图片上传
C# 实现图片上传 C#实现图片上传: 通过页面form表单提交数据到动作方法,动作方法实现保存图片到指定路径,并修改其文件名为时间格式 页面设置 这里使用的模板MVC自带的模板视图 <h2&g ...
- JDK方法区、元空间区别 & String.intern相关面试题
一.方法区.永久代.元空间 1.方法区.永久代 方法区也是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据.方法区域又被称为"永久代& ...
- pycharm 汉化
1.首先进入pycharm,点击file,找到setting. 2.点击 plugins 搜索Chinese,找到Chinese(simplified)Language Pack EAP,点击inst ...
- Python - 面向对象编程 - 使用 super() 的一些注意事项
super() 详解 https://www.cnblogs.com/poloyy/p/15223443.html 多继承中使用 super() class A: def test(self): pr ...
- SpringBoot-自动配置分析-图解
- DHCP的原理和配置
前言 在大型企业网络中,会有大量的主机或设备需要获取IP地址等网络参数.如果采用手工配置,工作量大且不好管理,如果有用户擅自修改网络参数,还有可能会造成 IP地址冲突等问题.使用动态主机配置协议DHC ...