link

C-Minimization

枚举覆盖\(1\)的区间,两边的次数直接算

#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,K,P;
int main()
{
N=read(),K=read();
reg int i,ans=N;
for(i=1;i<=N;++i) read()==1?P=i:0;
for(i=1;i<=K;++i)if(P>=i&&P+K-i<=N)
ans=min(ans,1+(P-i+K-2)/(K-1)+(N-P-K+i+K-2)/(K-1));
printf("%d\n",ans);
}

D-Snuke Numbers

答案的序列是\(1,2,3,4,5,6,7,8,9,19,29,39,..,99,199,299,399...\)

发现每次的增量都是\(10^{i}\),所以每次比较一下\(\frac{now+10^i}{S(now+10^i)}\)和\(\frac{now+10^{i+1}}{S(now+10^{i+1})}\)

看下一个是加\(10^i\)还是\(10^{i+1}\)

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
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 D[18],d,now=1;
ll get_now(ll p){ll r=0;for(;p;r+=p%10,p/=10);return r;}
int main()
{
D[0]=1;
for(int i=1;i<=17;++i) D[i]=D[i-1]*10ll;
int n=read();
while(n--)
{
printf("%lld\n",now);
if((now+D[d])*get_now(now+2*D[d])>(now+D[d]*2)*get_now(now+D[d])) d++;
now+=D[d];
}
return 0;
}

E-Independence

考虑原图的返图,答案存在当且仅当它是一个二分图

