T1

>传送门<

记忆化搜索,听说有更简单的方法(但博主比较菜)

#include <cstdio>
#include <cstdlib>
#define ll long long ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} int a[], n;
int vis[]; void DFS(int pos, int floor){
if (vis[pos])
return ;
vis[pos] = ;
for (int i = ((n - pos) & ) ? (n - ) : n; i >= pos; i -= ){
if (i == n){
if (a[i] & ){
if (floor & ){
printf("Yes");
exit();
}
}
}
else{
if ((a[i] & ) && (a[i + ] & )){
if (i + == n){
if (!(floor & )){
printf("Yes");
exit();
}
}
DFS(i + , floor + );
}
}
}
} int main(){
n = read();
for (int i = ; i <= n; ++i)
a[i] = read();
if (!(a[] & ) || !(a[n] & )){
printf("No");
return ;
}
DFS(, );
printf("No");
return ;
}

T2

>传送门<

第1个点肯定要选的,暴力枚举第一条线段的第二个点在哪里,然后暴力模拟,注意第二个点可能为空

#include <cstdio>
#include <cmath>
#define ll long long const double DEL = 1e-; ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} double myAbs(double a){
return (a > ) ? a : -a;
} double equal(double a, double b){
if (myAbs(a - b) <= DEL)
return ;
else
return ;
} double y[]; int main(){
int n = read();
if (n <= ){
printf("Yes\n");
return ;
}
for (int i = ; i < n; ++i)
y[i] = read();
double lineA, lineB;
int b1 = -, b2 = -;
for (int i = ; i < n; ++i){
lineA = (y[i] - y[]) / (double)(i);
b1 = b2 = -;
int j;
for (j = ; j < n; ++j){
if (j == i)
continue;
if (!equal((y[j] - y[]) / (double)(j), lineA)){
if (b1 == -){
b1 = j;
}else if (b2 == -){
b2 = j;
lineB = (y[b2] - y[b1]) / (double)(b2 - b1);
if (!equal(lineA, lineB))
break;
}else{
if (!equal((y[j] - y[b1]) / (double)(j - b1), lineB))
break;
}
}
}
if (j == n){
if (b1 != -){
printf("Yes\n");
return ;
}
}
}
double line1 = y[] - y[];
int i;
for (i = ; i < n; ++i){
if (!equal((y[i] - y[]) / (double)(i - ), line1))
break;
}
if (i == n && (!equal((y[] - y[]), line1)))
printf("Yes\n");
else
printf("No\n");
return ;
}

T3

>传送门<

发现不管怎么合并,结果都一样,于是等差数列求和公式用一用AC

#include <cstdio>
#define ll long long ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} ll getNum(ll a){
return ((( + a) * a) >> );
} int main(){
int k = read();
if (k == ){
printf("ab");
return ;
}
char ch = 'a';
while (k > ){
int l = , r = , mid, ans = ;
while (l <= r){
mid = (l + r) >> ;
if (getNum(mid) > k){
r = mid - ;
}else{
l = mid + ;
ans = mid;
}
}
k -= getNum(ans);
for (int i = ; i <= ans; ++i)
printf("%c", ch);
++ch;
}
return ;
}

T4

>传送门<

欧拉筛,二分AC

#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#define ll long long using namespace std; int a[], qzh[]; int primes[];
int prime_num = ;
bool is_not_primes[] = {false}; map<int, int> mp; ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} void getPrime(int n){
is_not_primes[] = true;
is_not_primes[] = true;
for (int i = ; i <= n; i++){
if (is_not_primes[i] == false)
primes[prime_num++] = i;
for (int j = ; (j < prime_num) && (primes[j] * i <= n); j++){
is_not_primes[primes[j] * i] = true;
if ((i % primes[j]) == )
break;
}
}
} int main(){
getPrime();
int n = read();
for(int i = ; i <= n; ++i){
int x = read();
++a[x];
}
for(int i = ; i < prime_num; ++i)
for(int j = primes[i]; j <= ; j += primes[i])
qzh[i] += a[j];
for(int i = ; i < prime_num; ++i)
qzh[i] += qzh[i - ];
int m = read(), l, r;
for(int i = ; i <= m; ++i){
l = read(), r = read();
ll ans_r = qzh[lower_bound(primes + , primes + prime_num, r + ) - primes - ];
ll ans_l = qzh[lower_bound(primes + , primes + prime_num, l) - primes - ];
printf("%lld\n", ans_r - ans_l);
}
}

