技术标签: 算法 深度优先 c++ 练习记录 图论 数学 ACM竞赛 ACM
title : 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)
date : 2022-5-30
tags : ACM,题解,练习记录
author : Linno
题目链接:https://ac.nowcoder.com/acm/contest/10662
补题进度:7/13 ( A C D G J L M )
用线代知识对式子进行化简,发现我们最后要求的就是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;
}
签到题,不难想到把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;
}
结构体排序得到每个人在最优情况下拿到的成绩,然后为了减轻内卷,把字数降到最低,此时再统计到对答案的贡献即可。
#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;
}
显然我们可以把X补到二进制全是1的情况,设为 m x = X ⊕ a mx=X \oplus a mx=X⊕a,同理有 m x = Y ⊕ b mx=Y \oplus b mx=Y⊕b ,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
*/
不懂为啥大家都想到了二分图,我看到就觉得乱搞。我们从一个点随机赋值然后跑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;
}
这个范围不难想到数位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;
}
签到题,贪心地放满锅是最优的,模拟一下这个过程即可。
#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;
}
文章浏览阅读737次。原文来自:http://blog.csdn.net/hncqp/article/details/4455263 ACM OJ Collection(排名不分先后):中国:浙江大学(ZJU):http://acm.zju.edu.cn/北京大学(PKU):htt_htt//acm.wydtang.top/
文章浏览阅读467次。更新记录1.0.0(2019-07-01)插件简介专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。问题描述首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”,特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应..._ios开发苹果支付恢复权益
文章浏览阅读5.6k次。Spring从J2EE的Web端为每个关键接口提供了一个mock实现:MockHttpServletRequest几乎每个单元测试中都要使用这个类,它是J2EE Web应用程序最常用的接口HttpServletRequest的mock实现。MockHttpServletResponse此对象用于HttpServletRespons_mvcmock
文章浏览阅读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生成掉落物
文章浏览阅读10w+次,点赞487次,收藏2.1k次。CentOS 7安装教程: 准备: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。) 1、文件--新建虚拟机--自定义 2、..._centos 安装
文章浏览阅读1.4k次,点赞3次,收藏8次。目标检测算法是一种计算机视觉算法,用于在图像或视频中识别和定位特定的目标物体。本节课就给大家重点介绍下基于深度学习的目标检测算法!_检测类算法的作用
文章浏览阅读333次,点赞3次,收藏3次。项目介绍一款很好用的免费画图软件,支持ER图、时序图、流程图等等在项目的releases就可以下载最新版本同时支持在线编辑。_draw github画图
文章浏览阅读930次。嗨,大家好!如果你对人工智能充满了好奇,并且想要入门这个领域,那么你来对地方了。本文将向你介绍如何从零基础开始学习人工智能,并逐步掌握核心概念和技能。无论你是大学生、职场新人还是对人工智能感兴趣的任何人,都可以按照以下学习路径逐步提升自己。_人工智能学习路径
文章浏览阅读4.3k次,点赞2次,收藏8次。打开Unity3D的:window-asset store就会出来这样的界面:我们选择一个天空纹理,注意这里的标签只有一个,如果有多个就会显示所有标签的内容:找个比较小的免费的下载一下试试,比如这个:下载以后:点击import就会出现该窗口:然后再点击最底下的import:就导入到我们这里来了。从上面可以切换场景:..._unity怎么导入压缩包
文章浏览阅读254次。在你以前的问题的the answer的最后一部分,我试着给出你当前的问题的答案.也许我表示不够清楚.您不应该将错误信息放在标准成功响应中.您应该遵循用于服务器和客户端之间通信的HTTP协议的主要规则.根据HTTP协议实现网格中的加载数据,编辑行和与服务器的所有Ajax通信.每个HTTP响应都有响应第一行的状态代码.了解这个意义非常重要.典型的JSON数据成功请求如下HTTP/1.1 200 OK...._decode message error
文章浏览阅读4k次,点赞8次,收藏29次。我们在流片之后,通常还是有机会对layout进行局部小的修改。例如metal change eco或者一些层次的局部修改。当我们修改之后,需要进行与之前gds的对比,以便确认没有因为某些..._calibre dbdiff
文章浏览阅读694次。问题我有一些方法应该在某些输入上调用567779278。不幸的是,测试这些情况会导致JUnit终止!将方法调用放在新线程中似乎没有帮助,因为System.exit()终止了JVM,而不仅仅是当前线程。是否有任何常见的处理方式?例如,我可以将存根替换为System.exit()吗?[编辑]有问题的类实际上是一个命令行工具,我试图在JUnit中测试。也许JUnit根本不适合这份工作?建议使用互补回归测..._检查system.exit