比赛打的不好,可能是第一次组队,配合不好,两位队友很强,我躺。
还是说题吧。
A Different Rectangle:
本来以为和以前积分赛出过的方阵DP差不多,仔细看题发现不是方阵,而是矩阵,而且关系也没有那么简单的,就放弃了。
回来慢慢补。
B 问题:
第一眼看以为和前天的CF的b题一样,因为那道b题开黑的时候是我做的,于是想都没想果断敲,敲完过样例,样例都没过。然后认真看题。。又是这句话。。发现应该是二进制枚举,果断换人敲,敲完AC。
C Find:
完完全全的水题,可是第二次提交的时候应该是没有保存,然后就愉快的把正确答案排除了。。最后WA了快三十发,才过。。罚时爆炸,愉快垫底。
D Happy Path:
简单的DFS问题,不过比赛的时候看到题上说无环,却没有想过会不会有重边,如果想到的话应该可以AC,比较遗憾。
附上赛后AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
const ll mod = 1e9 + 7;
vector<int > e[N];
ll cnt[N];
ll dfs(int x){
if(cnt[x]) return cnt[x];
int size = e[x].size();
cnt[x] = size;
for(int i=0;i<size;++i){
cnt[x] += dfs(e[x][i]);
cnt[x] %= mod;
}
return cnt[x];
}
int main(int argc, char const *argv[])
{
int T,n,m,a,b;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
for(int i=0;i<=n;++i) e[i].clear(),cnt[i] = 0;
for(int i=1;i<=m;++i){
scanf("%d %d",&a,&b);
e[a].push_back(b);
}
for(int i=1;i<=n;++i){
sort(e[i].begin(),e[i].end());
e[i].erase(unique(e[i].begin(),e[i].end()),e[i].end());
}
ll ans = 0;
for(int i=1;i<=n;++i){
ans += dfs(i);
ans %= mod;
}
printf("%lld\n", ans);
}
return 0;
}
本来去完重边还WA了一发,卡了好久没看出错误。
然后发现这个OJ竟然不支持%I64d,换%lld就AC了,神奇。。
E Sequence:
水题。
F Blow Balloons:
模拟题,没啥好说的。
G money:
这道题只有一中的OI过了,本来以为很简单的只有每个点都顺时针逆时针遍历一遍就好了,然后队友给我举了一个 -1,1,-1,1
的反例,然后发现不会写,弃。
H Color ring:
DFS判环,队友写的,一发AC,太强。
赛后补题,又写了好久。。WA完TLE,TLE完WA,最后换了写法才对,本来写了回溯,发现没有必要,回溯会TLE。
AC代码:
#include <bits/stdc++.h>
using namespace std;
char mp[55][55];
bool vis[55][55];
int n,m,sx,sy,flag;
bool check(char ch,int x,int y){
if(mp[x][y] == ch && x>=0 && x<n && y>=0 && y<m) return 1;
else return 0;
}
int d[4][2] = {0,1,0,-1,1,0,-1,0};
void dfs(int x,int y,int step){
int dx,dy;
// printf("%d %d\n",x,y );
for(int i=0;i<4;++i){
dx = x + d[i][0];
dy = y + d[i][1];
if(check(mp[x][y],dx,dy)){
if(!vis[dx][dy]){
vis[dx][dy] = 1;
dfs(dx,dy,step+1);
}
else if(step>=4 && dx == sx && dy == sy){
flag = 1;
return;
}
}
}
}
int main(int argc, char const *argv[])
{
while(scanf("%d %d",&n,&m) != EOF){
memset(vis,0,sizeof(vis));
flag = 0;
for(int i=0;i<n;++i) scanf("%s",mp[i]);
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
sx = i;sy = j;
if(!vis[sx][sy]){
vis[sx][sy] = 1;
dfs(sx,sy,1);
}
if(flag) break;
}
if(flag) break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}
I 求和:
队友写的,我是一点印象都没。。补了一下,贴下代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int T;
ll n,m,ans;
scanf("%d",&T);
while(T--){
scanf("%lld %lld",&n,&m);
ans = 0;
for(int i = min(m,32ll);i>=0;--i){
if(n >= (1ll<<i)){
ans += n/(1ll<<i);
n %= 1ll<<i;
}
}
printf("%lld\n",ans);
}
return 0;
}
J Ball King:
辣鸡线段树,连个更新都没,建完树,输出就完事了。
有一点就是题目上没有说选手个数是2的次方数,不过如果不是的话,比赛不公平,可能是规则暗示了。
K Vector field:
积分题,只要把原函数算出来就能AC,不过好久没碰了,比赛的时候都没看懂是个啥玩意。。果然 高数这种东西就是学完就扔。
总的来说,这次应该是能写9道,差一道D题没搞出来,学长们说这次8道水题。。
尴尬。被OI暴捶,感受了一下可怕的高中生。
犯了一些错误,比如没有看清楚题目就敲,敲完发现思路不对。。太浪费时间了,以后要注意。不要抢题,应该多开题的。