Atcoder Regular Contest ARC 153 A B C D 题解

点我看题

A - AABCDDEFE

一个beautiful number是形如这样的:\(S1S1S3S4S5S5S7S8S7\)。如果选定了\(S1\),后面的数有100000种选法,所以先求出答案的\(S1\)。假设现在我们要求出以\(S1\)开头的第\(n\)小的beautiful number。发现这个条件其实等价于\(S3S4S5S7S8\)这个五位数等于\(n-1\),所以直接求即可。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back

void fileio()
{
  #ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  #endif
}
void termin()
{
  #ifdef LGS
  std::cout<<"\n\nEXECUTION TERMINATED";
  #endif
  exit(0);
}

using namespace std;

int n,ans[20];

int main()
{
  fileio();

  cin>>n;
  int s1=1;
  while(n>100000)
  {
    ++s1;
    n-=100000;
  }
  --n;
  ans[1]=ans[2]=s1;
  ans[8]=n%10;n/=10;
  ans[7]=ans[9]=n%10;n/=10;
  ans[5]=ans[6]=n%10;n/=10;
  ans[4]=n%10;n/=10;
  ans[3]=n%10;
  repn(i,9) cout<<ans[i];

  termin();
}

B - Grid Rotations

发现行和列实际上是独立的,每次操作\(a,b\)实际上我们相当于依次做了这四步:把第\(1\cdots a\)行翻转(注意是行与行之间的顺序reverse,不是把每行的内容reverse,后面的"翻转"同理);把第\(a+1\cdots n\)行翻转;把第\(1\cdots b\)列翻转;把第\(b+1\cdots m\)列翻转。如果我们能求出两个数组\(r,c\)\(r_i\)表示所有操作做完后,原来的第\(i\)行被移到了第\(r_i\)行,第\(j\)列被移到了第\(c_j\)列,那么原来的\(a_{i,j}\)就被移动到了\((r_i,c_j)\)。用两个平衡树维护两维的翻转情况即可。

时间复杂度单log。

其实也可以线性,因为行列坐标的变换也可以看成是加一个数再取模。但平衡树的优势是不要动脑子。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back

void fileio()
{
  #ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  #endif
}
void termin()
{
  #ifdef LGS
  std::cout<<"\n\nEXECUTION TERMINATED";
  #endif
  exit(0);
}

using namespace std;

int to[2][500010];

mt19937 rndtr(114514);
struct node{int val,key,ls,rs,sz,tag;};
struct tr
{
	int len;
	node a[1000000];
	int newNode(int x){a[++len].val=x;a[len].key=rndtr();a[len].ls=a[len].rs=a[len].tag=0;a[len].sz=1;return len;}
  void addTag(int x)
  {
    if(x==0) return;
    swap(a[x].ls,a[x].rs);a[x].tag^=1;
  }
  void pushDown(int x)
  {
    if(x==0||a[x].tag==0) return;
    addTag(a[x].ls);addTag(a[x].rs);
    a[x].tag=0;
  }
	void calc(int x){if(x==0) return;a[x].sz=a[a[x].ls].sz+1+a[a[x].rs].sz;}
	int merge(int x,int y)
	{
		if(x==0||y==0) return max(x,y);
    pushDown(x);pushDown(y);
		int ret;
		if(a[x].key<=a[y].key){ret=x;a[ret].rs=merge(a[ret].rs,y);}
		else{ret=y;a[ret].ls=merge(x,a[ret].ls);}
		calc(ret);return ret;
	}
	pii splitSz(int x,int y)//左边y个
	{
		if(x==0) return mpr(0,0);if(y==0) return mpr(0,x);if(y==a[x].sz) return mpr(x,0);
    pushDown(x);
		int ret1,ret2;
		if(a[a[x].ls].sz>=y){pii p=splitSz(a[x].ls,y);ret1=p.fi;ret2=x;a[ret2].ls=p.se;}
		else{pii p=splitSz(a[x].rs,y-1-a[a[x].ls].sz);ret1=x;a[ret1].rs=p.fi;ret2=p.se;}
		calc(ret1);calc(ret2);return mpr(ret1,ret2);
	}
  void build(int x,int frt,int w)
  {
    if(x==0) return;
    to[w][a[x].val]=frt+a[a[x].ls].sz;
    pushDown(x);
    build(a[x].ls,frt,w);build(a[x].rs,frt+a[a[x].ls].sz+1,w);
  }
}row,col;

