A. water the garden

Code

#include <bits/stdc++.h>
#define maxn 210
using namespace std;
typedef long long LL;
int n, k;
int x[maxn];
void work() {
scanf("%d%d", &n,&k);
for (int i = 0; i < k; ++i) scanf("%d", &x[i]);
sort(x,x+k);
int maxx = max(x[0], n-x[k-1]+1);
for (int i = 0; i < k-1; ++i) {
maxx = max(maxx, (x[i+1]-x[i]+2)/2);
}
printf("%d\n", maxx);
}
int main() {
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}

B. Tea Queue

题意

若干个人排队等茶喝,每个人有到达时间和离去时间,每个时刻只能一个人喝茶。

问每个人喝到茶的时间。

思路

排序,然后按顺序模拟(将当前时间逐个向后推移)

Code

#include <bits/stdc++.h>
#define maxn 1010
using namespace std;
typedef long long LL;
struct node {
int l, r, id;
}a[maxn];
int ans[maxn];
bool cmp(node a, node b) {
return (a.l < b.l) || (a.l==b.l && a.id<b.id);
}
void work() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d%d", &a[i].l, &a[i].r);
a[i].id = i;
}
sort(a, a+n, cmp);
int time = 0;
for (int i = 0; i < n; ++i) {
if (time <= a[i].l) {
time = a[i].l;
ans[a[i].id] = time;
++time;
}
else {
if (time <= a[i].r) {
ans[a[i].id] = time;
++time;
}
else {
ans[a[i].id] = 0;
}
}
}
printf("%d", ans[0]);
for (int i = 1; i < n; ++i) printf(" %d", ans[i]); puts("");
}
int main() {
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}

C. Swap Adjacent Elements

题意

给出 1-n 的一个排列,只能交换相邻两个元素,即 \(i\) 与 \(i+1\),且只有给定的位置 \(i\) 才可交换。

问能否通过交换得到一个升序序列。

思路

法一

假设元素 \(a[i]\) 现在处在 \(i\) 位置,那么交换必然通过 \(i-a[i]\) 的一整段线段,也即要求这一整段上的点都是可交换的位置。

即转化成一个 线段覆盖 问题,用线段树解决。

法二

连续的 \('1'\) 代表这一整段可以 \(sort\),将一段段 \(sort\) 之后判断整体是否有序即可。

Code

Ver. 1

#include <bits/stdc++.h>
#define maxn 200010
#define lson (rt<<1)
#define rson (lson|1)
using namespace std;
typedef long long LL;
struct node { int l, r; bool flag; }tr[maxn<<2];
char s[maxn];
int a[maxn];
void build(int rt, int l, int r) {
tr[rt].l = l, tr[rt].r = r;
if (l == r) {
tr[rt].flag = s[l] == '1'; return;
}
int mid = l+r>>1;
build(lson, l, mid); build(rson, mid+1, r);
tr[rt].flag = tr[lson].flag & tr[rson].flag;
}
bool query(int rt, int l, int r) {
if (tr[rt].l==l&&tr[rt].r==r) return tr[rt].flag;
int mid = tr[rt].l+tr[rt].r >> 1;
if (r <= mid) return query(lson, l, r);
else if (l > mid) return query(rson, l, r);
else return query(lson, l, mid) & query(rson, mid+1, r);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
scanf("%s", s+1);
build(1, 1, n);
for (int i = 1; i <= n; ++i) {
if (i == a[i]) continue;
if (i < a[i] && !query(1, i, a[i]-1)) { puts("NO"); return 0; }
else if (i > a[i] && !query(1, a[i], i-1)) { puts("NO"); return 0; }
}
puts("YES");
return 0;
}

Ver. 2

#include <bits/stdc++.h>
#define maxn 200010
using namespace std;
typedef long long LL;
char s[maxn];
int a[maxn];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
scanf("%s", s);
int l = -1; bool flag = false;
for (int i = 0; i < n-1; ++i) {
if (flag && s[i]=='0') {
sort(a+l, a+i+1);
flag = false;
}
else if (!flag && s[i]=='1') l = i, flag = true;
}
if (flag) sort(a+l, a+n);
for (int i = 0; i < n; ++i) if (a[i]!=i+1) { puts("NO"); return 0; }
puts("YES");
return 0;
}

D. Tanks

http://www.cnblogs.com/kkkkahlua/p/8413054.html

