Diary_2.23
Codeforces Round 1005 (Div. 2)
1. Brogramming Contest
void solve(){
int len; cin >> len;
string s; cin >> s;
s = '0'+s;
len += 2;
int cnt = 0;
for(int i=1; i<len; i++){
if(s[i] != s[i-1]) cnt++;
}
cout << cnt-1 << endl;
}
2. Variety is Discouraged
void solve(){
int n; cin >> n;
int a[n];
map<int, int> q;
for(int i=0; i<n; i++){
cin >> a[i];
q[a[i]]++;
}
int len = -1, ansl = -1, ansr = -1;
for(int i=0; i<n; i++){
if(q[a[i]] == 1){
int pos = i+1;
for(int k=pos; k<n; k++){
if(q[a[k]] == 1){
pos++;
}else{
break;
}
}
pos--;
if(pos-i+1 > len){
len = pos-i+1;
ansl = i+1, ansr = pos+1;
}
i = pos;
}
}
if(len == -1){
cout << 0 << endl;
}else{
cout << ansl << ' ' << ansr << endl;
}
}
3. Remove the Ends
#define int long long
void solve(){
int n; cin >> n;
int a[n+2];
for(int i=1; i<=n; i++){
cin >> a[i];
}
int dpl[n+2], dpr[n+2];
memset(dpl, 0, sizeof(dpl));
memset(dpr, 0, sizeof(dpr));
for(int i=1; i<=n; i++){
if(a[i] > 0){
dpl[i] = dpl[i-1]+a[i];
}else{
dpl[i] = dpl[i-1];
}
}
for(int i=n; i>=1; i--){
if(a[i] < 0){
dpr[i] = dpr[i+1]-a[i];
}else{
dpr[i] = dpr[i+1];
}
}
int ans = 0;
for(int i=1; i<=n; i++){
ans = max(dpl[i]+dpr[i], ans);
}
cout << ans << endl;
}
用时36分钟,rank大概在 2500 左右,表现分 1600 左右
然后后面的就做不出来了
其他的有价值的题
1. Connections in Galaxy War
const int maxn = 1e4+10;
int n, power[maxn], pre[maxn], m, q, ans[5*maxn];
struct node{
int l, r;
node(){}
node(int x, int y){
l = x, r = y;
}
bool operator<(const node &x)const{
if(l == x.l) return r < x.r;
return l < x.l;
}
};
struct noded{
string op;
int u, v;
};
map<node, bool> tree;
noded query[5*maxn];
int find(int now){
if(pre[now] == now) return now;
return pre[now] = find(pre[now]);
}
void init(){
for(int i=0; i<=n; i++) pre[i] = i;
map<node, bool> ctree; swap(ctree, tree);
for(int i=0; i<n; i++) cin >> power[i];
cin >> m;
for(int i=0; i<m; i++){
int u, v; cin >> u >> v;
tree[node(u, v)] = true;
}
}
void solve(){
init();
cin >> q;
string op;
int u, v;
for(int i=0; i<q; i++){
cin >> op;
if(op == "query"){
cin >> u;
query[i].u = u;
}else{
cin >> u >> v;
tree[node(u, v)] = false;
tree[node(v, u)] = false;
query[i].u = u, query[i].v = v;
}
query[i].op = op;
ans[i] = -2;
}
for(auto &x: tree){
if(x.second){
u = x.first.l, v = x.first.r;
int ru = find(u), rv = find(v);
if(ru == rv) continue;
// 根据权值和编号确定根节点
if(power[ru] < power[rv]) pre[ru] = rv;
else if(power[ru] > power[rv]) pre[rv] = ru;
else{
if(ru < rv) pre[rv] = ru;
else pre[ru] = rv;
}
}
}
for(int i=q-1; i>=0; i--){
if(query[i].op == "query"){
u = query[i].u;
int ru = find(u);
if(power[ru] > power[u]) ans[i] = ru;
else ans[i] = -1;
}else{
u = query[i].u, v = query[i].v;
int ru = find(u), rv = find(v);
if(ru == rv) continue;
if(power[ru] < power[rv]) pre[ru] = rv;
else if(power[ru] > power[rv]) pre[rv] = ru;
else{
if(ru < rv) pre[rv] = ru;
else pre[ru] = rv;
}
}
}
int t = 0;
for(int i=0; i<q; i++){
if(ans[i] != -2){
if(t) cout << endl;
cout << ans[i];
t++;
}
}
}
signed main(){
io;
Test;
int t; t=0;
// cin >> t;
cin >> n;
do{
if(t) cout << endl << endl; // 这道题的数据规则很奇特
solve();
t++;
}while(cin >> n);
}
2. Navigation Nightmare
const int maxn = 4e4+10;
int n, m, k, pre[maxn], x[maxn], y[maxn], ans[maxn];
struct Edge{
int u, v, w;
char dir;
};
struct Query{
int u, v, step, pos;
bool operator<(const Query &x)const{
return step < x.step;
}
};
Edge edge[maxn];
Query query[2*maxn];
int find(int now){
if(pre[now] == now) return now;
int r = find(pre[now]);
x[now] += x[pre[now]];
y[now] += y[pre[now]];
return pre[now] = r;
}
void get_data(){
cin >> n >> m;
map<char, int> Op;
Op['W'] = -1, Op['E'] = 1, Op['S'] = 1, Op['N'] = -1;
for(int i=0; i<m; i++){
cin >> edge[i].u >> edge[i].v >> edge[i].w >> edge[i].dir;
edge[i].w *= Op[edge[i].dir];
}
cin >> k;
for(int i=0; i<k; i++){
cin >> query[i].u >> query[i].v >> query[i].step;
query[i].pos = i;
}
sort(query, query+k);
for(int i=0; i<=n; i++) pre[i] = i;
}
void solve(){
get_data();
int cnt = 0, u, v, w;
char dir;
for(int i=0; i<k; i++){
int r = query[i].step;
for(int j=cnt; j<r; j++){
u = edge[j].u, v = edge[j].v, w = edge[j].w, dir = edge[j].dir;
int ru = find(u), rv = find(v);
if(ru == rv) continue;
pre[ru] = rv;
if(dir=='W' || dir=='E'){
x[ru] = w-x[u]+x[v];
y[ru] = -y[u]+y[v];
}else{
x[ru] = -x[u]+x[v];
y[ru] = w-y[u]+y[v];
}
}
cnt = r;
u = query[i].u, v = query[i].v;
int ru = find(u), rv = find(v), pos = query[i].pos;
if(ru == rv) ans[pos] = abs(x[u]-x[v])+abs(y[u]-y[v]);
else ans[pos] = -1;
}
for(int i=0; i<k; i++) cout << ans[i] << endl;
}

浙公网安备 33010602011771号