Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)
A - Toy Train
很显然,一个站有多少个糖,那么就要从这个点运多少次。设第i个点有\(a_i\)个糖,那么就要转\(a_i-1\)圈,然后再走一段。很显然最后一段越小越好。
然后枚举起点后,每个点的答案就是起点到他的距离加上再走的距离。然后取个max就好了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
#define vi vector<int>
#define vit vector<int>::iterator
#define pir pair<int,int>
#define fr first
#define sc second
#define mp(x,y) make_pair(x,y)
using namespace std;
inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
}
typedef long long ll;
const int Maxn=1100000;
const ll inf=0x3f3f3f3f3f3f3f3fll;
int n,m,a[Maxn],b[Maxn],x,y;
signed main() {
// freopen("test.in","r",stdin);
read(n,m);
memset(b,0x3f,sizeof(b));
for(int i=1;i<=m;i++) {
read(x,y);
a[x]++;
if(y>x) qmin(b[x],y-x);
else qmin(b[x],y+n-x);
}
for(int i=1;i<=n;i++) if(!a[i]) b[i]=0;
for(int i=1;i<=n;i++) {
int ans=0;
for(int j=1;j<=n;j++) {
int temp;
if(j>=i) temp=j-i;
else temp=j+n-i;
temp+=(a[j]-1)*n+b[j];
qmax(ans,temp);
}
printf("%d ",ans);
}
return 0;
}
B - Wrong Answer
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
#define vi vector<int>
#define vit vector<int>::iterator
#define pir pair<int,int>
#define fr first
#define sc second
#define mp(x,y) make_pair(x,y)
using namespace std;
inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
}
typedef long long ll;
const int Maxn=1100000;
const ll inf=0x3f3f3f3f3f3f3f3fll;
int k;
signed main() {
// freopen("test.in","r",stdin);
read(k);
int temp=1999-k%1999;
puts("2000");
for(int i=1;i<=1998;i++) printf("0 ");
printf("%d ",-temp);
printf("%d\n",(k+temp)/1999+temp);
return 0;
}
C - Morse Code
首先,直接n方DP求每一段能代表的字符串的个数很简单,然后因为相同的子串只能统计一次答案,那么就用一颗trie树来存就好了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
#define vi vector<int>
#define vit vector<int>::iterator
#define pir pair<int,int>
#define fr first
#define sc second
#define mp(x,y) make_pair(x,y)
using namespace std;
inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
}
typedef long long ll;
const int Maxn=11000000;
const int inf=0x3f3f3f3f;
const int mod=1000000007;
int n,f[5100],a[Maxn],ans,ch[Maxn][2],cnt=1;
signed main() {
// freopen("test.in","r",stdin);
read(n);
f[0]=1;
for(int i=1;i<=n;i++)
read(a[i]);
for(int i=1;i<=n;i++) {
memset(f,0,sizeof(f));
f[i+1]=1;
int now=1;
for(int j=i;j>=1;j--) {
for(int k=1;k<=3;k++) f[j]=(f[j]+f[j+k])%mod;
if(j<=i-3) {
if(!a[j]) {
if(a[j+1]) {
if(a[j+2]||!a[j+3]) f[j]=(f[j]+f[j+4])%mod;
}
else {
if(!a[j+2]||!a[j+3]) f[j]=(f[j]+f[j+4])%mod;
}
}
else
if(a[j+3]) {
if(!a[j+1]||!a[j+2]) f[j]=(f[j]+f[j+4])%mod;
}
else if(!a[j+1]||!a[j+2]) f[j]=(f[j]+f[j+4])%mod;
}
if(!ch[now][a[j]]) {
ch[now][a[j]]=++cnt;
ans=(ans+f[j])%mod;
}
now=ch[now][a[j]];
}
printf("%d\n",ans);
}
return 0;
}
D - Isolation
枚举右端点,然后把每个数字最后一次出现的位置设为1,倒数第二次出现的位置设为-1,这样,如果一个后缀和小于等于k,就可以转移。
然后进行分块,每一块记总和和后缀小于等于一个数的dp值的和即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#include<cmath>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
#define vi vector<int>
#define vit vector<int>::iterator
#define pir pair<int,int>
#define fr first
#define sc second
#define mp(x,y) make_pair(x,y)
using namespace std;
inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
}
typedef long long ll;
const int Maxn=110000;
const int inf=0x3f3f3f3f;
const int mod=998244353;
int bn[Maxn],bl[Maxn],br[Maxn],f[Maxn],b[Maxn],a[Maxn],in[Maxn],bf[500][1000],n,k,las[Maxn],pre[Maxn];
inline int modd(int x) {
return x>=mod?x-mod:x;
}
void update(int x) {
memset(bf[x],0,sizeof(bf[0]));
bn[x]=0;
for(int i=br[x];i>=bl[x];i--) {
bf[x][bn[x]+500]=modd(bf[x][bn[x]+500]+f[i]);
bn[x]+=b[i];
}
for(int i=1;i<1000;i++) bf[x][i]=modd(bf[x][i]+bf[x][i-1]);
}
signed main() {
// freopen("test.in","r",stdin);
read(n,k);
int m=sqrt(n);
memset(bl,0x3f,sizeof(bl));
memset(las,-1,sizeof(las));
memset(pre,-1,sizeof(pre));
f[0]=1;
for(int i=0;i<=n;i++) {
in[i]=i/m;
qmin(bl[in[i]],i);
qmax(br[in[i]],i);
}
update(0);
for(int i=1;i<=n;i++) {
read(a[i]);
if(~las[a[i]]) {
pre[i]=las[a[i]];
b[las[a[i]]]=-1;
update(in[las[a[i]]]);
if(~pre[las[a[i]]]) {
b[pre[las[a[i]]]]=0;
update(in[pre[las[a[i]]]]);
}
}
b[i]=1;
int now=1;
for(int j=i-1;j>=bl[in[i]];j--) {
if(now<=k) f[i]=modd(f[i]+f[j]);
now+=b[j];
}
for(int j=in[i]-1;j>=0;j--) {
if(k-now+500>0) f[i]=modd(f[i]+bf[j][min(k-now+500,999)]);
now+=bn[j];
}
update(in[i]);
las[a[i]]=i;
}
printf("%d\n",f[n]);
return 0;
}
Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)的更多相关文章
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题解
Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题目链接:https://codeforces.com/contest/1130 ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1) C(二分+KMP)
http://codeforces.com/contest/1129/problem/C #include<bits/stdc++.h> #define fi first #define ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) A - D2
A. Be Positive 链接:http://codeforces.com/contest/1130/problem/A 题意: 给一段序列,这段序列每个数都除一个d(−1e3≤d≤1e3)除完后 ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2)
A. Be Positive 题意:给出一个数组 每个树去除以d(d!=0)使得数组中大于0的数 大于ceil(n/2) 求任意d 思路:数据小 直接暴力就完事了 #include<bits/s ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)C. Morse Code
题意:给你n个01字符,每次问你前缀的所有本质不同的子串,由摩斯密码组成的方案数和. 题解:离线处理,把字符建sam,通过topo序来dp计算每个节点表示的子串方案数的和.统计答案时,把n个字符挨个匹 ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1) 题解
A. Toy Train 时间限制:2 seconds 内存限制:256 megabytes 题意 有编号111~n(n≤5000)n(n\le 5000)n(n≤5000)的车站顺时针呈环排列,有m ...
- Codeforces Round 542 (Div. 2)
layout: post title: Codeforces Round 542 (Div. 2) author: "luowentaoaa" catalog: true tags ...
- Codeforces Round #542 题解
Codeforces Round #542 abstract I决策中的独立性, II联通块染色板子 IIIVoronoi diagram O(N^2 logN) VI环上距离分类讨论加取模,最值中的 ...
- int和integer;Math.round(11.5)和Math.round(-11.5)
int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...
随机推荐
- Servlet----------Servlet 的映射路径细节
在使用servlet时候,有些时候都需要自己来配置web.xml文件,在配置的时候,我们可以配置多个<url-pattern></url-pattern> 比如在这里绑定了3个 ...
- 看懂Oracle执行计划、表连接方式
看懂Oracle执行计划 原文:https://www.cnblogs.com/Dreamer-1/p/6076440.html 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也 ...
- ext3日志模式
ext3日志模式 http://blog.sina.com.cn/s/blog_5d4ab4b40100dosx.html ext3支持多种日志模式 ext3 是ext2文件系统的高一级版本,完全兼容 ...
- redhat7:用户、组和权限
用户: 任何用户被分配一个独特的用户id号(UID) (UID 0标识root用户 用户账号通常从UID 1000开始(在redhat6及之前的版本,从500开始)) . 用户名和UID信息 ...
- react-native run-android error: unknown host service
D:\rnworkspace\Hello>react-native run-android JS server already running.Running D:\Android\sdk/pl ...
- phpmyadmin-配合nginx与php安装
1. 概况 phpMyAdmin是用来在网页端图形化操作MySQL数据库的工具,使用起来非常直观,目前最新版本是4.8.3.在搭建web集群架构时可能有这样的需求,数据库安装在专门的一台机器上,但是希 ...
- [LeetCode] 42. Trapping Rain Water_hard tag: Two Pointers
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- PHP查询MySQL大量数据的内存占用分析
这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于M ...
- C#导出Excel总结
一.asp.net中导出Execl的方法:在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器 ...
- mongodbtemplate配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...