noip模拟10

news/2024/11/13 23:18:49/文章来源:https://www.cnblogs.com/ccjjxx/p/18540710

发现是前几天早上那场 MX(美熙) 的模拟赛,但是没做。

A 王国边缘

其实知道是倍增题。但是想不出来怎么个倍增法。

于是用分块打上了部分分 \(70\) 分。

我们用倍增设 \(f_{i,j}\) 表示从 \(i\) 开始移动 \(2^j\) 次之后到达的下标的相对位置,\(g_{i,j}\) 表示从 \(i\) 开始移动 \(2^j\) 次后到达的位置之前的完整周期个数。

\[\begin{cases} f_{i,j}=f_{f_{i,j-1},j-1} \\ g_{i,j}=g_{i,j-1}+g_{f_{i,j-1},j-1} \end{cases} \]

然后对询问二进制拆分即可。

当然也可以把循环周期当作一个个有向边,在基环树上跑倍增。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
const int mod=1e9+7;
int n,q,m,s[N],t[60][N],t2[60][N];
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0),cout.tie(0);cin>>n>>m>>q;int l=-m;for(int i=0;i<n;i++){char c;cin>>c;if(c=='1') s[i]=i,l=i;else s[i]=l;}if(l!=-m){for(int i=0;i<n&&s[i]==-m;i++)s[i]=l-n;}for(int i=0;i<n;i++){int k=(i+m)%n;t[0][i]=max(i+m-k+s[k],i+1);t2[0][i]=t[0][i]%n;t[0][i]%=mod;}
//	cout<<"sss\n";for(int i=1;i<60;i++){for(int j=0;j<n;j++){int k=t2[i-1][j];t2[i][j]=t2[i-1][k];t[i][j]=(t[i-1][k]-k+t[i-1][j])%mod;}}while(q--){int s,k,s2;cin>>s>>k;s--;s2=s%n;for(int i=0;k;k>>=1,i++){if(k&1){s=(t[i][s2]+s-s2)%mod;s2=t2[i][s2];}}cout<<(s+1)%mod<<"\n";}}

B 买东西题

知道是贪心,但是不知道怎么贪。。。

考场上想到了维护每个数的价差 \(c_i=a_i-b_i\),并且知道对于一个所有可用的优惠券集合,匹配最优的一定是价差最大的与优惠券减价最多的。

但是没想到可以看作每个数的价差也应该视作一张优惠券(其实猜到了,没敢想),一起维护在优惠券集合内,当你现在要反悔,第 \(i\) 个点要拿走第 \(j\) 个点的优惠券,那么他应该交换而不是直接拿。就是把 \(i\) 的价差维护进优惠券集合,拿走 \(j\) 的优惠券,就好了。

为了保证优惠券一定可用,就需要把优惠券和商品分别按 \(a\) 升序排列,依次将前缀的优惠券加入优先队列中维护。

