[]ARC099
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的更多相关文章
- AtCoder Regular Contest 099 (ARC099) E - Independence 二分图
原文链接https://www.cnblogs.com/zhouzhendong/p/9224878.html 题目传送门 - ARC099 E - Independence 题意 给定一个有 $n$ ...
- 【AtCoder】ARC099题解
C - Minimization 每次操作必然包含一个1 枚举第一次操作的位置计算两边即可 代码 #include <bits/stdc++.h> #define fi first #de ...
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
- AtCoder整理(持续更新中……)
做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...
随机推荐
- 关于Maven项目install时出现No compiler is provided in this environment的处理
关于Maven项目build时出现No compiler is provided in this environment的处理 新配置的Eclipse环境,运行现有项目没问题,一日,从svn上检出了一 ...
- bzoj 1110 [POI2007]砝码Odw 贪心+进制转化
[POI2007]砝码Odw Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 661 Solved: 366[Submit][Status][Disc ...
- matlab求矩阵、向量的模
求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...
- MUI 按两次返回键退出应用 及 地理位置获取
<span style="font-size:14px;"><span style="font-size:14px;"> mui.plu ...
- eclipse 4.2生成wsdl 客户端
eclipse版本 4.2 64位 ,jdk 1.6 64位 Eclipse Java EE IDE for Web Developers. Version: Juno Service Rel ...
- bzoj 3100 排列
题目大意: 给你长度为 \(1e6\) 的序列, 求最大的 \(K\) 使得序列中含有一个 \(K\) 的排列 做法: 性质: 区间包含1, 元素不重, 区间最大值=区间长度 枚举一个 \(1\) 让 ...
- 51nod1031(简单斐波拉契数列)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1031 题意:中文题诶- 思路:对于第x块骨牌的情况,我们用a ...
- HDU 2105 The Center of Gravity (数学)
题目链接 Problem Description Everyone know the story that how Newton discovered the Universal Gravitatio ...
- bzoj 1901 线段树套平衡树+二分答案查询
我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...
- compositionstart 、 compositionend 、 input都存在时的解决办法
$(function () { var cpLock = true; $('#textbox').off().on({ compositionstart: function () {//中文输入开始 ...