首页 > 其他分享 >【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I

【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I

时间:2023-08-06 18:46:03浏览次数:42  
标签:MGOI 洛谷 int ll 148 vis long return define

T1

简单题,题面十分清晰,就是给我们\(n\),要求使\(2^m<n\)成立的最小偶数\(m\)。(要注意\(log_2N=m,m|2\)的情况)

#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
const int N=800, INF=0x3f3f3f3f;
ll n; 
int main(){
	cin>>n;
	ll k=log(n)/log(2);
	if(k%2!=0)k=k-1;
	else if(pow(2,k)==n)k=k-2;
	cout<<k<<endl;
	return 0;
}

T2

有一点意思,很明显的模拟题,但是一定要细致。比如,第一次,我认为只需对于每一个客人,将他所想要的幕布和当前幕布放到函数判断即可(错误):

int f(char k,char want){
	if(k==want)return 0;
	if(k=='W'){
		if(want=='B')return 1;
		else return 2;
	}else if(k=='B'){
		if(want=='W')return 1;
		else return 1;
	}else if(k=='R'){
		if(want=='W')return 1;
		else return 1;
	}
}

但是,其实每一步操作,都存在所想要的幕布是否已经上升这一问题,上升与否是必须考虑的。稍加思索,发现可以将每一个幕布设成bool数组,为一则已经下降,为零则仍为上升。将目标幕布前的幕布值相加,在加上自身取反操作后的值(以为下降为一,而这时无需操作。为零时,反而需要操作)。

#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
const int N=800, INF=0x3f3f3f3f;
int n;
bool f['Z'];//1 down;0 up
int ans=0;
int main(){
	cin>>n;
	f['R']=f['B']=f['W']=1;
	for(int i=1;i<=n;i++){
		char x;cin>>x;
		if(x=='W'){
			ans+=(!f['W']);
			f['W']=1;
		}
		if(x=='B'){
			ans+=f['W']+(!f['B']);
			f['W']=0;
			f['B']=1;
		}
		if(x=='R'){
			ans+=f['W']+f['B']+(!f['R']);
			f['W']=f['B']=0;
			f['R']=1;
		}
	}
	cout<<ans<<endl;
	return 0;
}

T3

一道图论题。不知道正解是什么(悲。想法为:正着模拟有点困难,因为无法确定当初的魔力值和生命,所以果断反向搜索。注意到求的是最小值,自然想到最短路。我们将每条边的权值变为走这条路的生命消耗值,然后跑一遍dijkstra即可。赛时,遇到若干问题:

  1. 我在build函数中已经改变了\(i.w\)的值,但是到dij函数就又回到原来的了(后来新建数组存储了)
  2. 内存爆炸,只能跑部分的\(n\)。

后,注意到Sub3的特殊,解决。
30Pts代码:

#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
const int N=2000+5, INF=0x3f3f3f3f;
ll n,m,s,t;
bool vis[N];
bool vis_edge[N][N];
struct node{
	ll v,w;
};
ll magic[N];
vector<node> G[N];
ll a[N][N];
void build(){
	queue<ll> Q;
	Q.push(t);
	magic[t]=1;
	while(Q.size()){
		ll x=Q.front();Q.pop();
		for(auto i:G[x]){
			if(!vis_edge[i.v][x]&&!vis_edge[x][i.v]){
				vis_edge[i.v][x]=1;
				vis_edge[x][i.v]=1;
				//cout<<x<<" To "<<i.v<<" from "<<i.w<<" to ";
				i.w=i.w/magic[x];
				a[i.v][x]=a[x][i.v]=i.w;
				//cout<<i.w<<endl;
				magic[i.v]=magic[x]+1;
				Q.push(i.v);
			}
		}
	}
}

struct Heapnode{
	ll v,dis;
	bool operator>(const Heapnode& a)const{return dis>a.dis;}
};
priority_queue<Heapnode,vector<Heapnode>,greater<Heapnode> > Q;
ll d[N];
void dij(ll nd){
	memset(vis,0,sizeof(vis));
	memset(d,INF,sizeof(d));
	Q.push({nd,0});
	d[nd]=0;
	while(Q.size()){
		ll u=Q.top().v;Q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(auto i:G[u]){
			ll x=i.v,y=a[u][x];
			if(!vis[x]&&d[u]+y<d[x]){
				d[x]=d[u]+y;
				Q.push({x,d[x]});
			}
		}
	}
}
int main(){
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++){
		ll x,y,z;cin>>x>>y>>z;
		G[x].push_back({y,z});
		G[y].push_back({x,z});
	}
	if(n<=2000){
		build();
		/*for(int i=1;i<=n;i++){
			cout<<"第"<<i<<"个点:"<<endl;
			for(int j=1;j<=n;j++){
				cout<<"To "<<j<<" is "<<a[i][j]<<endl;
			}
		}*/
		dij(t);
		cout<<d[s]<<endl;
	}else{
		bool f=0;
		for(auto i:G[t])if(i.w==0){
			f=1;break;
		}
		if(f)cout<<0;
		else cout<<1;
	}
	return 0;
}