E. Connected Components?

http://www.cnblogs.com/kkkkahlua/p/8419805.html

F. SUM and REPLACE

题意

对一个序列进行两种操作:

  1. 将 \([l,r]\) 中每个数 \(x\) 变为其约数个数 \(D(x)\)
  2. 对 \([l,r]\) 区间求和

思路

神似 bzoj 3211 花神游历各国

Code

Ver. 1:线段树

#include <bits/stdc++.h>
#define maxn 300010
#define maxl 1000010
#define lson (rt << 1)
#define rson (rt << 1 | 1)
using namespace std;
typedef long long LL;
int prime[maxn], d[maxl], cnt[maxl], n, k, a[maxn];
bool check[maxl];
void init() {
int tot = 0; d[1] = 1;
for (int i = 2; i <= 1000000; ++i) {
if (!check[i]) {
prime[tot++] = i;
d[i] = 2, cnt[i] = 1;
}
for (int j = 0; j < tot; ++j) {
if (i * prime[j] > 1000000) break;
check[i * prime[j]] = true;
if (i % prime[j] == 0) {
cnt[i * prime[j]] = cnt[i] + 1;
d[i * prime[j]] = d[i] / (cnt[i] + 1) * (cnt[i * prime[j]] + 1);
break;
}
cnt[i * prime[j]] = 1;
d[i * prime[j]] = d[i] << 1;
}
}
}
struct node { int l, r; bool flag; LL sum; } tr[maxn<<2];
inline void push_up(int rt) {
tr[rt].sum = tr[lson].sum + tr[rson].sum;
tr[rt].flag = tr[lson].flag & tr[rson].flag;
}
inline int midi(int a, int b) { return a + b >> 1; }
void build(int rt, int l, int r) {
tr[rt].l = l, tr[rt].r = r, tr[rt].flag = 0;
if (l == r) {
scanf("%I64d", &tr[rt].sum);
if (tr[rt].sum <= 2) tr[rt].flag = 1;
return;
}
int mid = midi(l,r);
build(lson, l, mid); build(rson, mid + 1, r);
push_up(rt);
}
void modify(int rt, int l, int r) {
if (tr[rt].flag) return;
if (tr[rt].l == tr[rt].r) {
tr[rt].sum = d[tr[rt].sum];
if (tr[rt].sum <= 2) tr[rt].flag = 1;
return;
}
int mid = midi(tr[rt].l, tr[rt].r);
if (r <= mid) modify(lson, l, r);
else if (l > mid) modify(rson, l, r);
else { modify(lson, l, mid); modify(rson, mid + 1, r); }
push_up(rt);
}
LL query(int rt, int l, int r) {
if (tr[rt].l == l && tr[rt].r == r) return tr[rt].sum;
int mid = midi(tr[rt].l, tr[rt].r);
if (r <= mid) return query(lson, l, r);
else if (l > mid) return query(rson, l, r);
else return query(lson, l, mid) + query(rson, mid + 1, r);
}
int main() {
scanf("%d%d", &n,&k);
build(1, 1, n);
init();
while (k--) {
int t, l, r;
scanf("%d%d%d", &t,&l,&r);
if (t==2) printf("%I64d\n", query(1, l, r));
else modify(1, l, r);
}
return 0;
}

Ver. 2:树状数组+并查集

#include <bits/stdc++.h>
#define maxn 300010
#define maxl 1000010
using namespace std;
typedef long long LL;
int prime[maxn], d[maxl], cnt[maxl], fa[maxn], n, k, a[maxn];
bool check[maxl];
LL c[maxn];
void init() {
int tot = 0; d[1] = 1;
for (int i = 2; i <= 1000000; ++i) {
if (!check[i]) {
prime[tot++] = i;
d[i] = 2, cnt[i] = 1;
}
for (int j = 0; j < tot; ++j) {
if (i * prime[j] > 1000000) break;
check[i * prime[j]] = true;
if (i % prime[j] == 0) {
cnt[i * prime[j]] = cnt[i] + 1;
d[i * prime[j]] = d[i] / (cnt[i] + 1) * (cnt[i * prime[j]] + 1);
break;
}
cnt[i * prime[j]] = 1;
d[i * prime[j]] = d[i] << 1;
}
}
}
int lowbit(int x) { return x & (-x); }
void add(int p, int x) {
while (p <= n) c[p] += x, p += lowbit(p);
}
LL query(int x) {
LL ret = 0;
while (x) ret += c[x], x -= lowbit(x);
return ret;
}
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
int main() {
init();
scanf("%d%d", &n,&k);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
add(i, a[i]);
fa[i] = i;
}
fa[n+1] = n+1;
for (int i = 1; i <= n; ++i) if (a[i] <= 2) fa[i] = find(i+1);
while (k--) {
int t, l, r;
scanf("%d%d%d", &t,&l,&r);
if (t==2) printf("%I64d\n", query(r)-query(l-1));
else for (int i = find(l); i <= r; i = find(i+1)) {
add(i, d[a[i]] - a[i]);
if ((a[i] = d[a[i]]) <= 2) fa[i] = find(i+1);
}
}
return 0;
}

