A:判断一下就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a, b, c, n;
ll ans;
int main()
{
scanf("%d%d%d%d", &a, &b, &c, &n);
for(int i = ; i <= n; ++i)
{
int x; scanf("%d", &x);
if(x > b && x < c) ++ans;
}
printf("%lld\n", ans);
return ;
}

B:1:sqrt(2)-1....

#include<bits/stdc++.h>
using namespace std;
int n;
double f;
int main()
{
scanf("%d%lf", &n, &f);
double t = f / (double)sqrt(n);
for(int i = ; i < n; ++i)
{
printf("%.15f ", t * (double)sqrt(i));
}
return ;
}

C:贪心,第一个字符串只用前n-[n/2]个,后一个字符串只用后[n/2]个,每个字符串用两个指针,如果第一个字符串最小的比第二个字符串最大的小,那么第一个人将最小的字符放在最靠前的位置,同理第二个人将最大的字符放在最前的位置,如果第一个人最小的字符比第二个人最大的字符大,那么就把他最大的字符放在末尾,第二个人则将最小的字符放在末尾。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n;
int cnt1[N], cnt2[N], ans[N];
char s[N], t[N];
int main()
{
scanf("%s%s", s + , t + ); n = strlen(s + );
for(int i = ; i <= n; ++i) ++cnt1[s[i] - 'a'];
for(int i = ; i <= n; ++i) ++cnt2[t[i] - 'a'];
int pos1 = , pos2 = , l = , r = n + ;
for(int i = ; i <= n; ++i)
{
while(cnt1[pos1] == ) ++pos1;
while(cnt2[pos2] == ) --pos2;
if(i % == )
{
if(pos1 < pos2) ans[++l] = pos1;
else ans[--r] = pos1;
--cnt1[pos1];
}
else
{
if(pos1 < pos2) ans[++l] = pos2;
else ans[--r] = pos2;
--cnt2[pos2];
}
}
for(int i = ; i <= n; ++i) printf("%c", (char)(ans[i] + 'a'));
return ;
}

D:重点在于会有相同的颜色,如果没有的话,那么直接染色就可以了,因为这样限制是唯一的,一个点颜色为i,相邻只能用两种颜色i-1和i+1,那么很好办。这里我们用一个巧妙的办法去除相同颜色,一个点将自己放入自己的邻接表中,然后排序邻接表,如果两个点的邻接表相同那么他们肯定相邻,那么这两个点的颜色相同。我们设一个点的颜色为i,另一个点的颜色为i+1,那么相邻的点的颜色只能等于i或i+1,如果等于i-1或i+2的话肯定和两个点中的一个矛盾,那么既然所有的邻居都等于i或i+1,那么我们不妨把那个颜色为i+1的点颜色换为i,很显然不矛盾。然后我们就把颜色能够相同的点分类,画成一个大点,重新编号,构图,两个新的点相邻当且仅当他们的点集中有相邻的点,也就是说这两个点集是相邻的。这里我们可以知道如果一个新的点的度数>=3或者有环就是无解,否则直接染色。

#include<bits/stdc++.h>
using namespace std;
const int N = , MaxCH = ;
int n, m, pos, len;
char CH[MaxCH];
vector<int> G[N];
int fa[N], color[N], Hash[N], h[N], u[N], v[N], used[N], vis[N];
inline int read()
{
int x = ;
while(CH[pos] < '' || CH[pos] > '') ++pos;
while(CH[pos] >= '' && CH[pos] <= '') x = x * + CH[pos++] - '';
return x;
}
namespace dsu
{
inline int find(int x) { return x == fa[x] ? x : find(fa[x]); }
inline void connect(int x, int y)
{
int u = find(x), v = find(y);
if(u == v) return;
fa[u] = v;
}
} using namespace dsu;
void build()
{
for(int i = ; i <= m; ++i) if(h[u[i]] == h[v[i]])
connect(u[i], v[i]);
for(int i = ; i <= m; ++i)
{
int x = find(u[i]), y = find(v[i]);
if(x == y) continue;
G[x].push_back(y); G[y].push_back(x);
}
for(int i = ; i <= n; ++i)
{
sort(G[i].begin(), G[i].end());
G[i].erase(unique(G[i].begin(), G[i].end()), G[i].end());
if(G[i].size() > ) { puts("NO"); exit(); }
}
}
void dfs(int u, int last)
{
used[color[u]] = ; vis[u] = ;
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i]; if(v == last) continue;
if(vis[v]) { puts("NO"); exit(); }
if(!used[color[u] - ]) color[v] = color[u] - ;
else color[v] = color[u] + ;
used[color[v]] = ;
dfs(v, u);
}
}
int main()
{
len = fread(CH, , MaxCH, stdin);
CH[len] = ' ';
n = read(); m = read();
Hash[] = ; for(int i = ; i <= n; ++i) Hash[i] = Hash[i - ] * , fa[i] = i, h[i] = Hash[i];
for(int i = ; i <= m; ++i)
{
u[i] = read(); v[i] = read();
h[u[i]] += Hash[v[i]]; h[v[i]] += Hash[u[i]];
}
build();
color[find()] = ;
dfs(find(), );
puts("YES");
for(int i = ; i <= n; ++i) printf("%d ", color[find(i)]);
return ;
}

