【AtCoder】 ARC 102
link
C-Triangular Relationship
发现要么全部是\(K\)的倍数,要么全部是模\(K\)余\(K/2,(K=2n)\)
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
ll N,K,num;ll p3(ll x){return x*x*x;}
int main()
{
	N=read();K=read();
	num=p3(N/K);
	if(K%2==0) num+=p3(N/K+((N%K)>=(K/2)));
	printf("%lld\n",num);
}
D-All Your Paths are Different Lengths
\(L=2^{a_1}+2^{a_2}+...+2^{a_n},a_1<a_2<...<a_n\)
建立\(n\)个中转点,每个点\(i\)向下一个点连接\(0\)和\(2^{i-1}\)的边
对于\(a_i,i<n\),第\(a_i+1\)个点在向最后一个点连\(\sum_{j=i+1}2^{a_j}\)的边
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
int L,a[25],cnt;
int main()
{
	int L=read();
	reg int i,j,N=0,M=0;
	for(i=0;i<=20;++i)if(L>>i&1)a[++cnt]=i-1,++M;
	N=a[cnt]+2;M=M+N*2-3;
	printf("%d %d\n",N,M);
	a[0]=-1;
	for(i=1;i<=cnt;++i)
	{
		for(j=a[i-1];j<a[i];++j)
			printf("%d %d %d\n",j+2,j+3,0),
			printf("%d %d %d\n",j+2,j+3,(1<<(j+1)));
		if(i==cnt) break;
		printf("%d %d %d\n",a[i]+2,N,L-(1<<a[i]+1));
		L-=1<<a[i]+1;
	}
	return 0;
}
E-Stop. Otherwise
比较简单的计数问题,一个限制相当于有两个数只能选择其中的一个
枚举一下选了多少个这样有限制的组,组合数算一下每个数要多少个
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
const int Mod=998244353,MN=4004;
int Mul(int x,int y){return (1ll*x*y)%Mod;}
int Add(int x,int y){return (x+y)%Mod;}
int fac[MN],inv[MN],p2[MN];
int C(int i,int j)
{
	if(i<0||j<0||i<j)return 0;
	return Mul(fac[i],Mul(inv[j],inv[i-j]));
}
int F(int i,int j){return C(i+j-1,j-1);}
int sol(int N,int pr,int nm)
{
	reg int i,j=min(N,pr);int r=0;
	for(i=0;i<=j;++i)r=Add(r,Mul(p2[i],Mul(C(pr,i),F(N-i,nm-pr+i))));
	return r;
}
int main()
{
	int N,K;reg int i,Ma;
	K=read();N=read();Ma=max(K,N);
	for(fac[0]=i=1;i<=Ma*2;++i)fac[i]=Mul(fac[i-1],i);
	for(inv[0]=inv[1]=1,i=2;i<=Ma*2;++i) inv[i]=Mul(inv[Mod%i],(Mod-Mod/i));
	for(i=2;i<=Ma*2;++i) inv[i]=Mul(inv[i-1],inv[i]);
	for(p2[0]=i=1;i<=Ma*2;++i) p2[i]=Mul(p2[i-1],2);
	for(i=2;i<=K*2;++i)
	{
		int ans=0,pr=i/2-max(i-K,1)+1;
		if(i%2==0) ans=Add(ans,sol(N-1,pr-1,K-pr));
		ans=Add(ans,sol(N,pr-(i%2==0),K-pr));
		printf("%d\n",ans);
	}
	return 0;
}
F-Revenge of BBuBBBlesort
考虑逆操作的过程
发现\(i-1,i,i+1\)一旦交换过,\(i\)这个点就不会变了
最后,每个有变化的极大区间\([i,j]\)一定满足
- \(i,i+2,i+4,...j\)的位置变化
 - \(i+1,i+3,i+5,...j-1\)的位置不变
 
