2019/1/20
总体感觉是一场相对简单的div 2,看了榜AK的人也比平时多很多,然而发挥不好,AC 3/5
1787 -> 1787
靠着手速优势居然没掉分,而且分数不变还真是难得= =
A
刚开始的时候刚刚拿完快递,打开电脑已经慢了2分钟了,一时间想不清楚A题好一点的做法就敲了个100n的暴力。
后来发现题解也是这么做的,也有人因此A被hack或者FST,看来敲暴力的选择还是比较明智的。
B
长为n的字符串,求最多有几个长为k并且由同一个字符组成的不相交的子串。
扫一遍,如果遇到长为k的子串就记下来,最后给每个字符的子串数量取个max。
实现上稍微有点不好写。
#include<bits/stdc++.h>
#define forn(i,n) for(int i=0;i<(n);i++)
#define forab(i,a,b) for(int i=(a);i<=(b);i++)
#define forba(i,b,a) for(int i=(b);i>=(a);i--)
#define mset(a,n) memset(a,n,sizeof(a))
#define endl '\n'
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
int a[1005];
int ans[30];
int main()
{
int n,k;
cin >> n >> k;
string s;
cin >> s;
int p = 0;
int temp = 0;
char now = s[0];
while(p<n)
{
if (temp == 0) now = s[p],temp++;
else {
if (s[p] != now) {
temp = 1;
now = s[p];
}
else {
temp++;
}
}
if (temp == k) {
ans[now-'a']++;
temp = 0;
}
p++;
}
int t = 0;
forn(i,26) t = max(ans[i], t);
cout << t << endl;
}
C
感觉是很明显可以用dp做的题所以很快就敲出来了。
唯一卡了一下的是对l r边界的处理
#include<bits/stdc++.h>
#define forn(i,n) for(int i=0;i<(n);i++)
#define forab(i,a,b) for(int i=(a);i<=(b);i++)
#define forba(i,b,a) for(int i=(b);i>=(a);i--)
#define mset(a,n) memset(a,n,sizeof(a))
#define endl '\n'
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
ll dp[maxn][3];
int main()
{
int n,l,r;
cin >> n >> l >> r;
int num[3];
int t = (r+1-l) / 3;
num[0]=num[1]=num[2]=t;
forn(i, (r+1-l) % 3)
{
num[(l+i) % 3]++;
}
dp[0][0] = 1;
forab(i,1,n)
{
forn(k,3)
{
dp[i][k] += dp[i-1][k] * num[0];
dp[i][k] += dp[i-1][(k+2)%3] * num[1];
dp[i][k] += dp[i-1][(k+1)%3] * num[2];
dp[i][k] %= mod;
}
}
cout << dp[n][0] << endl;
}
D
其实并不难想……只要模拟就好了。当时想了别的做法卡了很久。
最后十分钟想到用循环套n个BFS了,然而没敲出来。
结束后两分钟就调出样例了,然后system test结束后交了一发就A了。
本来说不定就紫了 sad 还是水平不够啊
#include<bits/stdc++.h>
#define forn(i,n) for(int i=0;i<(n);i++)
#define forab(i,a,b) for(int i=(a);i<=(b);i++)
#define forba(i,b,a) for(int i=(b);i>=(a);i--)
#define mset(a,n) memset(a,n,sizeof(a))
#define endl '\n'
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int maxn = 1005;
int g[maxn][maxn];
int s[20];
int vis[maxn][maxn];
int n,m,p;
struct node{
int x,y,cnt;
node(int a=0,int b = 0,int c=0):x(a),y(b),cnt(c){
}
};
inline isin(node t)
{
return !g[t.x][t.y]&&t.x>=0&&t.y>=0&&t.x<n&&t.y<m;
}
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
int main()
{
cin >> n >> m >> p;
forn(i,p){
cin >> s[i+1];
if(s[i+1]>m*n)s[i+1]=m*n;
}
queue<node> q[20];
forn(i,n)
{
string t;
cin >> t;
forn(j,m)
{
if(isdigit(t[j])){
g[i][j] = t[j]-'0';
q[t[j]-'0'].push(node(i,j,0));
}
else if(t[j]=='#')g[i][j]=-1;
}
}
for(int k = 1;;k++)
{
int flag = 0;
forab(i,1,p)
{
if(q[i].empty())continue;
flag=1;
while(!q[i].empty())
{
if(q[i].front().cnt==k*s[i]) break;
node t = q[i].front();
q[i].pop();
forn(x,4)
{
node T = node(t.x+dx[x],t.y+dy[x],t.cnt+1);
if(isin(T)){
q[i].push(T);
g[T.x][T.y] = i;
}
}
}
}
if(!flag)break;
}
int ans[20];
mset(ans,0);
forn(i,n)
forn(j,m)
{
if(g[i][j] > 0) ans[g[i][j]]++;
}
forn(i,p)
{
cout << ans[i+1] << ' ';
}
cout << endl;
}
E
建图已经想到了,然而没学过不知道是独立集,浪费了很多时间。
学完独立集回来填坑。