正解有人说DP。但是如果用bfs或者dij都需要考虑某点重复走路用生命值换取魔力值,从而走到更远的地方的情况。很明显,我没有考虑,很明显,不会了(等题解。

T4

题目清晰,不绕。Sub1明显是纯暴力分,用01来储存各个结点状态,然后模拟。中间剪了一些枝,但是无济于事。暴力分拿下,后面不会。

#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
const int N=100+5, INF=0x3f3f3f3f;
int n,k;
int a[N];
bool zt[N];//1 激活;2 未激活 
/*bool pd(){
	int t=0;
	for(int i=1;i<=n;i++)if(zt[i])t++;
	return t>=k;
}*/
int minn=INF;
int Maxn(int x){
	bool fleft=0,fright=0;
	int m,dis,m2,dis2;
	
	for(int i=x;i>=1;i--){
		if(zt[i]){
			fleft=1;m=a[i];dis=x-i;break;
		}
	}
	if(!fleft){
		for(int i=n;i>=x;i--){
			if(zt[i]){
				m=a[i];dis=x+n-i;break;
			}
		}
	}
	
	for(int i=x;i<=n;i++){
		if(zt[i]){
			fright=1;m2=a[i];dis2=i-x;break;
		}
	}
	if(!fright){
		for(int i=1;i<=x;i++){
			if(zt[i]){
				m2=a[i];dis2=n-x+i;break;
			}
		}
	}
	
	if(m>m2)return m*dis;
	else return m2*dis2;
}
void f(int dep,int num1){
	if(num1+n-dep+1<k)return;
	if(dep>n){
		if(num1>=k){
			int ans=0;
			for(int i=1;i<=n;i++){
				if(zt[i])ans+=a[i]*a[i];
				else ans+=Maxn(i);
			}
			minn=min(minn,ans);
		}
		return ;
	}
	for(int i=0;i<=1;i++){
		zt[dep]=i;
		if(i==1)f(dep+1,num1+1);
		else f(dep+1,num1);
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	f(1,0);
	cout<<minn<<endl;
	return 0;
}

用时方面:
T1:6.82min
T2:34.67min
T3:2.37h
T4:2.98h
总分:100+100+30+13=243
rk:348
传送门

标签:MGOI,洛谷,int,ll,148,vis,long,return,define
From: https://www.cnblogs.com/FaceLuck/p/17609724.html

相关文章

  • 【反思】洛谷8月月赛 Div.2 & RiOI Round 2 赛后反思
    RiOIR2赛后反思赛时开了一个T1,但是\(0pts\),然后就跑去跟人对线然后复盘(主要是我的锅,我忘记对线怎么开始的了)到了吃饭(雾不过本来我也不会做,不能怪人家赛后是shenshen教我T1+看的若归老师的反思捏推歌:歌爱ユキ&稲葉曇《キミに回帰缐》(希望没打错是我的错吗铅笔......
  • 2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2
    2023年多校联训NOIP层测试4爆零了T1幸运数字\(0pts\)T2密码\(0pts\)没做到,咕了。T3小X和他的朋友们\(0pts\)没做到,咕了。T4树上询问\(0pts\)没做到,咕了。【LGR-150-Div.2】洛谷8月月赛I&RiOIRound2T1luoguP9496「RiOI-2」hacker\(100pts\)......
  • 【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
    比赛实况赛前看了眼难度分布,红橙黄绿,感觉随便杀(爆我)顺序开题,先看A题,没仔细读,一眼以为单次操作只能翻转一位,写了个十进制转二进制找不同,结果WA了。再看了一眼题,发现题干定义的操作可以一次操作很多位,然后一个操作是把0变1,另一个是把1变0。所以只需要看两个数二进制对......
  • 【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
    T1一直没有详细看过位运算的我瑟瑟发抖。出题人给了帮助(有用但是不多)。直接讲考试想法:首先,手玩样例后,果断猜测:将两个数转化为二进制之后,把头对齐,然后找出不同位,再加上二者位数之差。结果:\(0Pts\)之后,又想了很久,发现了按位与等价于将原来二进制数中的1变为0,按位或等价于将原来......
  • LGR-147-Div.3】洛谷网校 7 月普及组月赛 & yLOI2022 总结
    Upd:2023/8/5补T1普及组的题,而且T1,而且叫签到题。所以非常简单,入门难度。没什么好说的。就是统计大写,小写和字母个数。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=100+5;strings;intmain(){ cin>>s; intx=0,y=0,z=0; for(inti=......
  • 洛谷 P1553 数字反转(升级版)
    题目描述给定一个数,请将该数各个位上数字反转得到一个新数。整数反转是将所有数位对调。小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。百分数的分子一定是整数,百分数只改变数字......
  • 洛谷 P7911 [CSP-J 2021] 网络连接 题解
    写在前面一道普及级别的题目。CSP-J全国统一命题2021年第三题。本题解来自于一位真正的大佬。传送门https://www.luogu.com.cn/blog/xyf007/solution-p7911。题面信息来源于洛谷。请访问https://www.luogu.com.cn/problem/P7911。声明:本题解非商业用途,一切侵权行为请联系作......
  • 洛谷 U321190 麻将 加强加强版 题解
    Description给定一副\(k\)张牌的麻将牌,求能「听」哪些牌。对于所有数据,\(1\leqk\leq2\times10^5\)。link:https://www.luogu.com.cn/problem/U321190Solution算法零枚举「听」的牌,用状压DP或者贪心判断。时间复杂度\(\mathcal{O}(2^n\text{poly}(n))\)或\(\mathca......
  • 洛谷-P9485 题解
    写在前面:这是蒟蒻交的第一篇绿题题解(大祭),因为线性做法比较难想,本篇会着重讲述用RMQ问题求解,并尽可能用清晰明了的图片和简易的文字讲明白。正文最坏时间复杂度:\(\mathcal{O}(\sumn+\log\sumn)\)在求解之前,先让我们想个问题,如何求解积水格数?再简单点,对于每个\(i\),其积水......
  • 洛谷 P9489 ZHY 的表示法 题解
    Description给定\(\{x_n\}\),\(y\)为任意实数,求出在\([l,r]\)内\(\displaystyle\sum_{i=1}^{n}\lfloor\dfrac{y}{x_i}\rfloor\)有多少种取值。link:https://www.luogu.com.cn/problem/P9489Solution可以表示出的取值一定能被为某个\(x_i\)的倍数的\(y\)表示出。根据......