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. 一。Hibernate 开发流程

    一.hibernate和mybatis都是orm产品1.orm:object-realation-mapping对象关系映射 二.开发步骤1.导入相关jar 包括hibernate和oracle的驱动 ...

  2. win 10 精简组件列表

    轻松访问工具 操作中心 应用程序虚拟化(App-V) Telemetry Client (Asimov)(遥测) Assigned Access(按需访问) 自动播放 网络后台传输 备份 生物识别服务 ...

  3. 在oracle表中增加字段,并调整字段的顺序

    增加字段的语句很简单,以用户身份连接oracle服务: alter table tablename add(colname coltype); # 填上表名.字段名.字段类型 修改字段顺序前,查看表中 ...

  4. 微信网页分享 jssdk config:invalid signature 签名错误

    invalid signature签名错误.建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisi ...

  5. Git学习指北

    learnGitBranching:一个可视化学习 git 的网站 learngitbranching.js.org,虽然项目有些悠久,如果学习 git 的话可以来玩下

  6. BUG-‘Tokenizer’ object has no attribute ‘oov_token’

    使用keras包实现NLP问题时,报错 /lib/python3./dist-packages/keras/preprocessing/text.py”, line , in texts_to_seq ...

  7. 【洛谷P1963】变换序列

    题目大意:对于一个顺序序列,求一个合法置换,可以满足一些约束,若存在多个合法置换,则输出字典序最小的一个置换. 题解:对于序列的置换是否有解的问题,可以和二分图的完美匹配相关联.由于是字典序最小,显然 ...

  8. 怎么解决docker pull拉取镜像速度过慢的问题

    在我们安装了docker之后,在利用docker pull下载镜像的时候,由于国内的源会出现的问题就是速度真的很慢,可以用龟速来形容,最痛苦的是当你耐心的等待几个小时之后,出现unexpected E ...

  9. Java第一次实训作业

    1.编写程序: 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. import java.util.Scanner; public class Hellowore { ...

  10. Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)

    传送门 题意: 给出一个数x,有两个操作: ①:x ^= 2k-1; ②:x++; 每次操作都是从①开始,紧接着是② ①②操作循环进行,问经过多少步操作后,x可以变为2p-1的格式? 最多操作40次, ...