int n,m;
string a[500010],ans[500010];
char c[500010];

int main()
{
  fileio();

  cin>>n>>m;
  rep(i,n)
  {
    scanf("%s",c);
    a[i]=ans[i]=c;
  }
  row.len=0;col.len=0;
  int rootr=0,rootc=0;
  rep(i,n) rootr=row.merge(rootr,row.newNode(i));
  rep(i,m) rootc=col.merge(rootc,col.newNode(i));
  int q;cin>>q;
  rep(qn,q)
  {
    int x,y;
    scanf("%d%d",&x,&y);
    pii p=row.splitSz(rootr,x);
    row.addTag(p.fi);row.addTag(p.se);
    rootr=row.merge(p.fi,p.se);
    p=col.splitSz(rootc,y);
    col.addTag(p.fi);col.addTag(p.se);
    rootc=col.merge(p.fi,p.se);
  }
  row.build(rootr,0,0);
  col.build(rootc,0,1);
  rep(i,n) rep(j,m) ans[to[0][i]][to[1][j]]=a[i][j];
  rep(i,n) printf("%s\n",ans[i].c_str());

  termin();
}

C - ± Increasing Sequence

(A数组的下标从0开始)

\(suf_i=\sum_{j=i}^{n-1}a_i\)。我们其实是要找出一个序列\(b_0\cdots b_{n-1}\),满足\(b_1\cdots b_{n-1}\)都是正整数,且\(\sum b_isuf_i=0\)。其实b就是题目中x的差分数组。

由于b中除了第一个数都要取正数,那就先把\(b_1\cdots b_{n-1}\)都取1,\(b_0\)取0,后面如果需要可以再加。如果此时\(\sum b_isuf_i\)已经为0,那就直接输出解。否则,如果\(suf_1\cdots suf_{n-1}\)有正有负,那肯定有解,因为\(suf_{n-1}\)是1或-1,如果是1的话就随便找一个\(<0\)\(suf_i\),不断给\(b_i\)加1直到\(\sum b_isuf_i\le 0\),然后再用\(suf_{n-1}\)加回来即可。\(suf_{n-1}=-1\)同理。

剩下的情况,如果\(suf_0=0\)肯定无解,这是显然的。否则也肯定有解,比如\(suf_{n-1}=1\)时,可以像上面一样,先用\(suf_0\)\(\sum b_isuf_i\)压到非正数,在用\(suf_{n-1}\)加回来。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back

void fileio()
{
  #ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  #endif
}
void termin()
{
  #ifdef LGS
  std::cout<<"\n\nEXECUTION TERMINATED";
  #endif
  exit(0);
}

using namespace std;

LL n,a[200010],ans[200010],sufsum[200010];

void print()
{
  puts("Yes");
  rep(i,n)
  {
    printf("%d ",ans[i]);
    ans[i+1]+=ans[i];
  }
  puts("");
  termin();
}
void fuck(){puts("No");termin();}

