612A - The Text Splitting    20171121

简单字符串处理题

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,p,q;
string s;
void print(int _)
{
int k=_+(n-_*p)/q;
printf("%d\n",k);
for(int i=;i<_;i++)
{
for(int j=;j<p;j++)
printf("%c",s[i*p+j]);
printf("\n");
}
for(int i=_;i<k;i++)
{
for(int j=;j<q;j++)
printf("%c",s[_*p+(i-_)*q+j]);
printf("\n");
}
}
int main()
{
scanf("%d%d%d",&n,&p,&q);
cin>>s;
for(int i=;i*p<=n;i++)
if((n-i*p)%q==)
return print(i),;
return printf("-1\n"),;
}

612B - HDD is Outdated Technology    20171121

设\(p_{f_i}=i\),则有\(ans=\sum_{i=2}^{n}|p_i-p_{i-1}|\)

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
int n,f,p[];
LL ans;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&f),p[f]=i;
for(int i=;i<=n;i++)
ans+=1ll*abs(p[i]-p[i-]);
printf("%I64d\n",ans);
return ;
}

612C - Replace To Make Regular Bracket Sequence    20171121

根据题意扫一遍就好了

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int ans;
string s;
stack<char>_;
bool check(char a,char b)
{
if(a=='<' && b=='>')return true;
if(a=='{' && b=='}')return true;
if(a=='[' && b==']')return true;
if(a=='(' && b==')')return true;
return false;
}
int main()
{
cin>>s;
for(int i=;i<s.size();i++)
{
if(s[i]=='<')_.push('<');
if(s[i]=='{')_.push('{');
if(s[i]=='[')_.push('[');
if(s[i]=='(')_.push('(');
if(s[i]=='>' || s[i]=='}' || s[i]==']' || s[i]==')')
if(!_.size())return printf("Impossible\n"),;
else ans+=!check(_.top(),s[i]),_.pop();
}
if(_.size())return printf("Impossible\n"),;
return printf("%d\n",ans),;
}

612D - The Union of k-Segments    20171121

将线段按左端点排序,通过优先队列(存储内容为线段的右端点)在每次访问一个线段时将已经无效的线段删去,获取仍有效的线段数即可

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct rua{int l,r;}a[];
priority_queue<int,vector<int>,greater<int> >q;
bool cmp(rua x,rua y){return x.l<y.l || (x.l==y.l && x.r>y.r);}
int n,k,ll,rr,INF=-;vector<int>ans[];
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r);
sort(a+,a+n+,cmp);rr=INF;
for(int i=;i<=n;i++)
{
while(q.size() && q.top()<a[i].l)q.pop();
if(q.size()<k)
{
if(rr!=INF)
ans[].push_back(ll),ans[].push_back(rr);
if(rr<a[i].l)rr=INF;
ll=a[i].l;
}
q.push(a[i].r);
while(q.size()>k)q.pop();
if(q.size()==k)rr=max(rr,q.top());
}
if(rr!=INF)ans[].push_back(ll),ans[].push_back(rr);
printf("%d\n",ans[].size());
for(int i=;i<ans[].size();i++)
printf("%d %d\n",ans[][i],ans[][i]);
return ;
}

612E - Square Root of Permutation    20180910

把\(q_i\)看做是从\(i\)向\(q_i\)连一条有向边,那么可以发现这是一个所有点的入度、出度均为1的有向图,显然这个图是由若干个不相交的环组成的。可以发现,\(p_i\)和\(i\)肯定在一个环内,所以对每个\(i\),可以找出\(i\)所在循环节的大小。若循环节的大小\(sz\)为奇数,那么被遍历的所有点在原图就处于同一个大小为\(sz\)的环内。若\(sz\)为偶数,则需要另外一个大小同为\(sz\)的循环节与其组成大小为\(2\cdot sz\)的环,直接模拟即可。答案无解当且仅当存在偶数\(sz\),使得长度为\(sz\)的循环节个数为奇数。