T5

>传送门<

真正难的题目(目测实测洛谷黑题),因为我比较菜,不会分块cdq分治,差分乱搞的算法,只能打一发树套树,

如何使用树套树呢?

  我们把一维问题转换成二维问题,一个点的横坐标就是这个点的位置,纵坐标是这个点前一个与它颜色相同的点的位置,权值是横坐标减纵坐标。
  这里查询[l,r]区间的答案,就是二维平面上(l,l)点和(r,r)点组成的矩阵内的权值之和。

  原理?占坑代填

然后预处理再上树套树板子就行了

#include <cstdio>
#include <vector>
#include <set>
#define ll long long using namespace std; ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} //SegmentTree
long long s[];
int lc[], rc[];
int node_cnt = ;
void Add(int &pos, int l, int r, int k, ll val){
if (!pos)
pos = ++node_cnt;
s[pos] += val;
if (l == r)
return;
int mid = (l + r) >> ;
if (k <= mid)
Add(lc[pos], l, mid, k, val);
else
Add(rc[pos], mid + , r, k, val);
}
long long Query(int pos, int l, int r, int k){
if (!pos)
return ;
if (l == r)
return s[pos];
int mid = (l + r) >> ;
if (k <= mid)
return Query(lc[pos], l, mid, k) + s[rc[pos]];
else
return Query(rc[pos], mid + , r, k);
} int rt[], fst[]; //fentree
struct fenTree{
#define lowbit(x) (x & -x)
void add(int k, int pos, ll val, int n){
for (int i = k; i <= n; i += lowbit(i))
Add(rt[i], , n, pos, val);
}
ll qry(int k, int pos, int n) {
ll res = ;
for (int i = pos; i; i -= lowbit(i))
res += Query(rt[i], , n, k);
return res;
}
#undef lowbit
} bit; void update(int x, int y, int n){
if(fst[x])
bit.add(x, fst[x], fst[x] - x, n);
if(y)
bit.add(x, y, x - y, n);
fst[x] = y;
} int aa[];
set<int> st[]; inline set<int>::iterator nxt_it(set<int>::iterator it){
return (++it);
} inline set<int>::iterator pre_it(set<int>::iterator it){
return (--it);
} int main(){
int n = read(), m = read();
for (int i = ; i <= n; ++i)
aa[i] = read();
for (int i = ; i <= n; i ++) {
if (!st[aa[i]].empty()){
fst[i] = *st[aa[i]].rbegin();
bit.add(i, fst[i], i - fst[i], n);
}
st[aa[i]].insert(i);
}
int op, x, y;
for (int I = ; I < m; ++I){
op = read(), x = read(), y = read();
if (op == ){
set<int>::iterator it = st[aa[x]].find(x);
if (nxt_it(it) != st[aa[x]].end())
update(*nxt_it(it), (it == st[aa[x]].begin() ? : *pre_it(it)), n);
st[aa[x]].erase(x);
aa[x] = y;
it = st[y].insert(x).first;
update(x, (it == st[y].begin() ? : *pre_it(it)), n);
if(nxt_it(it) != st[y].end())
update(*nxt_it(it), x, n);
}
else
printf("%lld\n", bit.qry(x, y, n));
}
return ;
}

  