我们找到这样一个区间,又因为它无法与周围的其它的数交换,所以这个区间的值的集合应该恰好等于这个区间的每个位置下标的集合
考虑怎样才能移动为有序
首先,如果将一个数向右移动,那么它无法再向左移动,因为与它相邻的数是固定的,所以无法往回走
所以,一个数能朝着它的目标位置方向做单向运动
朝同一个方向运动的数单调递增,否则超越的那一步,前数朝反方向运动
相当于\(a[i]<i\)和\(a[i]>i\)的点的\(a[i]\)值分别单调递增
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
const int MN=300005;
int a[MN],N;
void No(){puts("No");exit(0);}
void Yes(){puts("Yes");exit(0);}
void chk(int l,int r)
{
	reg int i,_1=0,_2=0;
	for(i=l+1;i<=r-1;i+=2)if(a[i]!=i)No();
	for(i=l;i<=r;i+=2)if(a[i]==i)No();
	for(i=l;i<=r;i+=2)
		if(i<a[i]){if(_1>a[i])No();_1=a[i];}
		else{if(_2>a[i])No();_2=a[i];}
}
main()
{
	N=read();reg int i;
	for(i=1;i<=N;++i) a[i]=read();
	int l=1,r;
	while(a[l]==l&&l<N)++l;
	while(1)
	{
		if(a[l]==l)Yes();
		if(l+2>N)No();r=l+2;
		int Mi=min(a[l],a[r]),Ma=max(a[l],a[r]);
		while((r!=Ma||l!=Mi)&&r<=N)r+=2,Mi=min(Mi,a[r]),Ma=max(Ma,a[r]);
		if(r>N)No();chk(l,r);
		l=r+1;while(a[l]==l&&l<N)++l;
		if(l>N)break;
	}
	Yes();
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
【AtCoder】 ARC 102的更多相关文章
- 【AtCoder】ARC 081 E - Don't Be a Subsequence
		
[题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...
 - 【Atcoder】ARC 080 E - Young Maids
		
[算法]数学+堆 [题意]给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序. [题解] 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前 ...
 - 【Atcoder】ARC 080 F - Prime Flip
		
[算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...
 - 【AtCoder】 ARC 097
		
link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...
 - 【AtCoder】 ARC 096
		
link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...
 - 【AtCoder】 ARC 098
		
link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...
 - 【AtCoder】 ARC 099
		
link C-Minimization 枚举覆盖\(1\)的区间,两边的次数直接算 #include<bits/stdc++.h> #define ll long long #define ...
 - 【AtCoder】 ARC 100
		
link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把 ...
 - 【AtCoder】 ARC 101
		
link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...
 
随机推荐
- python 跨目录访问文件
			
1.同级.同目录的文件之间的访问 有这样一个目录结构 假如,in_A.py 这个文件想调用 hello_world.py 中的函数怎么办呢? --->>> import 只需在 i ...
 - Js判断对象是否是数组的方法
			
1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Arr ...
 - 升级tinyhttpd-0.1.0,让其支持网页显示图像
			
tinyhttpd是学习http协议非常好的工具,但是由于其过于简单,不支持在网页上显示图片,所以我改了一些代码,让tinyhttpd可以现实图像,供新手一起学习和熟悉http协议,ubuntu14. ...
 - Vue+SpringBoot后端接收包含单属性和List数组的json对象
			
这次主要是针对springboot后台接收的json中包含多对象(如List数组/单属性)所写的一篇文章.虽然网上类似情况很多,尝试了一个晚上,都没有解决问题,最后还是在师兄的帮助下完美解决. vue ...
 - PHP实现智能语音播报
			
原文地址 https://www.jianshu.com/p/91a046ec6ebc 大家估计都知道现在很多AI音响能够给你播报天气,叫你起床...甚至能够接受语音指令!所谓的人工智能音响,听起来很 ...
 - Shell脚本编程30分钟入门(小结)(转)
			
原文链接https://www.jb51.net/article/161028.htm 什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿.程序化脚本,是一种 ...
 - jenkins使用邮件功能
			
jenkins发送邮件 在日常构建后,需要及时将构建结果发送给相应的人员.这时就可以使用jenkins自带的邮件配置系统. 1 开通邮箱的SMTP服务,需要发送短信验证开启 2 进入"系统管 ...
 - Linux命令——lsblk
			
参考:Linux lsblk Command Tutorial for Beginners (8 Examples) 简介 lsblk可以看成是“List block device”的缩写,即列为出所 ...
 - MySQL/MariaDB数据库的各种日志管理
			
MySQL/MariaDB数据库的各种日志管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务日志 (transaction log) 1>.Innodb事务日志相 ...
 - python测试开发django-rest-framework-62.基于类的视图(APIView和View)
			
前言 django中编辑视图views.py有两种方式,一种是基于类的实现,另外一种是函数式的实现方式,两种方法都可以用. REST框架提供了一个APIView类,它是Django View类的子类. ...