和正解就差一行代码!!!

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
const int N=1e6+5;
struct node1{int a,b;inline bool operator<(const node1 &ll) const{if(ll.b==b) return ll.a>a;return ll.b>b;}
}c[N];
struct node{int a,b,c;inline bool operator<(const node &ll) const{if(ll.c==c) return ll.a>a;if(ll.a==a) return ll.b>b;return ll.c<c;}
}e[N];inline bool cmp(node a,node b)
{
//	if(a.a==b.a) return a.b>b.b;
//	return min(a.a,b.a)>min(a.b,b.b);if(a.a==b.a) return a.b>b.b;return a.a<b.a;
}
inline bool cmp1(node1 a,node1 b)//实际上这几个是一样的,只是在不同的部分分和结构体内。
{if(a.a==b.a) return a.b>b.b;return a.a<b.a;
}
inline bool cmp2(node a,node b)
{
//	if(a.a==b.a) return a.b>b.b;
//	return min(a.a,b.a)>min(a.b,b.b);if(a.a==b.a) return a.b<b.b;return a.a<b.a;
}
inline bool cmp3(node1 a,node1 b)
{if(a.a==b.a) return a.b<b.b;return a.a<b.a;
}
priority_queue<node1>q;
priority_queue<node>q1;//实际上没有用到它signed main()
{
//	freopen("buy5.in","r",stdin);freopen("buy.in","r",stdin);freopen("buy.out","w",stdout);ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;bool _=1;for(int i=1;i<=n;i++) cin>>e[i].a>>e[i].b,e[i].c=(e[i].a-e[i].b),_&=(e[i].a==e[i].b);for(int i=1;i<=m;i++) cin>>c[i].a>>c[i].b;if(_||n<=10){sort(e+1,e+1+n,cmp);sort(c+1,c+1+m,cmp1);int ans=0,cnt=0;for(int i=1,j=1;i<=n;i++){while(c[j].a<=e[i].a&&j<=m)q.push(c[j++]);//		cout<<j<<" ";if(!q.empty()&&e[i].a-q.top().b<e[i].b) ans+=e[i].a-q.top().b,q.pop(),++cnt;else ans+=e[i].b;//		cout<<"c: "<<c[i].a<<" "<<c[i].b<<"\n";
//			cout<<"e: "<<e[i].a<<" "<<e[i].b<<"\n";
//			cout<<ans<<"\n";}cout<<ans;return 0;}sort(e+1,e+1+n,cmp2);sort(c+1,c+1+m,cmp3);int ans=0,cnt=0,j=1;for(int i=1;i<=n;i++){while(j<=m&&c[j].a<=e[i].a) q.push(c[j++]);if(q.empty()||e[i].c>q.top().b) ans+=e[i].b;else ans+=e[i].a-q.top().b,q.pop(),q.push({1,e[i].a-e[i].b});//就是这个 push 没写出来}
//	for(int i=1;i<=n;i++) q1.push(e[i]);
//	for(int i=1;i<=m;i++) q.push(c[i]);
//	while(!q1.empty())
//	{
//		if(q.top().b<q1.top().c) ans+=q1.top().b,q1.pop();
//		else ans+=q1.top().a-q.top().b,q.pop(),q1.pop();
//	}cout<<ans;//其他的都是奇奇怪怪的假做法和部分分。
//	for(int i=1;i<=n;i++) cout<<"q "<<q1.top().a<<" "<<q1.top().b<<"\n",q1.pop();
//	return 0;
//	for(int i=1;i<=m;i++)
//	{
//		while(c[i].a<=e[j].a&&j<=n)q1.push(e[j++]);
////		cout<<i<<" ";
////		cout<<q1.top().a<<" "<<q1.top().b<<"\n";
////		cout<<"c: "<<c[i].a<<" "<<c[i].b<<"\n";
//		q.push(c[i]);
//		if(!q1.empty()&&q1.top().c<q.top().b)ans+=q1.top().a-q.top().b,q1.pop(),++cnt,q.pop();
//		else if(!q1.empty())ans+=q1.top().b,q1.pop();
////		cout<<"ans: "<<ans<<"\n";
//	}
////	cout<<ans<<"\n";
////	cout<<j<<"\n";
//	for(int i=j;i<=n;i++) q1.push(e[i]);
//	while(!q1.empty()) ans+=q1.top().b,q1.pop();
//	cout<<ans;
}

C IMAWANOKIWA (Construction ver.)

分讨+构造。

首先,对于 ans1,有结论:

  • 当且仅当 \(a\) 全为 \(0\) 时答案为 \(0\)

  • 序列 \(a\) 没有 \(0\) 时答案为 \(2\) 的个数对 \(2\) 取模的余数+1;

  • 否则,当且仅当序列 \(a\)\(1,1,1,1...1,2,0,2,1,...1,1,1\)(其中 \(1\) 可用没有)的形式时,答案为 \(2\),否则为 \(1\)