HG奋斗赛B[20190429]的更多相关文章

  1. HG奋斗赛A[20190428]

    T1 很简单,判断这个字符串有多少个不同的字符,让后用k减一减 注意: 1.如果不同字符数大于k,不要输出负数 2.变量名别打错 上代码 #include <cstdio> #includ ...

  2. [HG]奋斗赛M

    题A     请进入链接↑ 题B     请进入链接↑ 题C     请进入链接↑ 题D     请进入链接↑ 题E     请进入链接↑ 题F     懒得写了,借用一下Chtholly_Tree巨 ...

  3. [HG]奋斗赛G

    T1 题目描述 安娜斯塔西娅喜欢去乌日扬迪安中央公园散步. 但她对简单的散步不感兴趣,于是她开始收集公园里的鹅卵石. 一开始,她决定收集所有她能在公园里找到的鹅卵石. 她只有两个口袋. 她能在每个口袋 ...

  4. [hgoi#2019/3/10]赛后总结

    关于本次hg模拟赛,题目来源于CF1110. t1-无意义运算符(meaning) 题目描述 最大公约数和位运算之间有共同点吗?是时候来研究一下了. 给定一个正整数a,请找到一个闭区间[1,a-1] ...

  5. 第六届acm省赛总结(退役贴)

    前言: 这是我的退役贴,之前发到了空间里,突然想到也要在博客里发一篇,虽然我很弱,但是要离开了还是有些感触,写出来和大家分享一下,希望不要见笑.回来看看,这里也好久没有更新了,这一年确实有些懈怠,解题 ...

  6. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  7. 团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  8. 2019-CCPC广东省赛总结

    2018年11月第一次参加ICPC区域赛青岛赛区,打铁了! 2019年5月第一次参加CCPC广东省赛,4题滚粗,C题莫队TLE13发,只拿了个铜牌! 教训总结: 比赛时千万不能犹豫,不能犹豫,不能犹豫 ...

  9. 2018年 第43届ACM-ICPC亚洲区域赛(青岛)现场赛 赛后总结

    下了动车后,又颠颠簸簸的在公交车上过了接近一个小时,本来就晕车,于是,到的时候脑子晕死了,而且想吐.可能是没吃早饭的缘故,午饭好好次QWQ. 开幕式 还是第一次在这种环境下参赛,记得以前是看老师发的学 ...

随机推荐

  1. sys系统模块

    import sys # print(0)## sys.exit(0)## print(123) # print(sys.version)# print(sys.maxsize)# print(sys ...

  2. 六 Struts 拦截器、OGNL表达式

    一.OGNL表达式1.概念:是表达式语言,专门用来访问对象取值用的.2.对比EL表达式使用场景: A.EL主要用在web的jsp页面取值 B.OGNL适用以下环境 1.java程序中 2.在页面使用( ...

  3. Oracle 数据库禁止全表访问的时候direct path read /////

    一般在OLAP环境中,大表在进行全表扫描的时候一般会出现direct path read等待事件,如果在OLTP环境中,出现大量的direct path read直接路径读取,这样就有问题了.一般在O ...

  4. PHP字符串函数、常量、数组排序

    PHP字符串函数.常量.数组排序 strlen() 说明:strlen(),可以统计字符串长度 用途:strlen() 常用于循环和其他函数,在确定字符串何时结束很重要时.(例如,在循环中,我们也许需 ...

  5. linux-----docker

    docker简介 Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源. Doc ...

  6. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

  7. XML的几种转换

    package com.qbskj.project.util; import java.io.ByteArrayOutputStream; import java.util.ArrayList; im ...

  8. Kafka简介及使用PHP处理Kafka消息

    Kafka简介及使用PHP处理Kafka消息 Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被 ...

  9. Lua中ipairs和pairs的区别详解

    迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: , b = , x = , y = , " ...

  10. Hadoop系列(一):Hadoop集群搭建

    环境:CentOS 7 JDK: 1.7.0_80 hadoop:2.8.5 两台机器:master(192.168.56.101)   slave(192.168.56.102) 配置基础环境 1. ...