【超好懂的比赛题解】第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)_icpc国际大学生程序设计竞赛题目-程序员宅基地

技术标签: 算法  深度优先  c++  练习记录  图论  数学  ACM竞赛  ACM  


title : 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)
date : 2022-5-30
tags : ACM,题解,练习记录
author : Linno


第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)

题目链接:https://ac.nowcoder.com/acm/contest/10662

补题进度:7/13 ( A C D G J L M )

A-Matrix Equation

用线代知识对式子进行化简,发现我们最后要求的就是2^自由元个数。

高斯消元求秩然后快速幂做完了,队友写的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll qpow(ll a,ll b) {
    
	ll ans=1;
	while(b) {
    
		if(b&1)
			ans=ans*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}
const int N=205;
bitset<N>a[N];
bitset<N>b[N];
bitset<N>aa[N];
long long n;
int Gauss() {
    
	int r , c , cnt = 0;
	for (r = c = 1 ; r <= n && c <= n ; r++ , c++) {
    
		int p = 0;
		for (int j = r ; j <= n ; j++) {
    
			if (a[j][c]) {
    
				p = j;
				break;
			}
		}
		if (!p) {
    
			r--;
			cnt++;
			continue;
		}
		swap(a[r] , a[p]);
		for (int j = 1 ; j <= n ; j++) {
    
			if (j == r) continue;
			if (a[j][c] == 0) continue;
			a[j] ^= a[r];
		}
	}
	return n-cnt;
}
int main() {
    
	scanf("%lld",&n);
	int x;
	for(int i=1; i<=n; ++i) {
    
		for(int j=1; j<=n; ++j) {
    
			scanf("%d",&x);
			aa[i][j]=x;
		}
	}
	for(int i=1; i<=n; ++i) {
    
		for(int j=1; j<=n; ++j) {
    
			scanf("%d",&x);
			b[i][j]=x;
		}
	}
	ll ans=0;
	for(int i=1; i<=n; ++i) {
    
		for(int j=1; j<=n; ++j) {
    
			for(int k=1; k<=n; ++k) {
    
				if(j==k)
					a[j][k]=(aa[j][k]^b[k][i]);
				else a[j][k]=aa[j][k];
			}
		}
		ans+=Gauss();
	}
	ll sum=qpow(2ll,n*n-ans);
	printf("%lld",sum);
	return 0;
}

C-Stone Game

签到题,不难想到把1和2先合在一起,剩下的再和3合是最优的。

#include <bits/stdc++.h>
using namespace std;
long long x,y,z;
int main()
{
    
    cin>>x>>y>>z;
    if (x==y) 
    {
    
        cout<<x*2;
    }
    else if (x<y)
    {
    
        long long ans=x*2+(y-x)/3*6;
        if ((y-x)%3==2) ans+=4;
        cout<<ans;
    }
    else {
    
        long long ans=y*2+(x-y)/3*3;
        if ((x-y)%3==2) ans++;
        cout<<ans;
    }
    return 0;
}

D-Fight against involution

结构体排序得到每个人在最优情况下拿到的成绩,然后为了减轻内卷,把字数降到最低,此时再统计到对答案的贡献即可。

#include <bits/stdc++.h>
using namespace std;
long long maxi,ans,p,n;
struct dat
{
    
    long long l,r;
}a[200005];
bool cmp(dat a,dat b)
{
    
    return a.r<b.r;
}
int main()
{
    
    cin>>n;
    for (int i=1;i<=n;++i)
    {
    
        scanf("%lld%lld",&a[i].l,&a[i].r);
    }
    sort(a+1,a+1+n,cmp);
    maxi=a[1].l; p=1;
    for (int i=2;i<=n;++i)
        if (a[i].r==a[i-1].r)
            maxi=max(maxi,a[i].l);
        else {
    
            ans+=maxi*(i-p);
            p=i;
            maxi=max(maxi,a[i].l);
        }
    ans+=maxi*(n-p+1);
    cout<<ans;
    return 0;
}

G-Xor Transformation

显然我们可以把X补到二进制全是1的情况,设为 m x = X ⊕ a mx=X \oplus a mx=Xa,同理有 m x = Y ⊕ b mx=Y \oplus b mx=Yb ,a,b即为答案。注意long long边界。

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

int read(){
    	int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){
    if(ch=='-') f=f*-1;ch=getchar();}while(ch>='0'&&ch<='9'){
    x=x*10+ch-'0';ch=getchar();}return x*f;}
void write(int x){
    if(x>9) write(x/10);putchar(x%10+'0');}

int n,m;
signed main(){
    
	//cin>>n>>m;
	n=read();m=read();
	int mx=1,tmp=0;
	while(mx<n) mx=mx*2ll+1;
	for(int i=0;i<=62;i++){
    
		if((mx&(1ll<<i))&&!(n&(1ll<<i))){
    
			tmp|=(1ll<<i);
		}
	}
	puts("2");
	write(tmp);putchar(' ');
	//cout<<tmp<<" ";
	tmp=0;
	for(int i=0;i<=62;++i){
    
		if((mx&(1ll<<i))&&!(m&(1ll<<i))){
    
			tmp|=(1ll<<i);
		}
	}
	write(tmp);putchar(' ');
	//cout<<tmp<<" \n";
	return 0;
}

