【AtCoder】 ARC 103
link
C-////
直接算会出现奇偶两组选了同一个数,注意处理一下就行
#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=1e5+5;
int n,a[MN],pre[MN],suf[MN],num[MN],nmp[MN];
int main()
{
	n=read();
	reg int i,mx=0,mxp=0,ans=n;bool fl=1;a[1]=read();
	for(i=2;i<=n;++i) a[i]=read(),fl&=(a[i]==a[i-1]);
	for(i=1;i<=n;i+=2) ++num[a[i]];
	for(i=1;i<=100000;++i) pre[i]=max(pre[i-1],num[i]);
	for(i=100000;i;--i) suf[i]=max(suf[i+1],num[i]);
	for(i=2;i<=n;i+=2) ++nmp[a[i]];
	for(i=1;i<=100000;++i) ans=min(ans,n-nmp[i]-max(pre[i-1],suf[i+1]));
	if(fl) printf("%d\n",n/2);
	else printf("%d\n",ans);
	return 0;
}
D-Robot Arms
在原点构造一个机械手臂,关节数\(<40\),末端可以到达给出的\(n,n\leq10^5\)个点
发现方案存在当且仅当\(X[i]+Y[i]\)奇偶性相同
考虑一个点\((x,y)\),如果\(|x|+|y|\leq 2^{k+1}\),在这个点向外连一个\(2^k\)长度的机械手臂
一定存在一个方向,使得手臂的另一个端点\((x_1,y_1)\)满足\(|x_1|+|y_1|\leq2^{k}\)
所以我们只要构造一个数列\(2^0,2^1,...,2^m\),就可以了,如果\(X[i]+Y[i]\)是个偶数,考虑加一个\(1\),然后当作原点在\((1,0)\)上做就行
#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 int ll
#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=10005;
int N,X[MN],Y[MN];
int d[45],n;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
const char dc[4]={'D','L','U','R'};
void get(int x,int y)
{
	reg int i,j;
	for(i=n;~i;--i)for(j=0;j<4;++j)
	{
		int xx=x+dx[j]*d[i],yy=y+dy[j]*d[i];
		if(abs(xx)+abs(yy)<d[i]){x=xx,y=yy;printf("%c",dc[j]);j=5;}
	}
}
signed main()
{
	N=read();
	reg int i,mx=0;bool fl=1;
	for(i=1;i<=N;++i)
		X[i]=read(),Y[i]=read(),fl&=(~(X[i]+Y[i]-X[1]-Y[1])&1),
		mx=max(mx,abs(X[i])+abs(Y[i])+2);
	if(!fl) return 0*puts("-1");
	fl=~(X[1]+Y[1])&1;
	for(d[1]=n=1;(d[n]<<1)<mx;++n,d[n]=d[n-1]<<1);
	printf("%d\n",n+fl);
	if(fl) printf("1 ");
	for(i=1;i<=n;++i) printf("%d ",d[n-i+1]);puts("");
	for(i=1;i<=N;++i)
	{
		if(fl) printf("R");
		get(X[i]-fl,Y[i]);
		puts("");
	}
	return 0;
}
E-Tr/ee
构造一棵树,满足若\(s_i=1\),则删除一条边后,可以得到大小\(i\)的联通块,否则没有
答案存在当且仅当\(s_1=1,s_n=0,s_i=s_{n-i}\)
从\(1\)开始枚举每个值,如果\(s_i=1\),新建一个根连上当前的树,并不断加叶子直到大小为\(i\)
处理到\((n+1)/2\)后,新加一个点,然后继续补叶子直到大小为\(n\)
#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
const int MN=1e5+5;
char s[MN];
int n,rt;bool a[MN];
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	reg int i;
	for(i=1;i<=n;++i) a[i]=(s[i]=='1');
	if(!a[1]||a[n]) return 0*puts("-1");
	for(i=1;i<=n-1;++i) if(a[i]!=a[n-i]) return 0*puts("-1");
	for(rt=1,i=2;i<=(n+1)/2;++i)if(a[i])
	{
		printf("%d %d\n",i,rt);
		for(int j=rt+1;j<i;++j) printf("%d %d\n",i,j);
		rt=i;
	}
	printf("%d %d\n",rt+1,rt);++rt;
	for(i=rt+1;i<=n;++i) printf("%d %d\n",rt,i);
	return 0;
}
F-Distance Sums
构造一棵树,满足\(D_i\)为其它点到\(i\)的距离的和
发现如果以\(D_i\)最小的做根,每个点的孩子的\(D_i\)必定比它大,\(D_i\)最大一定是叶子
\(D_{fa}=D_x+2\times siz_x-N\)
可以把\(D_i\)从大到小排序,对每个点找个父亲(满足父亲的\(D\)值比它小)。
如果可以顺利完成这一步,并不一定是合法的方案,因为只满足了所有非根节点与父亲之间的\(D\)的关系
只要在\(dfs\)算一下根节点的\(D_{root}\)是否满足就可以了
\(D\)数组要开long long
#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 se second
#define fi first
#define reg register
#define mp make_pair
inline ll read()
{
	ll 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=1e5+5;
ll N,D[MN],siz[MN],fa[MN];
struct edge{int to,nex;}e[MN<<1];int hr[MN],en;
void ins(int x,int y){e[++en]=(edge){y,hr[x]};hr[x]=en;}
pair<ll,int> a[MN];
ll dfs(int x)
{
	reg int i;ll r=0;
	for(i=hr[x];i;i=e[i].nex) r+=dfs(e[i].to)+siz[e[i].to];
	return r;
}
int main()
{
	N=read();reg int i,j;
	for(i=1;i<=N;++i) D[i]=read(),a[i]=mp(D[i],i);
	std::sort(a+1,a+N+1);
	for(i=N;i>1;--i)
	{
		int x=a[i].se;
		++siz[x];
		int pos=lower_bound(a+1,a+N+1,mp(D[x]+2*siz[x]-N,0))-a;
		if(pos>=i||D[x]+2*siz[x]-N!=a[pos].fi) return 0*puts("-1");
		fa[x]=a[pos].se;siz[fa[x]]+=siz[x];ins(fa[x],x);
	}
	++siz[a[1].se];
	if(dfs(a[1].se)!=D[a[1].se]) return 0*puts("-1");
	for(i=1;i<=N;++i)for(j=hr[i];j;j=e[j].nex)printf("%d %d\n",i,e[j].to);
	return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
【AtCoder】 ARC 103的更多相关文章
- 【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 ... 
随机推荐
- JDBC简单增删改查实现(单表)
			0.准备工作 开发工具: MySQL数据库, intelliJ IDEA2017. 准备jar包: mysql-connector-java-5.1.28-bin.jar(其他均可) 1. 数据库数据 ... 
- SQL Injection (Blind)
			Low级别基于布尔的盲注思路 1.判断是否存在注入,注入是字符型还是数字型 2.猜解当前数据库名 3.猜解数据库中的表名 4.猜解表中的字段名 5.猜解数据 判断是否有sql注入 输入1.1’ and ... 
- 【转载】sqlserver中小数类型float和deciaml类型比较
			在sqlserver数据库中,float类型和double类型都可以用来表示小数类型,float类型是一种近似数值的小数类型,而decimal类型则是精确数值的小数类型.如果需要在sqlserver数 ... 
- FlaskCBV视图类
			路由视图类 from flask import Flask app = Flask(name) 视图类 Views文件 看views源码 继承最后一个类 导入CBV的视图基类 from flask i ... 
- dexlib2的源码框架
			这个是dexlib2的目录,明显看出来比baksmali和smali代码量要多很多,这里先将核心目录给大家做一下介绍 analysis 这个暂时不知道具体作用 base 这个文件夹下面全部都是 ... 
- Spark之开窗函数
			一.简介 开窗函数row_number()是按照某个字段分组,然后取另外一个字段排序的前几个值的函数,相当于分组topN.如果SQL语句里面使用了开窗函数,那么这个SQL语句必须使用HiveConte ... 
- MySQL DDL--gh-ost学习
			gh-ost工作原理 1.首先新建一张ghost表,结构与源表相同 2.使用alter命令修改ghost表 3.1.模拟从库命令获取主库上该表的binlog(基于全镜像的行模式的binlog包含更改前 ... 
- RocketMQ在CentOS7上安装
			需要先以下组件 1.64bit OS, Linux/Unix/Mac is recommended;2.64bit JDK 1.8+; 安装了 Java JDK 就可以运行 RocketMQ 了 3. ... 
- 【HCIA Gauss】学习汇总-数据库管理(SQL语法 库表 索引操作)-5
			# 简单查询select * from table_reference # 创建表 create table TB(staff_id int primary key , course_name cha ... 
- MySQL/MariaDB数据库的MHA实现高可用实战
			MySQL/MariaDB数据库的MHA实现高可用实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL高可用常见的解决方案 1>.Multi-Master ... 