还有结论,第一个能合并的位置移动不超过 \(3\)

那么就可以每次合并前几个,用上面的三个结论试一下答案是否会被改变,如果没有那么保留。

好像有 \(61\) 分。

tj:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
const int N=100007,op[3][3]={{0,1,1},{1,1,2},{1,2,1}};
const ull pp=13331;
int T,n,a[N],k,p,last0;
char s[N];
ull ans;
signed main()
{freopen("popc.in","r",stdin);freopen("popc.out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>T;while(T--){cin>>(s+1);n=strlen(s+1);k=a[1]=s[1]-'0',ans=0;for(int i=2;i<=n;++i)a[i]=s[i]-'0',k=op[k][a[i]];if(k<2){cout<<k<<" ";for(int i=1;i<n;++i) ans=ans*pp+1;cout<<ans<<"\n";continue;}last0=0;for(int i=n;i;--i){if(!a[i]){last0=i;break;}}if(!last0){cout<<k<<" ";for(int i=1;i<n;++i) ans=ans*pp+1;cout<<ans<<"\n";continue;}bool fl=0;for(int i=1;i<last0;++i) fl|=(bool)a[i];if(!fl){cout<<"1 ";k=a[last0+1];p=last0+1;for (int i=1;i<last0;++i) ans=ans*pp+1;while(k==a[last0+1]){ans=ans*pp+2;k=op[k][a[++p]];}for(int i=0;i<=n-p;++i)ans=ans*pp+1;cout<<ans<<'\n';continue;}k=a[1];for(int i=2;i<last0;++i){ans=ans*pp+1,k=op[k][a[i]];}int tmp=a[last0+1],p=last0+1;while(k==tmp&&p<=n){tmp=op[tmp][a[++p]];ans=ans*pp+3;}if(p<=n){ans=ans*pp+2;for(int i=0;i<=n-p;++i) ans=ans*pp+1;cout<<"1 "<<ans<<'\n';continue;}ans=0;tmp=a[last0-1];p=last0-1;while(tmp!=1&&p)tmp=op[tmp][a[--p]];if(!p){cout<<"2 ";for(int i=1;i<n;++i) ans=ans*pp+1;cout<<ans<<'\n';continue;}cout<<"1 ";k=a[1];for(int i=2;i<p;++i){k=op[k][a[i]],ans=ans*pp+1;}if(a[p]==0){if(k==1){for(int i=2;i<last0-p;++i) ans=ans*pp+3;ans=((ans*pp+2)*pp+1)*pp+2;for(int i=1;i<=n-last0;++i) ans=ans*pp+1;cout<<ans<<'\n';}else if(k==2){if(last0==p+2){ans=(ans*pp+2)*pp+2;for(int i=1;i<n-p;++i) ans=ans*pp+1;cout<<ans<<'\n';}else{ans=ans*pp+2;for(int i=1;i<last0-p;++i) ans=ans*pp+1;ans=ans*pp+2;for(int i=1;i<=n-last0;++i) ans=ans*pp+1;cout<<ans<<'\n';}}else{if(p>1) ans=ans*pp+1;if(last0==p+2){ans=(ans*pp+1)*pp+2;for(int i=1;i<=n-last0;++i) ans=ans*pp+1;cout<<ans<<'\n';}else{for(int i=2;i<last0-p;++i) ans=ans*pp+2;ans=(ans*pp+1)*pp+2;for(int i=1;i<=n-last0;++i) ans=ans*pp+1;cout<<ans<<'\n';}}}else{if(k==2){for(int i=1;i<=last0-p;++i) ans=ans*pp+2;for(int i=0;i<=n-last0;++i) ans=ans*pp+1;cout<<ans<<'\n';}else{for(int i=1;i<last0-p;++i) ans=ans*pp+2;ans=(ans*pp+1)*pp+2;for(int i=1;i<=n-last0;++i) ans=ans*pp+1;cout<<ans<<'\n';}}} return 0;
}

D 魔法少女们

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832037.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

System

System 类常见的成员方法:图1System 是一个工具类, 提供了一些与系统相关的方法. public static void exit(int status) // 终止当前运行的 Java 虚拟机status 是一个状态码, 有两种情况, 第一种情况是等于 0, 表示当前虚拟机是正常停止的. 第二种情况是非零, 一般是写 1, 表示…

Java中的 Exception 和 Error 有什么区别

Java中的 Exception 和 Error 有什么区别Exception 和 Error 都是 Throwable 类的子类(在Java代码中只有继承了 Throwable 类的实例才可以被 throw 或者被 catch)它们表示在程序运行时发生的异常或错误情况。 总结来看: Exception 表示可以被处理的程序异常,Error 表示系统…

数据采集与融合技术实验课程作业三

数据采集与融合技术实验课程作业三作业所属课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13287gitee码云代码位置 https://gitee.com/wang-qi…

HTTPS ppt素材

本来的主题是介绍一下我之前做的搜索与推荐的业务,但9月份开始我主要开始承担一些医那块的业务测试,就想做点别的分享,但换成医的业务介绍,想了想我目前对医的了解程度,实在没勇气拿出来分享,所以就换了这个主题。 这个主题其实也是早有预谋,一个初衷是想对某一个通用性…

jvm 堆内存

堆、方法区、直接内存,多个线程之间是共享的。 ------------ 堆内存是会溢出的。 堆内存默认最大是7G

CdnCheck工具

前言:CdnCheck工具实现,记录下我这边实现的几个点 参考文章:https://github.com/projectdiscovery/cdncheck 参考文章:https://github.com/YouChenJun/CheckCdn 参考文章:https://github.com/zu1k/nali 参考文章:https://github.com/u9sky/cdn-cname-domain/blob/main/cd…

考研打卡(14)

开局(14) 开始时间 2024-11-11 20:21:43 结束时间 2024-11-11 22:00:55今天考研数学的资料到了数据结构设一组初始记录关键字序列为(50,40,95,20,15,70,60,45), 则以增量d=4的一趟希尔排序结束后前4条记录关键字为_____(中国地质大学2017年) A 40,50,20,95 B 15,40,6…

说明与笔记导航(咕咕咕)

对使用这些笔记的同学想说的话,以及更新进度。为什么写这么多B东西? 其一呢是帮助我自己,边写笔记边梳理知识;其二呢是帮助各位义父义母考试成功。 更新进度与内容说明 11.11:本周工作日需突击学习python,有限体积N-S方程推导已写完。 目前进度:3009 建模:数值方法写完…

运用Windows API进行编程

目录运用Windows API进行编程实验环境窗口创建基本流程基本代码流程1、头文件和库2、全局变量和函数3、入口主函数4、注册窗口类函数5、创建和显示窗口函数6、窗口过程函数运行结果实验小结 运用Windows API进行编程 运行Windows应用程序在桌面显示Windows窗口。窗口内背景色为…

Windows API窗口绘图程序设计

目录Windows API窗口绘图程序设计1、窗口过程函数2、WM_LBUTTONDOWN:处理鼠标左键按下的消息鼠标消息相关知识点基本鼠标消息双击消息附带信息滚轮消息附带信息:3、WM_PAINT:处理窗口重绘的消息窗口绘图相关知识点窗口绘图基本流程开始绘画绘制封闭图形(能使用画刷填充的图形…

Matlab常用的图像属性

线型、标记和颜色 线型、标记和颜色,指定为包含符号的字符串或字符向量。符号可以按任意顺序显示。不需要同时指定所有三个特征(线型、标记和颜色)。例如,如果忽略线型,只指定标记,则绘图只显示标记,不显示线条。以下是 MATLAB 在许多类型的绘图中使用的默认颜色的 RGB …

jvm Java虚拟机栈——栈内存溢出

----------- ---------------------- -----------------