E:我们可以知道假设我们二分答案x,把>=x的数标为1,<x的数标为0,那么第一个人就是想要剩下的一个数为1,第二个人反之。那么我们可以知道两个性质:

1.如果n为奇数,那么当且仅当中间的数等于1和他任意相邻的两个数其中为1的情况下第一个人能赢,也就是说x能取到

2.如果n为偶数,那么当且仅当中间的两个数都为1第一个人才能赢,也就是说x能取到

然后我们发现,既然对于任意一个x根据n必须满足上面的条件才能赢,那么也就是说答案只跟中间的几个数有关,因为一个答案必须满足使中间的数满足条件才可以

所以我们就有答案

n为奇数ans=min(a[t],max(a[t-1],a[t+1]))t=(n+1)/2,因为我们可以保住中间的数和两边的数之一,我们不能自己选择保哪个,只可意会不可言传,自己手画画就可以了。

n为偶数ans=max(a[t],a[t+1])t=n/2,保哪个数可以自己选择,手画一下就可以了。

对于取了k个我们只需要看每段连续n-k个元素的最大值就好了

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n;
int a[N], b[N], c[N], ans[N];
struct seg {
int tree[N << ];
void build(int l, int r, int x, int *a)
{
if(l == r) { tree[x] = a[l]; return; }
int mid = (l + r) >> ;
build(l, mid, x << , a); build(mid + , r, x << | , a);
tree[x] = max(tree[x << ], tree[x << | ]);
}
int query(int l, int r, int x, int a, int b)
{
if(l > b || r < a) return ;
if(l >= a && r <= b) return tree[x];
int mid = (l + r) >> ;
return max(query(l, mid, x << , a, b), query(mid + , r, x << | , a, b));
}
} t1, t2;
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i) scanf("%d", &a[i]);
for(int i = ; i <= n; ++i)
{
ans[n - ] = max(ans[n - ], a[i]);
b[i] = min(a[i], max(a[i - ], a[i + ]));
c[i] = max(a[i], a[i + ]);
}
t1.build(, n, , b); t2.build(, n, , c);
int l1, r1, l2, r2;
if(n % == )
{ l1 = n / ; r1 = l1 + ; l2 = r2 = n / ; }
else { l1 = r1 = (n + ) / ; l2 = n / ; r2 = l2 + ; }
for(int k = ; k < n - ; ++k)
if((n - k) % == ) ans[k] = t1.query(, n, , l1--, r1++);
else ans[k] = t2.query(, n, , l2--, r2++);
for(int i = ; i < n; ++i) printf("%d ", ans[i]);
return ;
}

F:线段树维护每位,调了好长时间,原因是要在程序顶端先pushdown一下,我没有这个习惯

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
struct data {
ll cnt[];
int nxt[];
} tree[N << ];
int n, q;
int a[N];
ll bin[];
void pushdown(int x)
{
static ll cnt[]; static int nxt1[], nxt2[];
memset(cnt, , sizeof(cnt));
memset(nxt1, , sizeof(nxt1));
memset(nxt2, , sizeof(nxt2));
for(int i = ; i <= ; ++i)
{
nxt1[i] = tree[x].nxt[tree[x << ].nxt[i]];
nxt2[i] = tree[x].nxt[tree[x << | ].nxt[i]];
}
for(int i = ; i <= ; ++i)
{
tree[x << ].nxt[i] = nxt1[i];
tree[x << | ].nxt[i] = nxt2[i];
}
for(int i = ; i <= ; ++i) cnt[tree[x].nxt[i]] += tree[x].cnt[i];
for(int i = ; i <= ; ++i)
{
tree[x].cnt[i] = cnt[i];
tree[x].nxt[i] = i;
}
}
void build(int l, int r, int x)
{
if(l == r)
{
int t = a[l], pos = -;
while(t)
{
tree[x].cnt[t % ] += bin[++pos];
t /= ;
}
for(int i = ; i <= ; ++i) tree[x].nxt[i] = i;
return;
}
int mid = (l + r) >> ;
build(l, mid, x << ); build(mid + , r, x << | );
for(int i = ; i <= ; ++i) tree[x].cnt[i] = tree[x << ].cnt[i] + tree[x << | ].cnt[i];
for(int i = ; i <= ; ++i) tree[x].nxt[i] = i;
}
void update(int l, int r, int x, int a, int b, int x1, int y1)
{
pushdown(x);
if(l > b || r < a) return;
if(l >= a && r <= b)
{
tree[x].nxt[x1] = y1;
pushdown(x);
return;
}
int mid = (l + r) >> ;
update(l, mid, x << , a, b, x1, y1); update(mid + , r, x << | , a, b, x1, y1);
for(int i = ; i <= ; ++i) tree[x].cnt[i] = tree[x << ].cnt[i] + tree[x << | ].cnt[i];
}
ll query(int l, int r, int x, int a, int b)
{
pushdown(x);
if(l > b || r < a) return ;
if(l >= a && r <= b)
{
ll ans = ;
for(int i = ; i <= ; ++i) ans += (ll)i * tree[x].cnt[i];
return ans;
}
int mid = (l + r) >> ; ll x1, x2;
pushdown(x);
x1 = query(l, mid, x << , a, b); x2 = query(mid + , r, x << | , a, b);
return x1 + x2;
}
int main()
{
scanf("%d%d", &n, &q);
bin[] = ; for(int i = ; i <= ; ++i) bin[i] = bin[i - ] * ;
for(int i = ; i <= n; ++i) scanf("%d", &a[i]);
build(, n, );
while(q--)
{
int opt, l, r, x, y;
scanf("%d", &opt);
if(opt == )
{
scanf("%d%d%d%d", &l, &r, &x, &y);
update(, n, , l, r, x, y);
}
if(opt == )
{
scanf("%d%d", &l, &r);
ll ans = query(, n, , l, r);
printf("%lld\n", ans);
}
}
return ;
}