#include<bits/stdc++.h>
using namespace std;
#define N 1000001
int n,p[N],q[N],c[N],s[N];
bool vis[N];
void Union(int x,int y,int sz)
{
s[sz]=;
for(int i=;i<=sz;i++)
q[x]=y,q[y]=p[x],x=p[x],y=p[y];
}
void rua(int x,int sz)
{
if(sz%==)
if(s[sz]){Union(x,s[sz],sz);return;}
else{s[sz]=x;return;}
c[]=x;
for(int i=,cur=p[x];cur!=x;c[i++]=cur,cur=p[cur]);
for(int i=;i<sz;i++)
if(i*<sz-)q[c[i]]=c[i+(sz+)/];
else q[c[i]]=c[i-(sz-)/];
}
void dfs(int cur,int sz)
{
vis[cur]=true;
if(vis[p[cur]])rua(cur,sz);
else dfs(p[cur],sz+);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&p[i]);
for(int i=;i<=n;i++)
if(!vis[i])dfs(i,);
for(int i=;i<=n;i++)
if(s[i])return printf("-1\n"),;
for(int i=;i<=n;i++)
printf("%d%c",q[i],i<n?' ':'\n');
}

612F - Simba on the Circle    20180911

首先为了方便程序运行,先对a[i]进行离散化处理。

设f[i]表示当小于等于a[i]的数全部选完之后,还要走几步结束

 g[i][j]表示当小于等于a[i]的数全部选完之后,选遍a[i]+1并最终走到j的步数,显然a[j]要满足a[j]=a[i]+1

然后设d[i]是满足a[j]=i的j的集合,这样就有f[j]=min{g[j][d[i+1][k]]+f[d[i+1][k]]}

问题就在于如何求g[i][j]

可以发现,最优的走法有两种,一种是先顺时针走到j的前一项值为a[j]的数,然后再逆时针走到j,另一种则是先逆时针走,再顺时针走到j,两者对应的答案取最小值就好了

思路大概就是这样,但是细节上有很多方面要处理,本弱就因为细节调了快一个小时_(:з」∠)_

#include<bits/stdc++.h>
using namespace std;
#define N 2001
int n,m,s,a[N],p[N],f[N],l[N][N],nxt[N],di[N][N],g[N][N],dis[N][N],vis[N];
vector<int>d[N];
int check1(int op,int ed,int x)
{
if(ed<op)ed+=n;
if(x<op)x+=n;
return x<ed?(x-)%n+:op;
}
int check2(int op,int ed,int x)
{
if(ed<op)ed+=n;
if(x<=op)x+=n;
return x<ed?(x-)%n+:(ed-)%n+;
}
void print(int x)
{
if(x<)printf("%d\n",x);
else printf("+%d\n",x);
}
void rua(int k,int cur)
{
if(k==m)return;
int i=cur?cur:s,cnt=,P=di[cur][nxt[cur]];
if(a[i]==k+)print(),vis[i]=;
while(i!=l[cur][nxt[cur]])
{
i+=P,i=(i+n-)%n+,cnt++;
if(a[i]==k+ && !vis[i])
print(cnt*P),cnt=,vis[i]=;
}
P*=-;
while(i!=nxt[cur])
{
i+=P,i=(i+n-)%n+,cnt++;
if(a[i]==k+ && !vis[i])
print(cnt*P),cnt=;
}
rua(k+,i);
}
int main()
{
memset(f,0x3f,sizeof(f));
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),p[i]=a[i];
sort(p+,p+n+);
m=unique(p+,p+n+)-p-;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[i]==p[j])
{
d[j].push_back(i);
a[i]=j;break;
}
d[].push_back(s);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=(j+n-i)%n;
for(int i=;i<m;i++)
{
int sz=d[i+].size();
for(auto j:d[i])
for(int k=;k<sz;k++)
{
int to=d[i+][k];
int last=check1(j,to,d[i+][(k+sz-)%sz]);
g[j][to]=dis[j][last]+dis[to][last],l[j][to]=last,di[j][to]=;
last=check2(to,j,d[i+][(k+)%sz]);
if(g[j][to]>dis[last][j]+dis[last][to])
g[j][to]=dis[last][j]+dis[last][to],l[j][to]=last,di[j][to]=-;
if(j==to)
g[j][to]=*min(dis[j][d[i+][(k+sz-)%sz]],dis[d[i+][(k+)%sz]][j]),
g[j][to]=min(g[j][to],n);
if(i==)g[][to]=g[j][to],l[][to]=l[j][to],di[][to]=di[j][to];
}
}
d[].pop_back();
d[].push_back();
for(auto i:d[m])f[i]=;
for(int i=m-;i>=;i--)
for(auto j:d[i])
for(auto k:d[i+])
if(f[j]>f[k]+g[j][k])
f[j]=f[k]+g[j][k],nxt[j]=k;
printf("%d\n",f[]);
rua(,);
}

