首页 > 其他分享 >CF1601 题解

CF1601 题解

时间:2022-11-21 21:55:47浏览次数:83  
标签:ch int 题解 CF1601 inline define reg dis

偶然看这一场的题目,忽然很有感觉,于是写了一下

A

题面
考虑每一位可以单独分开考虑
考虑单独的一位,每次要选 \(m\) 个位置,可能产生贡献的位置就是这位为 1 的数,设数量为 \(x\),则 \(m|x\)
最后显然合法的 \(m\) 满足 \(m| \gcd_{i=0}^{29} M_i\)
记得特判全为 \(0\) 的情况

Code
#include<bits/stdc++.h>
#define reg register
#define int long long
using namespace std;
inline int read(){
	int k=1,x=0;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') k=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=getchar();
	return k*x;
}
inline int cmin(reg int x,reg int y){return x<y?x:y;}
inline int cmax(reg int x,reg int y){return x>y?x:y;}
const int N=2e5+10,INF=1e18;
int n,a[N]; 
inline int gcd(reg int x,reg int y){return y==0?x:gcd(y,x%y);}
inline bool check(){for (reg int i=1;i<=n;i++) if (a[i]) return false; return true;}
signed main(){reg int _=read(); while (_--){
		n=read();for (reg int i=1;i<=n;i++) a[i]=read();
		if (check()){for (reg int i=1;i<=n;i++) printf("%lld ",i);puts("");continue;}
		reg int d=-1;
		for (reg int t=0;t<=30;t++){
			reg int cnt=0;
			for (reg int i=1;i<=n;i++) if (a[i]>>t&1) cnt++;
			if (d<0) d=cnt; else d=gcd(d,cnt);
		}
		for (reg int i=1;i<=d;i++) if (d%i==0) printf("%lld ",i); puts("");
	}
	return 0; 
}

B

题面
一个直接的想法是建图跑最短路
考虑没有"下滑 \(b_i\)" 的限制应该怎么做,可以直接线段树优化建图。
考虑加入这个限制,对 \([0,n]\) 建立一个虚点,每个 \(i\) 和对应的虚点区间 \([i-a_i,i]\) 连边,然后再由虚点的 \(i\) 连向 \(i-b_i\)
使用 01bfs 优化复杂度。

Code
#include<bits/stdc++.h>
#define reg register
#define int long long
using namespace std;
inline int read(){
	int k=1,x=0;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') k=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=getchar();
	return k*x;
}
inline int cmin(reg int x,reg int y){return x<y?x:y;}
inline int cmax(reg int x,reg int y){return x>y?x:y;}
const int N=(4e5+10)*5,INF=1e18,mod=998244353;
int n,a[N],b[N],idx,id[N],vis[N],pre[N],dis[N];
#define mp make_pair 
vector<pair<int,int> > G[N];
inline void add(reg int u,reg int v,reg int w){G[u].push_back(mp(v,w));}
inline void build(reg int p,reg int l,reg int r){
	if (l==r) return (void)(id[p]=l+n+1);id[p]=++idx; reg int mid=l+r>>1;
	build(p<<1,l,mid),build(p<<1|1,mid+1,r); add(id[p],id[p<<1],0),add(id[p],id[p<<1|1],0);
}
inline void modify(reg int p,reg int l,reg int r,reg int L,reg int R,reg int node){
	if (L<=l&&r<=R) return add(node,id[p],1); reg int mid=l+r>>1;
	if (L<=mid) modify(p<<1,l,mid,L,R,node); if (R>mid) modify(p<<1|1,mid+1,r,L,R,node);
}deque<int> q;
signed main(){ 
	n=read(); idx=2*n+1;
	for (reg int i=1;i<=n;i++) a[i]=read();for (reg int i=1;i<=n;i++) b[i]=read(); 
	for (reg int i=0;i<=n;i++) add(i+n+1,i+b[i],0); build(1,0,n);
	for (reg int i=1;i<=n;i++) modify(1,0,n,i-a[i],i,i);
	memset(dis,0x3f,sizeof(dis)); dis[n]=0; q.push_back(n);
	while(!q.empty()){
        reg int u=q.front(); q.pop_front();
        if (vis[u]) continue; vis[u]=1;
        for (auto it:G[u]) if (dis[it.first]>dis[u]+it.second){ reg int v=it.first;
        	dis[v]=dis[u]+it.second;
			if (!vis[v]){if (it.second) q.push_back(v); else q.push_front(v); pre[v]=u;}
		}
    }
    if (dis[0]>=INF) return !printf("-1");
	printf("%lld\n",dis[0]); 
	vector<int> path; reg int now=0;
	while(now!=n){
        if (n+1<=now&&now<=2*n+1) path.push_back(now-n-1);
        now=pre[now];
    }
	reverse(path.begin(), path.end());
    for (auto x:path) printf("%lld ",x);
	return 0;
}


