首页 > 其他分享 >10.31集训解题报告(自家隔离时期)

10.31集训解题报告(自家隔离时期)

时间:2022-10-31 22:35:22浏览次数:57  
标签:sz 10.31 子段 int js read 解题 -- 集训

A

题面:

对于给定的一个正整数 \(n\),判断 \(n\) 是否能分成若干个正整数之和(可以重复),其中每个正整数都能表示成两个质数乘积。

思路:

随随便便找规律就找出来了。

代码:

int q; 
int main(){
	q=read();
	while(q--) {
		ll n=read();
		if(n<4) {
			putchar('0'); putchar('\n');
			continue ;
		}
		if(n%2==0) {
			putchar('1'); putchar('\n');
			continue ;
		}
		if(n==9) {
			putchar('1'); putchar('\n');
			continue ;
		}
		if(n<=11) {
			putchar('0'); putchar('\n');
			continue ;
		}
		putchar('1'); putchar('\n');
	}
}

B

题面:

有一个长度为 \(n\) 的自然数序列 \(a\),要求将这个序列恰好分成至少 \(m\) 个连续子段。每个子段的价值为该子段的所有数的按位异或。要使所有子段的价值按位与
的结果最大,输出这个最大值。

思路:

贪心的,从高位到低位考虑,前期分的段越多越好。
对于每一位,如果这个 \(01\) 序列合法,那么前边掰掉合法的一段,后面剩下的一段还是合法的。
后面分段的时候要保证前面的高位还是合法的,段数只有可能少没有可能多。
那么前面应该尽可能多分几段有利于后面的合并。

int q, n, m;
int sz[2003][31];
int a, ans;
int sta[2003], top;
int A[2003], tt;
bool pd[35];
int main() {
	q=read();
	while(q--) {
		n=read(); m=read(); ans=0;
		memset(sz, 0, sizeof(sz));
		memset(pd, 0, sizeof(pd));
		for(int i=1; i<=n; ++i) {
			cin>>a;
			int js=0;
			while(a) {
				if(a&1) sz[i][js]=1;	
				++js; 
				a>>=1;
			}
			for(int j=0; j<=30; ++j) sz[i][j]+=sz[i-1][j];
		}
		int maxx=-1;
		for(int i=30; i>=0; --i) {
			if(sz[n][i]>=m) {maxx=i; break ;}
		}
		if(maxx==-1) {cout<<0<<'\n'; continue ;}
		pd[maxx]=1; top=0;
		for(int j=maxx; j>=0; --j) {
			if((sz[n][j]&1)!=(sz[n][maxx]&1)) continue ;
			int sum=0, js=0, tt=0;
			for(int i=1; i<=n; ++i) {
				if(sz[i][j]-sz[i-1][j]) sum++;
				if(sum&1) {
					bool flag=1;
					for(int k=j; k<=maxx; ++k) {
						if(pd[k]==0) continue ;
						if(((sz[i][k]-sz[A[tt]][k])&1)==0) {
							flag=0; break;
						}
					}
					if(flag) {
						sum=0;
						A[++tt]=i;
					}
				}
			}
			if(tt>=m) { 
				top=tt;
				for(int i=1; i<=top; ++i) sta[i]=A[i];
				pd[j]=1;
				ans+=(1<<j);
			}
		}
		cout<<ans; putchar('\n');
	}
}

标签:sz,10.31,子段,int,js,read,解题,--,集训
From: https://www.cnblogs.com/Konnyaku41377/p/16846098.html

相关文章

  • [2022.10.31]集合与数组
    数组与集合1.集合与数组存储数据概述:集合、数组都是对多个数据进行存储操作的结构,简称Java容器。说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,......
  • Vulnhub Lin.Security靶机解题过程
    Lin.Security靶机地址:http://www.vulnhub.com/entry/linsecurity-1,244/由于靶机的作者直接给出了ssh用户名和密码,本题非常简单识别目标主机IP地址─(kali㉿kali)-[~/V......
  • 2022.10.31python学习第二天
    python集合(数组)1.列表:是一种有序和可更改的集合,允许重复的成员   列表用 []来编号  可通过索引号来访问列表项  ......
  • 最长连续递增序列解题思路
    题目给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列可以由两个下标l和r(l<r)确定,如果对于每个l<=i<r,都有nums[i]......
  • Vulnhub Quaoar靶机解题过程(难度:容易)
    Quaoar靶机地址:http://www.vulnhub.com/entry/hackfest2016-quaoar,180/识别目标主机IP地址(kali㉿kali)-[~/Vulnhub/Quaoar]└─$sudonetdiscover-ieth1Currentl......
  • 10.26 解题报告
    T1考场用时:\(2.5\)h这题一直没有理解题意,然后去手模样例模不出来,看了很久题,题目所要求的是一个随机序列的期望顺序对数,容易发现对于一个固定的序列,不管怎么打乱它,逆序对......
  • Vulnhub Sputnik靶机解题过程
    Sputnik识别目标主机IP地址──(kali㉿kali)-[~/Vulnhub/Sputnik]└─$sudonetdiscover-ieth1Currentlyscanning:192.168.90.0/16|ScreenView:UniqueH......
  • 【解题报告】食塩水
    ATcoderABC034D食盐水杂项题目链接挺水的么这玩应不是感觉远远不是是紫题难度题意给你N个装食盐水的容器,每个容器对应的食盐水浓度和食盐水的质量也给出,选几个混......
  • 10.25 解题报告
    T1用时:1.5h赛时\(30\)min切了,对着错大样例调了\(1\)h。#include<bits/stdc++.h>#definelllonglong#defineintlonglong//#defineullunsignedlonglong#......
  • CSP-S划分 解题报告
    n<=10爆搜即可n<=50什么乱搞n<=400有一个\(n^3\)的dp设dp[i][j]表示最后一段为j+1~i时的最小值直接三层循环转移即可dp[1][0]=0;for(inti=1;i......