Educational Codeforces Round 37 A B C D E F的更多相关文章

  1. Educational Codeforces Round 37

    Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...

  2. Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements (思维,前缀和)

    Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements time limit per test 1 se ...

  3. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  4. codeforces 920 EFG 题解合集 ( Educational Codeforces Round 37 )

    E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Educational Codeforces Round 37 (Rated for Div. 2) 920E E. Connected Components?

    题 OvO http://codeforces.com/contest/920/problem/E 解 模拟一遍…… 1.首先把所有数放到一个集合 s 中,并创建一个队列 que 2.然后每次随便取一 ...

  6. Educational Codeforces Round 37 E. Connected Components?(图论)

    E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  7. 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛

    题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...

  8. Educational Codeforces Round 37 (Rated for Div. 2)

    我的代码应该不会被hack,立个flag A. Water The Garden time limit per test 1 second memory limit per test 256 mega ...

  9. Educational Codeforces Round 37 (Rated for Div. 2) G

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. Linux问题分析或解决_samba无法连接

    1. windows设置方面问题 问题:window能连接部分服务器的samba共享,一部分无法连接.报错如截图. 解决:前提---其他人连接都没有问题,发现有问题的连接服务器的电脑是win10,而w ...

  2. 关于springboot配置文件的另类读取方法

    一.背景故事   前阵子我接手了公司另外一个同事手里的项目,项目是用的springboot 写的,但是比较坑的就是这个项目写的有点不伦不类.虽然是用的springboot,但由于他是拿了一堆代码拼凑起 ...

  3. linux配置邮箱服务

    配置邮箱服务Linux常见的邮箱客户端是mail或mutt:服务端有sendmail服务(centos 5).postfix服务(centos 6).这里我们不使用本地的邮件服务,而是使用本地的邮件客 ...

  4. 【jenkins】【java】【tomcat】windows host key verification failed

    适用于windows系统 出现这个问题的原因tomcat启动的用户找不到本地公私钥路径 如果tomcat 启动时候选择 local system account (默认此选项),请把你的公私钥文件(i ...

  5. python 斗图图片爬虫

    捣鼓了三小时,有一些小Bug,望大佬指导 废话不说,直接上代码: #!/usr/bin/python3 # -*- coding:UTF-8 -*- import os,re,requests fro ...

  6. DFS:Tempter of the Bone (规定时间达到规定地点)

    解题心得: 1.注意审题,此题是在规定的时间达到规定的地点,不能早到也不能晚到.并不是最简单的dfs 2.在规定时间达到规定的地点有几个剪枝: 一.公式:所需的步骤 - x相差行 - y相差列 = 偶 ...

  7. HDU 3966 Aragorn's Story 树链拋分

    一.写在前面 终于开始开坑link-cut-tree这个了,对于网上找到的大佬的前进路线,进行了一番研发,发现实际上可以实现对于树链拋分的制作.经历了若干长时间之后终于打了出来(为什么每次学什么东西都 ...

  8. 重写BaseAdapter实现ListView

    public class BaseAdapterActivity extends BaseActivity { private ListView base_adapter_listView; priv ...

  9. MVC中Spring.net 对基类控制器无效 过滤器控制器无效

    比如现在我又一个BaseController作为基类控制器,用于过滤权限.登录判断等作用,其它控制由原本的继承Controller,改为继承BaseController.然后BaseControlle ...

  10. python 二(续)——面向对象编程进阶

    1.类的成员 2.类成员修饰符 3.类的特殊成员 在python第二课——面向对象初级,文章中介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一 ...