HG奋斗赛B[20190429]

时间:2022-01-12 00:25:50

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&lbrack;20190428&rsqb;

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

  2. &lbrack;HG&rsqb;奋斗赛M

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

  3. &lbrack;HG&rsqb;奋斗赛G

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

  4. &lbrack;hgoi&num;2019&sol;3&sol;10&rsqb;赛后总结

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

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

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

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

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

  7. 团体程序设计天梯赛&lpar;CCCC&rpar; 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. Scala入门之函数

    /** * 函数可以被简单的被认为是包裹了一条或者几条语句的代码体,该代码体接收若干参数,经过代码体处理后返回结果,形如数学中的f(x) = x + 1 * 在Scala中函数式一等公民,可以向变量一 ...

  2. 原创内容搬家到csdn博客啦~

    以后原创的文章就发布在csdn博客啦: http://blog.csdn.net/aceyan0718 这里就用来当作一个网络笔记本吧,转载些优质的内容

  3. CSS&lowbar;03&lowbar;03&lowbar;ul图片替换

    ul图片替换 第01步:编写css样式:url.css @charset "utf-8"; /*ul用图片替换*/ ul.u_01{/*图片*/ list-style:circle ...

  4. 用python实现把数字人民币金额转换成大写的脚本程序

    # -*- coding: utf-8 -*- def Num2MoneyFormat( change_number ): """ .转换数字为大写货币格式( forma ...

  5. js 图片切换效果

    效果如下: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo ...

  6. FIR数字滤波器的设计要点

    源:http://blog.sina.com.cn/s/blog_493520900101gt0a.html FIR数字滤波器的设计要点

  7. JDBC 连接数据库的步骤

    1.JDBC (JAVA DATABASE CONNECTION) (Java 数据库 连接)2.JAVA 面向对象的编程语言 (汉语) || || 标准(接口)---->jar包(mysql- ...

  8. Linux&&num;160&semi;Linux下最大文件描述符设置

    Linux下最大文件描述符设置 by:授客 QQ:1033553122 1.   系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...

  9. crtmpserver实现防盗流和流推送验证 之二

    IV. Catching the thieves 抓住小偷 Well, we have just added a secure mechanism to our little streaming se ...

  10. chrome浏览器默认启动时打开2345导航的解决方法

    2345并没有改动chrome内部设置.它仅仅是把全部的快捷方式改动了.包含開始菜单旁边的快捷启动图标. 仅仅须要右键chrome快捷方式.在目标一栏中,把"----chrome.exe&q ...