ABC 210
A
按题意模拟。
scanf("%lld%lld%lld%lld",&n,&a,&x,&y);
std::cout<<n * x - (x - y) * std::max(n - a,0ll);
B
判断第一个 \(1\) 的位置的奇偶性。
scanf("%lld",&n);
scanf("%s",a + 1);
for(int i = 1;i <= n;++i){
if(a[i] == '1'){
if(i % 2)
puts("Takahashi");
else
puts("Aoki");
return 0;
}
}
C
用 \(map\) 记录每个 \(k\) 长度区间的每个颜色的出现情况。
每次向右移一位,则把前者移除,后者加入。
scanf("%lld%lld",&n,&k);
for(int i = 1;i <= n;++i){
scanf("%lld",&c[i]);
}
ll now = 0,ans = 0;
for(int i = 1;i <= k;++i){
QWQ[c[i]] ++ ;
if(QWQ[c[i]] == 1)
now ++ ;
}
ans = now;
for(int i = k + 1;i <= n;++i){
QWQ[c[i - k]] -- ;
if(QWQ[c[i - k]] == 0)
now -- ;
QWQ[c[i]] ++ ;
if(QWQ[c[i]] == 1)
now ++ ;
ans = std::max(now,ans);
}
std::cout<<ans<<std::endl;
D
考虑先考虑行的贡献,先把 \(a_{i,j} \to a_{i,j} + i * c\) ,并预处理出每行每列下的最小值。
然后我们按列按行枚举,在枚举第 \(i\) 列时,先把对应的行下的最小值区间,把 \([1,i]\) 加 \(c\),\([i + 1,n]\) 减 \(c\) ,可以使用线段树维护,然后查询最小值就好了。
同时要考虑在同行的操作,复杂度 \(O(nlogn)\) 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define ll long long
#define N 1005
#define lowbit(x) (x & -x)
ll a[N][N],k[N][N],pre[N][N],s[N][N];
ll h,w,c;
struct P{
ll v,tag;
P(){v = tag = 0;}
};
struct segment{
P t[N << 2];
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define mid ((l + r) >> 1)
inline void up(int u){
t[u].v = std::min(t[ls(u)].v,t[rs(u)].v);
}
inline void push_down(int u){
if(t[u].tag){
t[ls(u)].v += t[u].tag;
t[ls(u)].tag += t[u].tag;
t[rs(u)].v += t[u].tag;
t[rs(u)].tag += t[u].tag;
t[u].tag = 0;
}
}
inline void add(int u,int l,int r,int tl,int tr,ll p){
if(tl <= l && r <= tr){
t[u].v += p;
t[u].tag += p;
return ;
}
push_down(u);
if(tl <= mid)
add(ls(u),l,mid,tl,tr,p);
if(tr > mid)
add(rs(u),mid + 1,r,tl,tr,p);
up(u);
}
}e[N];
ll ans = 9e18;
ll f[N];
int main(){
scanf("%lld%lld%lld",&h,&w,&c);
for(int i = 1;i <= h;++i)
for(int j = 1;j <= w;++j)
scanf("%lld",&a[i][j]),k[i][j] = a[i][j];
for(int i = 1;i <= h;++i)
for(int j = 1;j <= w;++j)
k[i][j] += i * c;
// for(int i = 1;i <= h;++i,puts(""))
// for(int j = 1;j <= w;++j)
// std::cout<<k[i][j]<<" ";
for(int i = 1;i <= w;++i)
for(int j = h;j >= 1;--j){
if(j == h)continue;
k[j][i] = std::min(k[j + 1][i],k[j][i]);
}
for(int i = 1;i <= h;++i)
for(int j = 1;j <= w;++j)
k[i][j] += (j - 1)*c;
// for(int i = 1;i <= h;++i,puts(""))
// for(int j = 1;j <= w;++j)
// std::cout<<k[i][j]<<" ";
// puts("");
for(int i = 1;i <= h;++i)
for(int j = 1;j <= w;++j)
e[i].add(1,1,w,j,j,k[i][j]);
// for(int j = 1;j <= w;++j)
// for(int i = 1;i <= h;++i)
// std::cout<<e[i].t[1].v<<std::endl;
for(int i = 1;i <= h - 1;++i)
ans = std::min(ans,1ll * e[i + 1].t[1].v + a[i][1] - i * c);
for(int i = 2;i <= w;++i)
for(int j = 1;j <= h - 1;++j){
e[j + 1].add(1,1,w,1,i - 1,c);
e[j + 1].add(1,1,w,i,w,-c);
ans = std::min(ans,1ll * e[j + 1].t[1].v + a[j][i] - j * c);
}
for(int i = 1;i <= h;++i){
std::memset(f,0x7f,sizeof(f));
for(int j = 1;j <= w;++j){
if(j != 1)
f[j] = f[j - 1] + c;
ans = std::min(ans,f[j] + a[i][j]);
f[j] = std::min(f[j],a[i][j]);
}
}
std::cout<<ans<<std::endl;
}
F
维护循环节就好。
按代价排序,并维护循环节至 \(1\) 。
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
pii a[100005];
int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); }
signed main() {
ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
for (register int i = 1; i <= m; i++) cin >> a[i].second >> a[i].first;
sort(a + 1, a + m + 1);
int answer = 0;
for (register int i = 1; n > 1 && i <= m; i++) {
int tn = gcd(n, a[i].second);
answer += (n - tn) * a[i].first;
n = tn;
}
if (n > 1)
cout << -1 << endl;
else
cout << answer << endl;
return 0;
}
ABC 210的更多相关文章
- 算法竞赛入门经典 习题2-10 排列(permutation)
习题2-10 排列(permutation) 用1,2,3,-,9组成3个三位数 abc, def, 和ghi,每个数字恰好使用一次,要求 abc:def:ghi = 1:2:3.输出所有解.提示:不 ...
- 算法竞赛入门经典 习题 2-10 排列(permutation)
习题 2-10 用1,2,3.....,9组成3个三位数abc.def和ghi,每一个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出全部解. #include <stdio.h& ...
- 【IOS】将一组包含中文的数据按照#ABC...Z✿分组
上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...
- 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }
平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...
- 学习Python的ABC模块(转)
http://yansu.org/2013/06/09/learn-Python-abc-module.html 1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助a ...
- 将abc的全排列输出
#include "iostream" using namespace std; void swap(char a[],int i,int j){ char temp; temp= ...
- 关于String str =new String("abc")和 String str = "abc"的比较
String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...
- IE9 使用document.getElementsByName("abc") 不能获取到名称相同SPAN元素
<div name="abc"></div> <input name="abc" type="text" /& ...
- 经典String str = new String("abc")内存分配问题
出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没 ...
随机推荐
- 求求你了,用Docker吧
这是一个开始使用 Docker 的 Tutorial 大无语事件发生!大数据课实验课要用到Hadoop,实验指导是在一个Ubuntu虚机上通过安装包安装Hadoop并运行一个词频统计程序,整个实验就是 ...
- 极速上手 VUE 3 —— teleport传送门组件
一.teleport 介绍 teleport 传送门组件,提供一种简洁的方式,可以指定它里面的内容的父元素.通俗易懂地讲,就是 teleport 中的内容允许我们控制在任意的DOM中,使用简单. 使用 ...
- 吴恩达课后习题第二课第三周:TensorFlow Introduction
目录 第二课第三周:TensorFlow Introduction Introduction to TensorFlow 1 - Packages 1.1 - Checking TensorFlow ...
- Python之@property详解及底层实现介绍
转自:https://blog.csdn.net/weixin_42681866/article/details/83376484 前文 Python内置有三大装饰器:@staticmethod(静态 ...
- 寻找下一个结点 牛客网 程序员面试金典 C++ java Python
寻找下一个结点 牛客网 程序员面试金典 C++ java Python 题目描述 请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继). 给定树的根结点指针TreeNode* root ...
- poj 2226 Muddy Fields(最小点覆盖)
题意: M*N的矩阵,每个格不是*就是#. *代表水坑,#代表草地. 农民要每次可以用一块宽为1,长不限的木板去铺这个矩阵.要求这块木板不能覆盖草地.木板可以重复覆盖(即一块木板与另一块木板有 ...
- XOR算法
原理 依据的是异或门 即同为0,异为1 0^0=0 0^1=1 1^0=1 1^1=0 对一个数据进行两次XOR运算会得到这个数据本身 所以加密时就将message和其对应的key进行一波XOR运算得 ...
- filter tools
// 过滤商品分类 Vue.filter("cateFilter", (data) => { let tmp = ["一级分类", "二级分 ...
- centos安装pm2报错
报错信息: /usr/lib/node_modules/pm2/node_modules/chalk/source/index.js:103 ...styles, 这个问题其实很简单,就是npm和no ...
- C++ pragma once 与 ifndef 用法区别
#pragma once 与 #ifndef 的作用 (1)在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性. (2)在能够支持这两种方式的编译器上,二者并没有太大的 ...