int main()
{
  fileio();

  cin>>n;
  rep(i,n) scanf("%lld",&a[i]);
  LL sum=0,cur=0,posi=-1,nega=-1;
  for(int i=n-1;i>0;--i)
  {
    sum+=a[i];sufsum[i]=sum;
    ans[i]=1;cur+=sum;
    if(sum>0) posi=i;else if(sum<0) nega=i;
  }
  if(cur==0) print();
  //if(a[n-1]==1) posi=n-1;else nega=n-1;
  if(posi>-1&&nega>-1)
  {
    if(a[n-1]==1)
    {
      LL usenega=(max(0LL,cur)-sufsum[nega]-1)/(-sufsum[nega]);
      ans[nega]+=usenega;cur+=usenega*sufsum[nega];
      ans[n-1]-=cur;
    }
    else
    {
      LL useposi=(-min(0LL,cur)+sufsum[posi]-1)/sufsum[posi];
      ans[posi]+=useposi;cur+=useposi*sufsum[posi];
      ans[n-1]+=cur;
    }
    print();
  }
  if(sum+a[0]==0) fuck();
  sum+=a[0];
  if(a[n-1]==1)
  {
    LL targ=(cur+llabs(sum)-1)/llabs(sum)*llabs(sum);
    ans[n-1]+=targ-cur;
    ans[0]=-(targ/sum);
  }
  else
  {
    LL targ=(-cur+llabs(sum)-1)/llabs(sum)*llabs(sum);targ=-targ;
    ans[n-1]+=llabs(targ-cur);
    ans[0]=-(targ/sum);
  }
  print();

  termin();
}

D - Sum of Sum of Digits

看起来像数位dp,其实也确实是dp。

令原数组所有数的数位和为\(S\),x的数位和为X。那么最终的数位和为\(S+nX-所有数加x的总进位次数\cdot 9\),这个模拟一下加法的过程就能发现。我们把进位次数\(\cdot 9-nX\)称为"收益",我们想让收益最大。

我们从低往高确定x的每一位。关键观察:当确定了x的最低的i位时,\(a\)数组中那些会从第i位到第i+1位进一位的数,肯定是\(a\)中前i位按照数值比较最大的一些数。所以就可以dp了:\(dp_{i,j}\)表示计算到第i位,前\(i-1\)位最大的j个数被第\(i-1\)位到第\(i\)位进位了一次的情况下的最大收益。转移时枚举x的当前这一位选什么,计算第i位到第i+1位的进位数只要用前缀和预处理一下就行了。

时间复杂度\(O(10^2n)\)

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back

void fileio()
{
  #ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  #endif
}
void termin()
{
  #ifdef LGS
  std::cout<<"\n\nEXECUTION TERMINATED";
  #endif
  exit(0);
}

using namespace std;

void chmax(LL &x,LL y){if(x<y) x=y;}

LL n,a[200010],pw10[15],clue[200010],lft[200010],ord[20][200010];
LL pref[15][200010][15];//pref[i][j][k]: 第i层,前缀最大的j个中,当前位>=k的个数
LL dp[15][200010];//dp[i][j]: 第i层,前缀最大的j个被进位的最大收益

int main()
{
  fileio();

  pw10[0]=1;repn(i,12) pw10[i]=pw10[i-1]*10;
  cin>>n;
  rep(i,n) scanf("%lld",&a[i]);
  rep(i,10)
  {
    rep(j,n) clue[j]=a[j]%pw10[i],lft[j]=a[j]/pw10[i]%10,ord[i][j]=j;
    sort(ord[i],ord[i]+n,[](LL x,LL y){return clue[x]>clue[y];});
    rep(j,n)
    {
      rep(k,12) pref[i][j+1][k]=pref[i][j][k];
      for(int k=0;k<=lft[ord[i][j]];++k) ++pref[i][j+1][k];
    }
  }
  rep(i,14) rep(j,n+3) dp[i][j]=-1e18;
  dp[0][0]=0;
  rep(i,10) rep(j,n+1) if(dp[i][j]>-1e18)
  {
    rep(nxt,10)
    {
      LL gain=(LL)(-nxt)*n,add=pref[i][j][10-nxt-1]+pref[i][n][10-nxt]-pref[i][j][10-nxt];
      gain+=add*9;
      chmax(dp[i+1][add],dp[i][j]+gain);
    }
  }
  LL ans=-1e18;
  rep(j,n+1) ans=max(ans,dp[10][j]);
  LL ori=0;
  rep(i,n)
  {
    while(a[i]>0)
    {
      ori+=a[i]%10;
      a[i]/=10;
    }
  }
  ans=ori-ans;
  cout<<ans<<endl;

  termin();
}
本文转载于网络 如有侵权请联系删除

