首页 > 其他分享 >NOI 2023 春季测试

NOI 2023 春季测试

时间:2024-08-23 16:20:05浏览次数:5  
标签:pre qur NOI int ll 春季 maxn 2023 dis

前言

小弱鸡在暑假时候闲的没事尝试打打NOI春季,总分是255分……(有点特殊的含义)

正文

T1:[春季测试 2023] 涂色游戏

非常简单的一道普及题,针对每个操作记录行和列上最近的更新。

在输出的时候查询一下即可。

#include<bits/stdc++.h>
using namespace std;

int T;
int n,m,q;
struct opt{
	int loc, tim;
}qur_1[100005], qur_2[100005];
int main()
{
//	freopen("paint2.in","r",stdin);
//	freopen("paint.out","w",stdout);
	cin>>T;
	while(T){
		T--;
		memset(qur_1,0,sizeof qur_1);
		memset(qur_2,0,sizeof qur_2);
		cin>>n>>m>>q;
		for(int i=1;i<=q;i++){
			int op, lo, col;
			cin>>op>>lo>>col;
			if(op == 0){
				qur_1[lo].loc=col;
				qur_1[lo].tim=i;
			}else{
				qur_2[lo].loc=col;
				qur_2[lo].tim=i;
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				int color;
				if(qur_1[i].tim > qur_2[j].tim){
					color=qur_1[i].loc;
				}else{
					color=qur_2[j].loc;
				}
				if(j!=m) cout<<color<<' ';
				else cout<<color;
			}
			cout<<endl;
		}
	}



	return 0;
}

T2: [春季测试 2023] 幂次

这道题有一点考数论了。

针对1e12以下的数据,我们还可以以接近\(O(\sqrt n)\)的复杂度进行枚举。

但是对于1e18的数据规模,在\(k = 3\)时还可以勉强过关,但\(k = 2\)时就会GG。

所以要先计算\(k = 2\)时的情况为至少\(\sqrt n\),然后再特判\(k = 3\)的情况会不会增加新数。

对于新数的条件,是底数不为完全平方数,且指数为奇数,然后这个数还没有出现过,可以用set来去重。

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
ll n;
int k;
ll ans;
ll f[100000005];
set<ll> tmp;
map<ll,ll> atp;
ll pre[10000005];
int main()
{
//	freopen("power4.in","r",stdin);
//cout<<pow(99, (double)1.0/6.0);
	cin>>n>>k;
	if(k==1){
		cout<<n<<endl;
		return 0;
	}else if(n<=1e6){

		for(int i=1;pow(i,k)<=n;i++){
			if(i==1) f[1]=1;
			else{
				int cnt=k;
				while(1){
					int hk=pow(i,cnt);
					if(hk>n) break;
					if(hk<=n){
						f[hk]=1;
					}
					cnt++;
				}
			}
		}
		for(int i=1;i<=n;i++){
			if(f[i]){
				ans++;
			}
		}
		cout<<ans;
	}else if(k >= 3){
		for(ll i=1;pow(i,k)<=n;i++){
			if(i==1){
				tmp.insert(1);
			}else{
				for(int j=k;pow(i,j)<=n;j++){
					tmp.insert(pow(i,j));
				}
			}
		}
		cout<<tmp.size()<<endl;
	}else if(k == 2){
		ll ans = sqrtl(n);
		k=3;
		for(int i=1;i<=1000;i++){
			pre[i*i]=1;
		}
		for(ll i=2;pow(i,k)<=n;i++){
			if(tmp.find(i) != tmp.end() || pre[i]) continue;
			for(ll j=k;pow(i,j)<=n;j++){
				if(tmp.find(pow(i,j)) == tmp.end() && j%2 == 1) ans++;
				tmp.insert(pow(i,j));
			}
		}
		cout<<ans<<endl;
	}
	



	return 0;
}

T3: [春季测试 2023] 圣诞树

区间DP,判断从序列的左侧还是右侧添加线段。

注意输入数据保证凸多边形,但是要求是从最高点开始输出,所以开始时要旋转一下,确定最后一个点为起始点。

最后还要判断一下,起始点的位置。

\[f[l][r][0] = \min(f[l+1][r][0] + dis(l,l+1), f[l+1][r][1] + dis(l,r)) \]

\[f[l][r][1] = \min(f[l][r-1][0] + dis(l,r), f[l+1][r][1] + dis(r-1,r)) \]

#include <bits/stdc++.h>
using namespace std;

const int maxn=1005;
struct node{double x,y;int id;}a[maxn],tmp[maxn];
double f[maxn][maxn][2];
int pre[maxn][maxn][2];

double dis(int i,int j){return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}

void print(int l,int r,int op)//二分输出
{
    if(l==r) return cout<<a[l].id<<' ',void();
    if(op) cout<<a[r].id<<' ',print(l,r-1,pre[l][r][op]);
    else cout<<a[l].id<<' ',print(l+1,r,pre[l][r][op]);
}

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y,a[i].id=i,tmp[i]=a[i];
    int k=1;
    for(int i=2;i<=n;i++) if(a[i].y>a[k].y) k=i;
    for(int i=1;i<=k;i++) a[i+n-k]=tmp[i];
    for(int i=k+1;i<=n;i++) a[i-k]=tmp[i];//题目保证形成凸多边形,所以要旋转