codeforces round #414 div1+div2的更多相关文章

  1. Codeforces Round #503 Div1+Div2 1019&1020

    https://winniechen.cn/?p=188 这个还是直接放链接吧,毕竟内容比较多...

  2. 【前行&赛时总结】◇第4站&赛时9◇ CF Round 513 Div1+Div2

    ◇第4站&赛时9◇ CF Round 513 Div1+Div2 第一次在CF里涨Rating QWQ 深感不易……作blog以记之 ( ̄▽ ̄)" +Codeforces 的门为你打 ...

  3. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  4. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

  5. Codeforces Round #539 Div1 题解

    Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有 ...

  6. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  7. Codeforces Round #253 DIV1 C 馋

    http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...

  8. Codeforces Round #414 C. Naming Company

    http://codeforces.com/contest/794/problem/C 题意: 有两个人要为公司起名字,每个人手中都有n个字符,现在要取一个n个字符长度的公司名.两人轮流取名,每次选择 ...

  9. Codeforces Round #329(Div2)

    CodeForces 593A 题意:n个字符串,选一些字符串,在这些字符串中使得不同字母最多有两个,求满足这个条件可选得的最多字母个数. 思路:用c[i][j]统计文章中只有i,j对应两个字母出现的 ...

随机推荐

  1. Codeforces985E. Pencils and Boxes (单调队列)

    题意:n个数 把他们放进一些盒子里 每个盒子最少放k个数 且最小和最大的差不能大于d 题解:显然排个序 对于当前点 存一下前面有哪些节点可以当作结尾 那么就可以枚举这些点的下一个点作为起点能否和当前点 ...

  2. Extjs二级联动combo省城市

    Extjs二级联动 Extjs combox根据省查询城市 实现效果如上图所示, store层代码: Ext.define("ExtApp.store.TeacherProvince&quo ...

  3. NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)

    一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...

  4. mac下用crontab实现pytho3脚本自动定期执行,包括scrapy的定期执行

    呃 其实要明天上午才能知道是否成功,毕竟改了一个小参数的. 首先,来学两个小命令: step1: $ sudo crontab -e step2: # 然后提示password输入密码,即可进入编辑页 ...

  5. poj 3744 Scout YYF I(递推求期望)

    poj 3744 Scout YYF I(递推求期望) 题链 题意:给出n个坑,一个人可能以p的概率一步一步地走,或者以1-p的概率跳过前面一步,问这个人安全通过的概率 解法: 递推式: 对于每个坑, ...

  6. idea 快捷键设置

    通过 点击放大镜然后按当前需要修改的快捷键找到需要修改的快捷键,更改成希望的快捷键

  7. JavaScript保留关键字(全)

    JavaScript 标准 所有的现代浏览器已经完全支持 ES5(ECMAScript 5). JavaScript 保留关键字(keyword) Javascript 的保留关键字(标识符)不可以用 ...

  8. ceph 简介

    Ceph 存储集群 数据的存储 伸缩性和高可用性 CRUSH 简介 集群运行图 高可用监视器 高可用性认证 智能程序支撑超大规模 动态集群管理 关于存储池 PG 映射到 OSD 计算 PG ID 互联 ...

  9. 最接近的点配对(分治问题理解) && HDU 1007代码

    题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...

  10. iphone学习

    苹果开发者联盟的网址:http://www.apple.com.cn/developer/ objective-C on the Mac     (Aoress)       作者:Dakrymple ...