Educational Codeforces Round 4的更多相关文章

  1. [Educational Codeforces Round 16]E. Generate a String

    [Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...

  2. [Educational Codeforces Round 16]D. Two Arithmetic Progressions

    [Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...

  3. [Educational Codeforces Round 16]C. Magic Odd Square

    [Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...

  4. [Educational Codeforces Round 16]B. Optimal Point on a Line

    [Educational Codeforces Round 16]B. Optimal Point on a Line 试题描述 You are given n points on a line wi ...

  5. [Educational Codeforces Round 16]A. King Moves

    [Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...

  6. Educational Codeforces Round 6 C. Pearls in a Row

    Educational Codeforces Round 6 C. Pearls in a Row 题意:一个3e5范围的序列:要你分成最多数量的子序列,其中子序列必须是只有两个数相同, 其余的数只能 ...

  7. Educational Codeforces Round 9

    Educational Codeforces Round 9 Longest Subsequence 题目描述:给出一个序列,从中抽出若干个数,使它们的公倍数小于等于\(m\),问最多能抽出多少个数, ...

  8. Educational Codeforces Round 37

    Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...

  9. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  10. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

随机推荐

  1. log4j2自定义Appender(输出到文件/RPC服务中)

    1.背景 虽然log4j很强大,可以将日志输出到文件.DB.ES等.但是有时候确难免完全适合自己,此时我们就需要自定义Appender,使日志输出到指定的位置上. 本文,将通过两个例子说明自定义APP ...

  2. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  3. PPTP服务端与客户端 修改默认PPTP默认端口1723

    linux pptp服务端:我们在Linux下建立的pptpd端口号默认是1723,有时候这个端口并不是那么的好用,不是麽?所以服务端修改端口号比较简单 修改 /etc/services 文件查找 1 ...

  4. Pilosa文档翻译(一)导言、安装

    目录 导言 安装 安装在MacOS 使用HomeBrew 下载二进制文件 从源码构建 使用Docker 安装在Linux 下载二进制文件 从源码构建 使用Docker 接下来是什么? 导言 原文地址 ...

  5. ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\10.m3u8

    ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\1 ...

  6. Docker在windows下的使用【二】

    可参考学习地址: 极客学院docker教程,还不错,可以参考 1.Dockerhub下载镜像 下载地址:Dockerhub地址 有两种方式可以获得新的镜像 直接从dockerhub下载编译好的imag ...

  7. 评分卡模型剖析之一(woe、IV、ROC、信息熵)

    信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二分类变量的广 ...

  8. redmine在linux上的mysql性能优化方法与问题排查方案

    iredmine的linux服务器mysql性能优化方法与问题排查方案     问题定位:   客户端工具: 1. 浏览器inspect-tool的network timing工具分析   2. 浏览 ...

  9. Effective Java 第三版——68. 遵守普遍接受的命名约定

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  10. 设置 WPF 的内容支持触摸直接滚动

    在滚动内容上设置属性 ScrollViewer.PanningMode 的值即可. 另外可重写 OnManipulationBoundaryFeedback 方法来替换系统默认的滚动到最上最下时触发的 ...