将二分图的每个联通块黑色和白色的数量求出来,\(dp\)算出最后一个块的大小是否可以是\(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=705;
int N,M;
bool G[MN][MN],vis[MN],col[MN],f[MN][MN];
int num[2][MN],T;
void dfs(int x)
{
++num[col[x]][T];vis[x]=true;reg int i;
for(i=1;i<=N;++i)if(i!=x&&!G[x][i])
{
if(!vis[i])col[i]=col[x]^1,dfs(i);
else if(col[i]==col[x]) {puts("-1");exit(0);}
}
}
int cal(int x,int y){return (x*(x-1)+y*(y-1))/2;}
int main()
{
N=read();M=read();
reg int i,j,x,y;
for(i=1;i<=M;++i) x=read(),y=read(),G[x][y]=G[y][x]=1;
for(i=1;i<=N;++i)if(!vis[i])++T,dfs(i);
f[0][0]=1;
for(i=0;i<T;++i)for(j=0;j<=N;++j)
f[i+1][j+num[0][i+1]]|=f[i][j],
f[i+1][j+num[1][i+1]]|=f[i][j];
int ans=MN*MN;
for(i=0;i<=N;++i)if(f[T][i])ans=min(ans,cal(i,N-i));
return 0*printf("%d\n",ans);
}

F-Eating Symbols Hard

字符串\(Hash\),求出全部操作后的字符串的哈希值,把它插入\(map\)

\[hash=\sum_{i=-1e9}^{1e9} A_i x^i
\]

求出当前前缀操作后字符串的哈希值\(num\),\(ans+=map[num]\)

求出一段当前前缀操作后再执行总操作的哈希值,把它插入\(map\)

可以定义\(num\)是有\(6\)个元素的结构体,包含分别用\(6\)个底数求出的哈希值

#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=250005;
int N;
char s[MN];
const int P=998244353;
int Add(int x,int y){return (x+y)%P;}
int Mul(int x,int y){return (1ll*x*y)%P;}
const int B[]={691,769,823,877,911,967},
inv[]={37560569,983965175,992179685,349442436,115055606,356147158};
struct node
{
int v[6];
int& operator [](int x){return v[x];}
bool operator <(const node o)const
{
for(int i=0;i<6;++i)if(v[i]!=o.v[i])return v[i]<o.v[i];
return false;
}
bool operator ==(const node o)const
{
for(int i=0;i<6;++i)if(v[i]!=o.v[i])return false;
return true;
}
}pre[MN],all;
std::map<node,int> Mp;
int pos[MN],nm[6][MN<<1],cal[MN];
node get(node x,node y,int p)
{
for(int j=0;j<6;++j)
x[j]=Add(x[j],Mul(y[j],nm[j][p]));
return x;
}
int main()
{
scanf("%d%s",&N,s+1);
reg int i,j,k;
for(j=0;j<6;++j)for(nm[j][MN]=i=1;i<=N;++i)
nm[j][i+MN]=Mul(nm[j][i-1+MN],B[j]),
nm[j][-i+MN]=Mul(nm[j][-i+1+MN],inv[j]);
for(k=j=0;j<6;++j,k=0)for(i=1;i<=N;++i)
{
switch(s[i])
{
case '<':--k;break;
case '>':++k;break;
case '+':all[j]=Add(all[j],nm[j][k+MN]);break;
case '-':all[j]=Add(all[j],P-nm[j][k+MN]);break;
}
pos[i]=k;pre[i][j]=all[j];
}
++Mp[all];
for(i=1;i<=N;++i)
cal[i]=Mp[pre[i]],
++Mp[get(pre[i],all,pos[i]+MN)];
ll ans=0;
for(i=1;i<=N;++i) ans+=cal[i];
return 0*printf("%lld\n",ans);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

【AtCoder】 ARC 099的更多相关文章

  1. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  2. 【Atcoder】ARC 080 E - Young Maids

    [算法]数学+堆 [题意]给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序. [题解] 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前 ...

  3. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  4. 【AtCoder】 ARC 097

    link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...

  5. 【AtCoder】 ARC 096

    link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...

  6. 【AtCoder】 ARC 098

    link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...

  7. 【AtCoder】 ARC 100

    link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把 ...

  8. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...

  9. 【AtCoder】 ARC 102

    link C-Triangular Relationship 发现要么全部是\(K\)的倍数,要么全部是模\(K\)余\(K/2,(K=2n)\) #include<bits/stdc++.h& ...

随机推荐

  1. C# yield checked,unchecked lock语句(C#学习笔记04)

    特殊语句 yield语句 yield用于终止迭代 只能使用在返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator< ...

  2. C# vb .net图像合成-合成椭圆

    在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...

  3. Java自学-数字与字符串 装箱和拆箱

    Java中基本类型的装箱和拆箱 步骤 1 : 封装类 所有的基本类型,都有对应的类类型 比如int对应的类是Integer 这种类就叫做封装类 package digit; public class ...

  4. Vue搭建脚手架1

    Vue2.0搭建Vue脚手架(vue-cli) 此文章参考了网上一些前人的技术分享,自己拿过来总结一下.此文章是基于webpack构建的vue项目,并实现简单的单页面应用.其中利用到的相关技术会简单加 ...

  5. Android-----WebView加载HTML界面布局并进行数据交互

    注:在做例子之前要先做好准备工作,在app下新建一个名为:assets的目录(不懂怎么创建的可参考:https://blog.csdn.net/Biegral/article/details/4717 ...

  6. python绘图 转

    Python有很多可视化工具,本篇只介绍Matplotlib. Matplotlib是一种2D的绘图库,它可以支持硬拷贝和跨系统的交互,它可以在Python脚本.IPython的交互环境下.Web应用 ...

  7. Python小练习:批量删除多个文件夹内的相同文件

    应用场景: 下载的多个文件夹是压缩包,解压后每个文件夹都有某个网站的推广链接,想要批量的删除该文件 使用环境:win7,python3.6 代码: 1.直接用for循环 由于os.walk()方法自带 ...

  8. Laravel 实现前后台用户分离登录

    在很多时候,我们需要前台和后台进行不同的登录操作,以限制用户权限,现在用 Laravel 实现这个需求. 前戏 一.获取 Laravel 这个在文档中都有说明的,也比较简单,可以使用 composer ...

  9. JVM 整体流程介绍

    一. JVM自身的物理结构 从图中可以看出 JVM 的主要组成部分 ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine( ...

  10. FFMPEG 命令行工具- ffmpeg

    ffmpeg 简介 ffmpeg 用于转码的应用程序,命令格式: ffmpeg [options] [[infile options] -i infile]... {[outfile options] ...