/*
1000000000000000000 1

1000000000000000000 1000000000000000000
*/

J-Tree Constructer

不懂为啥大家都想到了二分图,我看到就觉得乱搞。我们从一个点随机赋值然后跑dfs,对于边 ( u , v ) (u,v) (u,v),初始化 a [ v ] = a [ u ] 取补 a[v]=a[u]取补 a[v]=a[u]取补,然后 a [ u ] a[u] a[u]的所有0位随机变成1,最后$O(n^2) $check一下,就做完了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100;
int n,mp[N][N],a[N],U[N],V[N];
vector<int>G[N]; 

int read(){
    	int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){
    if(ch=='-') f=f*-1;ch=getchar();}while(ch>='0'&&ch<='9'){
    x=x*10+ch-'0';ch=getchar();}return x*f;}
void write(int x){
    if(x>9) write(x/10);putchar(x%10+'0');}

inline bool check(){
      //检查图是否正确 O(n^2) 
	for(int i=0;i<n;++i){
    
		for(int j=i+1;j<n;++j){
    
			if(mp[i][j]^((a[i]|a[j])==(1ll<<60)-1)){
    
				return false;	
			}
		}
	}
	return true;
}

void dfs(int x,int v){
    
	a[x]=v;
	for(auto to:G[x]){
    
		if(a[to]) continue;
		int tmp=((1ll<<60)-1)^a[x];
		for(int j=0;j<60;++j){
    
			if(!(tmp&(1ll<<j))&&(rand()&1))
			tmp|=(1ll<<j);
		}
		dfs(to,tmp);
	}
}

signed main(){
    
	srand(time(0));
	n=read();
	//n=100;
	for(int i=0,u,v;i<n-1;++i){
    
		u=read();v=read();
		u--;v--;
	//	u=0;v=i+1;
		G[u].emplace_back(v);
		G[v].emplace_back(u);
		mp[u][v]=mp[v][u]=1;
	}
	while(1){
    
		memset(a,0,sizeof(a));
		int tmp=0;
		for(int j=0;j<60;++j){
    
			if(rand()&1) tmp|=(1ll<<j);
		}
		dfs(0,tmp);	
		if(check()) break;
	}
	for(int i=0;i<n;++i) write(a[i]),putchar(" \n"[i==n-1]);
	return 0;
} 

L-Bit Sequence

这个范围不难想到数位dp,因为m的范围只有100,所以我们可以暴力计算L后六位所有情况的答案,其余位置对答案的贡献都是固定的。剩下就是数位dp的板子了。

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

int dp[64][2][2][2];
int bi[64],a[101],m,L;

int calc(int lim,int s,int t){
    
	int res=0,hi=lim?(L%128):127;
	for(int i=0;i<=hi;++i){
     //枚举低6位 
		int f=1;
		for(int j=0;j<m&&f;++j){
    
			if(i+j<128) f&=(__builtin_parity(i+j)^s)==a[j];
			else f&=(__builtin_parity(i+j)^s^t)==a[j];
		}
		res+=f;
	}
	return res;
}

int dfs(int pos,int lim,int s,int t){
     
	if(dp[pos][lim][s][t]!=-1) return dp[pos][lim][s][t];
	if(pos<=6) return dp[pos][lim][s][t]=calc(lim,s,t);
	int res=0;
	int up=lim?bi[pos]:1;
	for(int i=0;i<=up;++i){
    
		res+=dfs(pos-1,lim&&i==up,s^i,i&(!t));
	}
	return dp[pos][lim][s][t]=res;
}

int solve(){
    
	memset(dp,-1,sizeof(dp));
	int len=0,tmp=L;
	while(tmp){
    
		bi[len++]=tmp&1;
		tmp>>=1;
	}
	return dfs(len-1,1,0,0);
}

signed main(){
    
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T;
	cin>>T;
	while(T--){
    
		cin>>m>>L;
		for(int i=0;i<m;++i) cin>>a[i];
		cout<<solve()<<"\n";
	}
	return 0;
} 

M-Cook Pancakes!

签到题,贪心地放满锅是最优的,模拟一下这个过程即可。

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

int n,k;
queue<int>q,p,tmp;