标签:ch,int,题解,CF1601,inline,define,reg,dis
From: https://www.cnblogs.com/Matutino-Lux/p/16907343.html

相关文章

  • 【题解】TEST 22.11.21 - 计数(感谢强大艾尔法!!1)
    我们要求的是:\[\begin{aligned}G(x)&=\sum_{i\geq0}(i+n-m)!(-1)^{m-i}x^i\\G'(x)&=\sum_{i\geq1}i(i+n-m)!(-1)^{m-i}x^{i-1}\end{aligned}\]考虑凑\(\sum\limits......
  • 11.21 模拟赛题解
    \(\textdistance\)简要题意给定一棵\(n\)个结点的无根树,每条边有一个边权,询问以哪一个点作为根时,到其他所有节点的距离之和最大。距离的定义为到该点最短路径上的边权......
  • DTOJ 2022-11-21 测试 题解
    测试成果非常寄35+56+0+8=99基本上把能犯的错误都犯了T1记得dp数组初始化\(-\infty\)!!!!T2记得认真暴搜,不要乱记录访问状态T3记得把调试删掉!!!!!T4记得开longlong......
  • AtCoder 题解集
    虽然暂时不知道会不会从XCPC中退役,但还是想把这个题解集给维护下去。\(created\;at\;2022/6/24\;by\;Roshin\)目录AGCARCABCABC138F.Coincidence(结论,数位DP)AB......
  • ZR2448 题解
    题意给定一个长度为\(n\)的匹配的括号序列\(s\)。给出\(q\)组询问,每组询问形如:光标从\(s\)的第\(a\)个字符出发,使用一下三种操作:将光标移到左边的字符。将光......
  • [题解] CF1149D Abandoning Roads
    难得自己想出来一道3000分的题,虽然说考试的时候打挂了...首先先对较小的边缩点,然后求连通块内的最短路。显然,连通块内其实想怎么走就怎么走,但不能走较大的边。然后不同......
  • 题解 LGP5380【[THUPC2019]鸭棋】
    postedon2021-06-0113:27:59|under题解|source给一种船新的做法,存棋子的位置而不是棋盘,我们只需要写一个生成棋子能移动到哪些位置的函数就可以了。#include<st......
  • ARC104F Visibility Sequence 题解
    [ARC104F]VisibilitySequence给一个长为\(n\)的数列\(h_{1\dotsn}\),第\(i\)项在\([1,h_i]\)中选一个数,得到数列\(x_{1\dotsn}\)。再构造一个数列\(p_{1\do......
  • AT_arc126_d [ARC126D] Pure Straight 题解
    又来给do_while_true大佬交作业了,所以本篇题解仅仅是对该篇题解进行补充说明的。本篇题解适用于像我这样的小萌新,那篇题解适合大佬食用。Part1:为什么我们要用状压d......
  • K8S kube-scheduler-master CreateContainerError 问题解决及思路
    错误信息1:kubectlgetpods  发现pod状态一直在runing-error-CrashLoopBackOff-循环解决方法:1,查看日志。kubectllogspodsweb-674477549d-zx8gmkubectldescri......