C:普及组难度的题

D:令$S(n)$表示$n$的数位和,一个数$n$是Snuke number当且仅当对所有$m\gt n$有$\frac n{S(n)}\leq\frac m{S(m)}$,求出前$K$个Snuke number

这题是整场最难的题(雾

令$f(n)$表示使$\frac x{S(x)}$最小的$x(x\geq n)$,于是我们从$n=1$开始,重复执行$n\gets f(n+1)$就可以得到所有的Snuke number

问题在于如何求$f(n)$,下面我们将说明:$f(n)$一定是把$n$的最后某几位改为$9$得到的,以下的讨论中假设$f(n)\gt n$,最后检查一下$n$是否更优即可

首先显然$f(n)$和$n$有相同的位数,因为$9\cdots9$是Snuke number

令$f(n)=x$,设$10^d$位是$x$与$n$不同的最高位,假如存在$i\lt d$且$x$的$10^i$位不是$9$,那么我们把$x$的$10^d$位$-1$并把$10^i$位变成$9$得到$y$,显然$N\leq y\lt x,S(y)\geq S(x)$,这与$\frac x{S(x)}$最小相矛盾,这样我们就证明了$f(n)$的$10^{0\cdots d-1}$位都是$9$

然后我们来证明$x$的$10^d$位也是$9$,假设它是$a(a\lt9)$,那么对于$k\leq9-a$,$S(x+k)=S(x)+k$,因为$\frac{x+k\cdot10^d}{S(x)+k}$关于$k$单调递减,所以把这一位改成$9$是更优的

所以我们这样求$f(n)$:枚举$k$并尝试把$n$的最后$k$位改成$9$得到$x$,取使$\frac x{S(x)}$最小的$x$即可

#include<stdio.h>
typedef long long ll;
typedef double du;
const du inf=9223372036854775807.;
du S(ll n){
	du s=0;
	while(n){
		s+=n%10;
		n/=10;
	}
	return s;
}
ll f(ll n){
	ll d,t,f;
	du mn,s;
	f=n;
	mn=n/S(n);
	for(d=1;d<=n;d*=10){
		t=n/d*d+d*10-1;
		s=t/S(t);
		if(s<mn){
			mn=s;
			f=t;
		}
	}
	return f;
}
int main(){
	int k;
	ll n;
	scanf("%d",&k);
	for(n=1;k--;n=f(n+1))printf("%lld\n",n);
}

E:给一个图,要把这个图划分成两个团,使得两个团中的边数加起来最小

取补图,问题变为把图划分成两个独立集,如果不是二分图显然无解,否则统计出最后能得到的所有可能的独立集大小并统计答案即可

#include<stdio.h>
#include<string.h>
int min(int a,int b){return a<b?a:b;}
bool a[710][710];
int c[710],n,M1,M2;
bool dfs(int x,int f){
	if(c[x])return c[x]!=f;
	c[x]=f;
	M1+=f==2;
	M2+=f==3;
	for(int i=1;i<=n;i++){
		if(a[x][i]&&dfs(i,f^1))return 1;
	}
	return 0;
}
bool t1[710],t2[710];
int s2(int n){return n*(n-1)/2;}
int main(){
	int m,i,j,x,y,ans;
	scanf("%d%d",&n,&m);
	for(i=1;i<n;i++){
		for(j=i+1;j<=n;j++)a[i][j]=a[j][i]=1;
	}
	while(m--){
		scanf("%d%d",&x,&y);
		a[x][y]=a[y][x]=0;
	}
	t1[0]=1;
	for(i=1;i<=n;i++){
		if(!c[i]){
			M1=M2=0;
			if(dfs(i,2)){
				puts("-1");
				return 0;
			}
			memset(t2,0,sizeof(t2));
			for(j=0;j<=n;j++){
				if(t1[j])t2[j+M1]=t2[j+M2]=1;
			}
			memcpy(t1,t2,sizeof(t2));
		}
	}
	ans=2147483647;
	for(i=1;i<n;i++){
		if(t1[i])ans=min(ans,s2(i)+s2(n-i));
	}
	printf("%d",ans);
}

F:有一个序列$A$和一个指针$p$,初始时序列全为$0$,指针指向$A$的第$0$位,对一个字符串,我们要按顺序执行字符串中的字符代表的命令,命令可以是$p++,p--,(*p)++,(*p)--$,给出一个字符串$S$,问它有多少子串使得执行这个子串和执行$S$所得到的序列是一样的

直接上哈希,具体地,对一个序列$A$,我们选取两个质数$B,P$并使得它的哈希值为$\left(\sum A_iB^i\right)\%P$

我们存$S$的每个前缀的哈希值$h_i$和偏移量$p_i$(如果偏移了$x$,那么$p_i=B^x$),此时如果$h_n=\frac{h_r-h_{l-1}}{p_{l-1}}$,那么$S_{l\cdots r}$就是满足要求的区间,所以直接从后往前扫,用map统计并更新答案即可

要选取相当大的质数和模数,我偷懒用了__int128

#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
const ll mod=1000000000000000031ll,b=1000000000000000003ll,rb=821428571428571454ll;
ll mul(ll a,ll b){return(__int128)a*b%mod;}
ll ad(ll a,ll b){return(a+b)%mod;}
char s[250010];
ll p[250010],st[250010];
map<ll,int>m;
int main(){
	int n,i;
	ll ans;
	scanf("%d%s",&n,s+1);
	p[0]=1;
	for(i=1;i<=n;i++){
		p[i]=p[i-1];
		st[i]=st[i-1];
		switch(s[i]){
			case'+':st[i]=ad(st[i],p[i]);break;
			case'-':st[i]=ad(st[i],mod-p[i]);break;
			case'>':p[i]=mul(p[i],b);break;
			case'<':p[i]=mul(p[i],rb);break;
		}
	}
	ans=0;
	for(i=n;i>0;i--){
		m[st[i]]++;
		ans+=m[ad(mul(st[n],p[i-1]),st[i-1])];
	}
	printf("%lld",ans);
}

[]ARC099的更多相关文章

  1. AtCoder Regular Contest 099 (ARC099) E - Independence 二分图

    原文链接https://www.cnblogs.com/zhouzhendong/p/9224878.html 题目传送门 - ARC099 E - Independence 题意 给定一个有 $n$ ...

  2. 【AtCoder】ARC099题解

    C - Minimization 每次操作必然包含一个1 枚举第一次操作的位置计算两边即可 代码 #include <bits/stdc++.h> #define fi first #de ...

  3. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  4. AtCoder整理(持续更新中……)

    做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...

随机推荐

  1. COGS 930. [河南省队2012] 找第k小的数 主席树

    主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 ...

  2. JSOI2004 平衡点 / 吊打XXX [模拟退火]

    题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...

  3. bzoj 2425 [HAOI2010]计数 dp+组合计数

    [HAOI2010]计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 451  Solved: 289[Submit][Status][Discus ...

  4. SQL性能分析

    MySQL常见瓶颈: CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据的时候. IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候. 服务器硬件的性能瓶颈:top.free.io ...

  5. jquery遍历之后代

    向下遍历dom树的jquery方法 children()方法返回被选元素的所有直接子元素,只会对向下一级对dom树进行遍历. 例子 代码: $(document).ready(function(){ ...

  6. netty入门代码学习

    服务端代码: package com.lsp.netty; /** * @author lishupeng * @create 2017-05-27 下午 3:48 **/ import io.net ...

  7. 转:Spring AOP 注解方式实现的一些“坑”

    使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...

  8. git分支开发,分支(feature)同步主干(master)代码,以及最终分支合并到主干的操作流程

    由于rebase执行速度慢,分支同步主干代码时,分支的每次提交都可能和主干产生冲突,需要解决的次数太多,影响提交效率. 同时,为了保证主干提交线干净(可以安全回溯),所以采用下面所说的merge法. ...

  9. NYOJ 127 星际之门(一) (数学)

    题目链接 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的 ...

  10. POJ2495(棋盘分治,染色)

    Incomplete chess boards Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2483   Accepted ...