signed main(){
    
	cin>>n>>k;
	int ans=0;
	for(int i=1;i<=n;++i) q.emplace(i);
	while(q.size()||p.size()){
    
		for(int i=1;i<=k;++i){
    
			if(q.size()){
    
				tmp.emplace(q.front());
				q.pop();
			}else if(p.size()){
    
				p.pop();
			}
		}
		while(tmp.size()) p.emplace(tmp.front()),tmp.pop();
		++ans;
	}
	cout<<ans<<"\n";
	return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SC_Linno/article/details/126893412

智能推荐

ACM OJ Collection_htt//acm.wydtang.top/-程序员宅基地

文章浏览阅读737次。原文来自:http://blog.csdn.net/hncqp/article/details/4455263 ACM OJ Collection(排名不分先后):中国:浙江大学(ZJU):http://acm.zju.edu.cn/北京大学(PKU):htt_htt//acm.wydtang.top/

ios 自己服务器 苹果支付_修复苹果IOS支付-程序员宅基地

文章浏览阅读467次。更新记录1.0.0(2019-07-01)插件简介专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。问题描述首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”,特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应..._ios开发苹果支付恢复权益

spring MVC mock类单元测试(controller)_mvcmock-程序员宅基地

文章浏览阅读5.6k次。Spring从J2EE的Web端为每个关键接口提供了一个mock实现:MockHttpServletRequest几乎每个单元测试中都要使用这个类,它是J2EE Web应用程序最常用的接口HttpServletRequest的mock实现。MockHttpServletResponse此对象用于HttpServletRespons_mvcmock

【我的世界Minecraft-MC】常见及各种指令大杂烩【2022.8版】_summon生成掉落物-程序员宅基地

文章浏览阅读8.5k次,点赞7次,收藏22次。execute as @a at @s run clear @s minecraft:dark_oak_planks{display:{Name:“{“text”:“第三关[阴森古堡]”,“color”:“red”,“italic”:false}”,color:“16711680”},Enchantments:[{id:“protection”,lvl:1}],Unbreakable:1b} 1。Lore:[“{“text”:“免费”,“color”:“blue”,“italic”:false}”]..._summon生成掉落物

CentOS 7安装教程(图文详解)_centos 安装-程序员宅基地

文章浏览阅读10w+次,点赞487次,收藏2.1k次。CentOS 7安装教程: 准备: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。) 1、文件--新建虚拟机--自定义 2、..._centos 安装

第1篇 目标检测概述 —(2)目标检测算法介绍_检测类算法的作用-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏8次。目标检测算法是一种计算机视觉算法,用于在图像或视频中识别和定位特定的目标物体。本节课就给大家重点介绍下基于深度学习的目标检测算法!_检测类算法的作用

随便推点

Github项目分享——免费的画图工具drow,前端插件化面试_draw github画图-程序员宅基地

文章浏览阅读333次,点赞3次,收藏3次。项目介绍一款很好用的免费画图软件,支持ER图、时序图、流程图等等在项目的releases就可以下载最新版本同时支持在线编辑。_draw github画图

如何开始学习人工智能?入门的学习路径和资源是什么?_人工智能学习路径-程序员宅基地

文章浏览阅读930次。嗨,大家好!如果你对人工智能充满了好奇,并且想要入门这个领域,那么你来对地方了。本文将向你介绍如何从零基础开始学习人工智能,并逐步掌握核心概念和技能。无论你是大学生、职场新人还是对人工智能感兴趣的任何人,都可以按照以下学习路径逐步提升自己。_人工智能学习路径

Unity3D 导入资源_unity怎么导入压缩包-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏8次。打开Unity3D的:window-asset store就会出来这样的界面:我们选择一个天空纹理,注意这里的标签只有一个,如果有多个就会显示所有标签的内容:找个比较小的免费的下载一下试试,比如这个:下载以后:点击import就会出现该窗口:然后再点击最底下的import:就导入到我们这里来了。从上面可以切换场景:..._unity怎么导入压缩包

jqgrid 服务器端验证,javascript – jqgrid服务器端错误消息/验证处理-程序员宅基地

文章浏览阅读254次。在你以前的问题的the answer的最后一部分,我试着给出你当前的问题的答案.也许我表示不够清楚.您不应该将错误信息放在标准成功响应中.您应该遵循用于服务器和客户端之间通信的HTTP协议的主要规则.根据HTTP协议实现网格中的加载数据,编辑行和与服务器的所有Ajax通信.每个HTTP响应都有响应第一行的状态代码.了解这个意义非常重要.典型的JSON数据成功请求如下HTTP/1.1 200 OK...._decode message error

白山头讲PV: 用calibre进行layout之间的比对-程序员宅基地

文章浏览阅读4k次,点赞8次,收藏29次。我们在流片之后,通常还是有机会对layout进行局部小的修改。例如metal change eco或者一些层次的局部修改。当我们修改之后,需要进行与之前gds的对比,以便确认没有因为某些..._calibre dbdiff

java exit方法_Java:如何测试调用System.exit()的方法?-程序员宅基地

文章浏览阅读694次。问题我有一些方法应该在某些输入上调用567779278。不幸的是,测试这些情况会导致JUnit终止!将方法调用放在新线程中似乎没有帮助,因为System.exit()终止了JVM,而不仅仅是当前线程。是否有任何常见的处理方式?例如,我可以将存根替换为System.exit()吗?[编辑]有问题的类实际上是一个命令行工具,我试图在JUnit中测试。也许JUnit根本不适合这份工作?建议使用互补回归测..._检查system.exit