//	swap(a[n],a[k]);
    for(int len=2;len<n;len++)//区间DP,从段长开始
        for(int i=1,j=len;j<n;i++,j++)//左右端点
        {
            f[i][j][0]=f[i][j][1]=1e18;//初始化
            if(f[i][j][0]>f[i+1][j][0]+dis(i,i+1)) f[i][j][0]=f[i+1][j][0]+dis(i,i+1),pre[i][j][0]=0;//四种情况
            if(f[i][j][0]>f[i+1][j][1]+dis(i,j)) f[i][j][0]=f[i+1][j][1]+dis(i,j),pre[i][j][0]=1;
            if(f[i][j][1]>f[i][j-1][0]+dis(j,i)) f[i][j][1]=f[i][j-1][0]+dis(i,j),pre[i][j][1]=0;
            if(f[i][j][1]>f[i][j-1][1]+dis(j,j-1)) f[i][j][1]=f[i][j-1][1]+dis(j,j-1),pre[i][j][1]=1;
        }
    cout<<a[n].id<<' ';//最高点
    if(f[1][n-1][0]+dis(1,n)>f[1][n-1][1]+dis(n-1,n)) print(1,n-1,1);//最后是右还是左,经过所有顶点恰好一次
    else print(1,n-1,0);
    return 0;
}

标签:pre,qur,NOI,int,ll,春季,maxn,2023,dis
From: https://www.cnblogs.com/sszxlcy/p/18376251

相关文章

  • [2027届]NOIP2024模拟赛#4
    比赛链接先看榜:倒数呜呜呜。T1最简单的一道题,但是我在看到T2以后就先鸽了,然后就一直鸽了……简单来想,每次询问只会改变两个数字,所以与处理之后直接和最后的数字一一对应后就可以做到正确的复杂度。T2就是这道题,卡了我3H……一开始看到的时候直接思路明确。但是规律找的......
  • 2023.8.23 近期练习
    CF1677E本题转化之后就是矩阵覆盖,矩阵查询被覆盖的点数。现在将讲解线段树如何实现这个。扫描线的话将转化为求区间为\(0\)个数的历史和,历史和是很难的。注意到我们每次把当前序列加入历史和去也就是把区间为\(0\)的位置加\(1\)。所以我的想法是在线段树节点上加一个标记......
  • 【题解】Solution Set - NOIP2024集训Day14 CDQ分治
    【题解】SolutionSet-NOIP2024集训Day14CDQ分治https://www.becoder.com.cn/contest/5482「CF364E」EmptyRectangles*3000摆烂了。「SDOI2011」拦截导弹CDQ的例题,之前做过(现在试图自己再做出来。第二问只用在第一问里面记录每一次是从哪个\(j\)​转移过来的,以及......
  • P9145 [THUPC 2023 初赛] 世界杯
    [题目通道]([THUPC2023初赛]世界杯-洛谷)简要题意:输出五常中的最强球队。众所周知,每个国家的球队都有自己的长处,在不同规则下最强球队也有所不同。而小M制定的规则是输球场数最少,这是有道理的,因为输球场数可以评判一个球队的稳定性。输球场数越少,就说明稳定性越强,实力......
  • YC327B [ 20240821 CQYC NOIP 模拟赛 T2 ] 括号串(bracket)
    题意给定\(S\in\{(,),?\}\)。定义深度为括号嵌套的子序列的最大长度除以\(2\)。求出将\(?\)替换为括号的所有括号串的深度之和,对\(998244353\)取模。\(n\le10^6\)。Sol考虑如何把每次贡献只计算一次。不难想到在括号的中心点计算。可以发现,若当前左右括号......
  • 【专题】2023-2024中国游戏企业研发竞争力报告合集PDF分享(附原数据表)
    原文链接: https://tecdat.cn/?p=37447 在当今的数字时代,游戏产业已然成为经济与文化领域中一股不可忽视的重要力量。2023年,中国自研游戏市场更是呈现出一片繁荣且复杂的景象,实际销售收入达到了令人瞩目的2563.8亿元,同比增长15.3%,不仅刷新历史纪录,还彰显出其强大的市场活力......
  • 信息学奥赛初赛天天练-72-NOIP2016普及组-基础题3-无向图、简单无向图、自环、平行边
    NOIP2016普及组基础题35以下不是存储设备的是()A光盘B磁盘C固态硬盘D鼠标6如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照CapsLock、字母键A、字母键S、字母键D、字母键F的顺序循环按键,即CapsLock、A、S、D、F、CapsLock、A、S、D、F......
  • NOI2022 众数
    经典题目,对于绝对众数只需要考虑这一个序列的中位数在序列中出现次数是否大于一半即可。这道题用线段树合并维护一下就做完了。点击查看代码#include<bits/stdc++.h>#definefirfirst#definesecsecond#defineintlonglong#definemkp(a,b)make_pair(a,b)usingname......
  • java版本12计算2000年1月到2023年6月相差几年
     JDK12版本importjava.time.YearMonth;importjava.time.temporal.ChronoUnit;publicclassYearsBetweenDates{publicstaticvoidmain(String[]args){YearMonthstartYearMonth=YearMonth.of(2000,1);YearMonthendYearMonth=YearMon......
  • 洛谷P1540 [NOIP2010 提高组] 机器翻译答案
    #include<bits/stdc++.h>usingnamespacestd;/*数据结构:队列queue 桶:标记某个单词是否出现在内存中 t[i]=false:不在t[i]=true:在对于读入的每个单词x: 如果不存在单词x 存储(入队) t[x]=true 内存中元素个数(q.size())>M: t[q.front()]=falses; ......