相关文章

  • 利器 | TestNG 与 Junit 对比,测试框架如何选择?

    TestNG和Junit作为两大流行的测试框架,有哪些区别?各有哪些优缺点?该如何选择呢?这里简要总结下:执行时通过运行xml文件最基本的套件管理规则:suite->test->classes->class同一个test下的测试类看做是一个整体,其中的注解对整个test整体都是生效的methods:所有用例都可以在不同的线程下执行,包括依赖的用例tests:同一个中的用例运行在同一个线程下,不同中的用例可以运行在不同线程下classes:同一个中的用例运行在同一个线程下,不同中的用例可以运行在不同线程下

  • 期末考试快到了,如何快速批量制作试卷填空题?

    1、点击[替换]2、点击[查找内容] 3、点击[更多]4、点击[格式]5、点击[字体]6、点击[无颜色]7、点击[红色]8、点击[确定]9、点击[替换为]10、点击[格式]11、点击[字体]12、点击[无颜色] 13、点击[白色,背景1]14、点击[下划线线型]15、点击[横线]16、点击[无颜色]17、点击[黑色,文字1] 18、点击[确定]19、点击[全部替换]20、点击[确定]

  • MMIC技术:伪形态高电子迁移率晶体管(pHEMT)

    介绍伪形态高电子迁移率晶体管(pHEMT)是单片微波集成电路(MMIC)设计人员和晶圆厂用来开发和制造微波集成电路的一种技术。pHEMT因其卓越的宽带性能特性,包括低噪声系数,高OIP3和高达40GHz及以上的出色可靠性,作为电子制造商(如Mini-Circuits)生产的许多MMIC的构建模块而广受欢迎。pHEMT使用不同成分的半导体和带隙之间的异质结来实现出色的高频性能。本文深入探讨了pHEMT操作的物理原理、优势和可靠性测试结果。还提供了Mini-Circuits的pHEMT产品摘要的链接。场效应晶体管(FET)系列[1]在最简单的形式中,场效应晶体管(FET)由三个端子组成:源极、漏极和栅极,如图1所示。从源极到漏极的载流子(电子/空穴)的流动由施加到栅极的电场控制,因此得名场效应晶体管。图1:FET的简化原理图 在实际实践中,这种简单的结构扩展到整个设备系列,具体取决于其实现方式。本文重点介绍HEMT/pHEMT。评论:晶体结构,晶格常数和摩尔分数[1,2]简要回顾一些基本术语将有助于灌输对HEMT和pHEMTs的基本物理原理的理解。像GaAs这样的晶体具有原子的周期性放置。

  • 当所有细胞基因表达量相同时如何更好的可视化?

    分享是一种态度绘制FeaturePlot时,遇到基因在所有细胞中表达水平相同展示效果不理想的情况,本文引入函数tryCatch()旨在解决上述问题,并将警告信息保存到日志文件中便于后续追踪。1加载R包library(easypackages) packages<-c('ggplot2','cowplot','Seurat') libraries(packages) 复制2挑选所有细胞中表达水平相同的基因#引入内置数据pmbc_small pbmc_small ##AnobjectofclassSeurat ##230featuresacross80sampleswithin1assay ##Activeassay:RNA(230features,20variablefeatures) ##2dimensionalreductionscalculated:pca,tsne #从全部基因集中挑选在所有细胞中表达量相同的基因 object_seurat<-pbmc_small dat<-as.matrix(ob

  • 在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.2)

    在我们servicemesh之旅的第一部分中,我们讨论了“什么是服务网格以及我们为什么选择Linkerd2?”。在第二部分,我们将讨论我们面临的问题以及我们如何解决这些问题。 系列在Intenseye,为什么我们选择Linkerd2作为ServiceMesh工具(Part.1)问题1:ApacheZooKeeperLeader的选举 在Intenseye,我们使用ApachePulsar代替传统的ApacheKafka队列系统。ApachePulsar是一个云原生(cloud-native)、多租户(multi-tenant)、高性能分布式消息传递和streaming平台,最初由Yahoo创建!ApachePulsar使用ApacheZookeeper进行元数据存储、集群配置和协调。在我们将Zookeeper与Linkerd2啮合后,K8S一一重启了pod,但它们卡在了“CrashloopBackOff”中。我们检查了日志,发现ZooKeeper无法与其他集群成员进行通信。我们进一步挖掘,发现Zookeeper节点由于网格的原因无法选出一个leader。ZooKeeper服务器监听三个

  • 盘一盘 Python 特别篇 20 - SciPy 稀疏矩阵

    引言和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零。稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的0非常浪费。稀疏矩阵的存储机制有很多种(列出常用的五种): COO(CoordinateListFormat):座标格式,容易创建但是不便于矩阵计算,用coo_matrixCSR(CompressedSparseRow):压缩行格式,不容易创建但便于矩阵计算,用csr_matriCSC(CompressedSparseColumn):压缩列格式,不容易创建但便于矩阵计算,用csc_matrixLIL(ListofList):内嵌列表格式,支持切片但也不便于矩阵计算,用lil_matrix DIA(Diagnoal):对角线格式,适合矩阵计算,用dia_matrix在SciPy中稀疏矩阵一共有七种,剩余的两种类型BSR和DOK本贴不做研究。有兴趣的读者可以去官网去查询。COO采用三元组(row,col,data)的形式来存储矩阵中非零元素的信息,即把非零值data按着行坐标row和纵坐标col写成两个列表。如下图所示:坐标(1,1)对应的数据2坐标(3,4)对

  • JMeter: org.apache.http.NoHttpResponseException

    https://stackoverflow.com/questions/25132655/the-target-server-failed-to-respond-jmeter Ifacedthesameissue“targetserverfailedtorespond”andhereiswhatIdid:InyourJMETERtestplanyoumusthaveadded'HTTPRequestDefaults".ClickonthatandfortheImplementationfieldselectHttpClient4optionfromthedropdown. Saveyourtest Nowintheapachejmeter’sbinfolderopenthefileuser.propertiesandmakeanentrytowardstheendofthefileasfollows: httpclient4.retrycount=1 hc.parameters.file=hc.parameters Nowopenthefilehc.paramete

  • gsoap入门:C/C++代码生成及编译

    版权声明:本文为博主原创文章,转载请注明源地址。https://blog.csdn.net/10km/article/details/52174616gsoap是什么先来一段百度百科,说说gsoap是什么:gSOAP一种跨平台的开源的C/C++软件开发工具包。生成C/C++的RPC代码,XML数据绑定,对SOAPWeb服务和其他应用形成高效的具体架构解析器,它们都受益于一个XML接口。这个工具包提供了一个全面和透明的XML数据绑定解决方案,Autocoding节省大量开发时间来执行SOAP/XMLWeb服务中的C/C++。此外,使用XML数据绑定大大简化了XML自动映射。应用开发人员不再需要调整应用程序逻辑的具体库和XML为中心的数据。 gSOAP支持大多数平台,包括嵌入式系统和小系统(例如嵌入式Symbian,Palm)。 最近需要做webservice的客户端c++接口代码。找到了gsoap这个开源框架,网上有一些教程,但是都是几年前的,gsoap经过几年的发展版本也升级了好多回,这些教程都有点过时,摸索了几天才总算把gsoap代码生成和编译搞定了,在这里做一些记录和总结。下载gs

  • 用H5页面打开APP

      业务场景,一个分享出去的h5界面通过页面内某个事件的触发,启动目标app并执行相关逻辑处理或做其他页面跳转(如:跳应用市场下载应用等)。下面是我在企业开发过程中,实操的记录,对于有这块需求的朋友,可以来参考下。   Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据。H5代码(事件触发入口):<ahref="myapp://jp.app/openwith?name=zhangsan&age=26">启动应用程序</a>Android处理:在AndroidManifest.xml的MAINActivity下追加以下内容(按照下面的格式来追加)<intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter&g

  • Docker崛起,云计算巨头们如何对待这个“坏孩子”

    不久前,Docker官方公布的数据显示,全球已有46万个应用Docker化,并且实现两年增长3000%。以Docker为代表的容器技术在发展速度上,业已超过了曾经的虚拟化技术和云计算技术。或许也正因如此,2015年被称为Docker野蛮扩张的一年,先后通过了OCI和CNCF两大标准组织的确立,更是在中国引发了如火如荼的Docker创业之风,出现了阿里百川、网易蜂巢等大批基于Docker的容器云。诞生于2013年的Docker技术,让那些成熟的云计算服务突然显得老迈、迟缓且落伍,而国内外的云计算巨头们又是如何对待这个坏孩子呢?Docker崛起,或受益于羸弱的传统PaaS服务有关“PaaS已死”的说法由来已久,既不如IaaS那样灵活自由,又不如SaaS那样可以直接推向消费者。一个似乎可以用来佐证的事实是,DotCloud作为Docker技术的缔造者,在今年年初宣布倒闭,Docker的繁荣间接地导致dotCloud在PaaS平台上的衰败。PaaS服务的羸弱在一定程度上受限于不成熟的框架和工具,导致有些PaaS解决方案让原来在IaaS上很容易实现的事变得更加复杂。一方面,企业应用环境多样化,单

  • gtk还有人用吗_iperf使用方法

    大家好,又见面了,我是你们的朋友全栈君。 GTK+:GTK+的简介、安装、使用方法之详细攻略目录GTK+的简介1、GTK特点GTK+的安装1、基于Windows平台安装第一步、下载GTK+第二步、安装GTK+第三步、加载系统环境变量第四步、运行命令测试第五步、利用python预测测试GTK+的使用方法1、C++语言实现2、python语言实现GTK+的简介GTK+(GIMPToolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。并且,GTK+也有Windows版本和MacOSX版。 GTK+是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于GUI的应用程序。可以把GTK+想像成一个工具包,从这个工具包中可以找到用来创建GUI的许多已经准备好的构造块。差不多已经10年过去了。今天,在GTK+的最新稳定版本——2.8版上(3.0测试中),仍然在进行许多活动,同时,GIMP无疑仍然是使

  • 项目git commit时卡主不良代码:husky让Git检查代码规范化工作

    看完《前端规范之Git工作流规范(Husky+Commitlint+Lint-staged) https://www.cnblogs.com/Yellow-ice/p/15349873.html》,再次修改本文   团队人一多,提交一多,还是要对备注加以区分,好快速找到变更点。这时候就需要对每次提交,需要输入message,对提交的备注进行规范化处理 代码规范落地难:归根结底在于需要工具去强行保证代码必须经过代码开发规范的扫描; 低质量代码带入线上应用:最好的方式本地进行commit的时候,最起码需要保证当前代码能够满足团队制定的开发规范,如果不通过,commit都无法成功,这样能够从最源头保证代码质量问题; 代码格式难统一:需要一种工具强制保证团队内代码的格式是一致; 代码质量文化难落地:通过引入代码质量工具,在开发过程中能够时刻对自身代码质量进行约束,逐渐培养自身对代码质量有“洁癖”的开发观念,同时也会成为团队乃至自身对质量文化落地的一个抓手。 要想防患于未然,防止将存在潜在问题的代码带到线上环境,最好的办法是在本地提交代码时就能够扫描出潜在

  • 蛙蛙推荐:五分钟搞定网站前端性能优化

    用pagespeed或yslow会发现大多扣分都发生在如下几个项目上 js,css没有mini化 多个js没有合并成一个 静态资源没有进行gzip压缩 静态资源没有设置过期时间 mini化及合并脚本 先安装uglifyJS npminstalluglify-js-g 复制 按顺序把所有需要加载的脚本mini化并合并成一个大的all.js,或者分下类压缩成多个。(如果用了seajs或requirejs请使用相关的spm和r.js) uglifyjsjquery.min.jsmustache.jsunderscore.jshighcharts.jsjquery.vector-map.jschina-zh.jswarning_main.js>all.js 复制 在html页面上重新引入all.js <scriptsrc="/static/js/all.js"></script> 复制 启用gzip压缩 配置下nginx就行,如下 gzipon; gzip_http_version1.1; gzip_comp_level2; gzip_typestext/pl

  • 在linux安装mysql,并设置远程访问

    1.查看系统有没有安装mysql.  vpm-qamysql 发现有删除:rpm-emysql(rpm-e--nodepsmysql) 2.下载数据库mysql-standard-5.0.27-linux-i686.tar.gz 进行解压tar-zxvfmysql-standard-5.0.27-linux-i686.tar.gz groupaddmysql useradd-gmysqlmysql   3.进入mysql目录,初始化数据库scripts/mysql_install_db--user=mysql 4更改目录组,用户 chown-Rroot. chgrp-Rmysql. chowm-Rmysqldata 4.启动mysql bin/mysqldsafe--user=mysql&   设置每个用户直接登录mysql; cd  /root/  vi.bash_profile path=/home/mysql/bin/ 进行访问数据库  ./mysqladmin-urootpassword(设置密码)复

  • 先输入n(n&lt;=50)个整数到数组中,然后求数组中最大值及其对应的下标。

    本题可以参考实验教程P56的典型例题1,但注意输入输出要求不同 提示:需要预先给定一个足够大的数组空间,由于题目规定n<=50,我们可以如下做 #defineSIZE50 intmain() {   ints[SIZE];    …… } 程序流程:    输入数组的实际长度    for()    {      输入每个数组元素的值   }    初始化最大为第0个数组元素    初始化最大值对应下标为0    for()   {      如果找到一个数比当前最大值大        &

  • AppDelegate 生命周期(一)

    所有默认的生命周期函数 •applicationWillFinishLaunching •applicationDilFinishLaunching •applicationWillBecomeActive •applicationDidBecomeActive •applicationWillResignActive •applicationDidResignActive •applicationWillUpdate •applicationDidUpdate •applicationWillHide •applicationDidHide •applicationWillUnhide •applicationDidUnhide •applicationDidChangeOcclusionState •applicationShouldTerminate •applicationWillTerminate 应用程序启动时 •applicationWillFinishLaunching •applicationWillBecomeActive •applicationDidBecome

  • 音乐的种类

    古典 古典音乐有广义、狭义之分。1750-1820也称之为维也纳古典音乐派 复杂多样的创造技术和所能承载的厚重内涵而有别于通俗音乐和民间音乐。 流行(商品音乐) 是指以盈利为主要目的而创作的音乐。它是市场性主要的,艺术性是次要的。 摇滚 就是三和弦加强硬持续的鼓点加上口的旋律 嘻哈 五种表现方式rap、b-boying(街舞)、dj-ing(玩唱片及唱盘技巧)、graffitiwriting(涂鸦艺术)、beat-box(口技) 乡村 也成为乡村与西部。曲调简单,节奏平稳,带有叙事性,具有较浓的乡土气息。 民谣 又称民间歌谣、民俗音乐、民间短篇诗歌等,简称民谣、民歌、民乐或民曲, 于国际民间音乐协会(IFMC)之解释定义为经过口传过程发展起来的普罗大众音乐,也就是该音乐散布过程, 纯粹是由演奏者或音乐接收者记录教习,并亲自相传所得。 电子音乐 广义而言,只要是使用电子设备所创造的音乐,都可属之。 任何以电子合成器、效果器、电脑音乐软件、鼓机等“乐器”所产生的电子声响,都可合理地称为电子音乐。 极狭义而言,电子音乐指涉科技(Techno)、出神(Trance)等种类的乐曲。 爵士 即兴&

  • 3.17-3.18比赛记录

        假期没有出去……恰好17号晚上有一场8:00-9:40的ARC092非常适合衡中作息时间,于是就去打了,虽然是英文题面但是题意还是十分好懂,大概是我很喜欢的类型。18号晚上的UR17是大家集体参赛,第一次打UOJ的比赛果然非常interesting。考虑到罚时问题以及感觉自己再怎么样也写不了很多分,最开始就把B题和C题的骗分程序交上去了,A题提交大概也在九点之前。因为是集体比赛就比较正规,19号大半天都用来改题了。难度上当然是UR大一些,不过两场比赛各有特点,选手体验都不错?都是第一次参赛所以都没有掉Rating,ARC只A了C题因为罚时少拿了553Rating,UR尽管只有10+5+10还是+68。   ARC092 比赛链接与官方题解 C 题意:是给出红点蓝点各$n$个,如果一个红点横纵坐标都小于一个蓝点则它们可以配对,每个点只能用一次,问最多有多少对。$n<=100$ 题解:这题难道不是在开玩笑吗……二分图网络流随便跑啊……官方题解给出的是贪心,按横坐标递增处理蓝点,对于每一个蓝点选可行红点中纵坐标最大的。 1#

  • 关于苹果开发你要知道的事

    1、四种类型证书 1.1、个人开发者 99美元/年(提供个人信息即可) 1.2、公司开发者 99美元/年 1.3、企业开发者 299美元/年 1.4、高校开发者 免费 2、苹果证书 2.1、开发者证书(分为开发和发布)基证书,证明自己是开发者 2.2、appID每个应用的独立标识 2.3、推送证书(分为开发和发布) 2.4、ProvisioningProfile(PP文件)该文件是将appID、开发者证书、硬件Device绑定到一起。 3、理解证书与描述文件 3.1、我们向Apple申请证书是在干什么? 我们向Apple申请证书,就是向权力机关(Apple)申请资格(开发/推送/发布...)而Apple颁发给我们的证书就是对资格的证明 3.2、申请证书时,为什么要有CSR CSR就是提供证书时自己的不是别人的 CSR生成的同时,生成一对私钥公钥。私钥保存在本地,用来加密数据或者解密公钥加密的数据,公钥包含在CSR中。 3.3、为什么要通过.p12文件来传递证书? 因为直接从Apple下载的证书只有公钥,没有办法证明这个证书是你的。而从本地钥匙串中

  • 社会需要真情

    评论有关一部电影《分手大师》,我是在朋友推荐下看的电影,我是被邓超的反串风格和他那浮夸演技给惊吓了,一部电影下来,这让我想到了当年的周星星,好像是邓超的showtime,一个人演的笑点那么多,却没有一种突兀的感觉。 谈完演员,就谈谈剧情,在此之前,就像没有听过下雨天和巧克力更配,也没有听过分手能和大师能够搭配,在现在谈及分手成了负担的社会背景下,分手大师应运而生,因为唐大师心中的成功学,一场莫名其妙的邂逅按照计划开始了,要说下去,不得不说说唐大师,他口中时常宣扬他的成功学,就像一次他带着小春和分手大师去一个湖中央的小城堡,他语气极尽傲慢地说普通人有钱还买不到,这种待遇只有成功人士能享受,甚至在湖里给成功二字来了个特写,可是最后当被问起成功是什么,他却说不出一个所以然,这个社会的确存在这种目光浅陋的人。当金钱与感情挂上钩,感情不再像初始般纯澈了,这场不仅是金钱的交易,还是感情的交易,当金钱发生转移,感情的羁绊也断了。好好保护珍惜的感情,也像现在常说的多点真诚。 剧情值得一提是男主与女主的感情经历,互相拉扯中终成眷属,男主说过的一句话我记得很深,这座大城市像一个巨大的山谷,只要你努力地大声

  • Python合并Excel表格

      一、合并路径下所有后缀xlsx工作薄第一个表格内容 importos importxlrd importpandasaspd #获取所有需要合并的工作簿路径,生成list deffile_name(file_dir): list=[] forfileinos.listdir(file_dir): ifos.path.splitext(file)[1]=='.xlsx':#选取后缀为xlsx的文件 list.append(file) returnlist path=r'C:/Users/xx/Desktop' wks=file_name(path) data=[]#定义一个空list foriinrange(len(wks)): read_xlsx=xlrd.open_workbook(path+'/'+wks[i]) sheet1=read_xlsx.sheets()[0]#查看sheet1的数据 nrow=sheet1.nrows forjinrange(0,nrow):#逐行打印 data.append(sheet1.row_values(j)) cont

相关推荐

推荐阅读