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. 简单的jsonp实现跨域原理

    什么原因使jsonp诞生?  传说,浏览器有一个很重要的安全限制,叫做"同源策略".同源是指,域名,协议,端口相同.举个例子,用一个浏览器分别打开了百度和谷歌页面,百度页面在执行脚 ...

  2. 前k大金币(动态规划,递推)

    /* ///题解写的很认真,如果您觉得还行的话可以顶一下或者评论一下吗? 思路: 这题复杂在要取前k大的结果,如果只是取最大情况下的金币和,直接 动态规划递归就可以,可是前k大并不能找出什么公式,所以 ...

  3. 2n皇后 - 回溯

    题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...

  4. PAT 1125 Chain the Ropes

    Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fo ...

  5. log 框架 之间的关系

    日志框架分为两大部分 一部分是日志框架的抽象层,一部分是日志框架的具体实现 slf4j: 日志框架的抽象层 log4j,logback 日志框架的具体实现 如上图所示: slf4j的具体实现是:slf ...

  6. unigui+fastreport 打印【4】

    1.建立一个uniForm,用于建立FastReport打印界面.在Form上增加uniFrame.和传统的的报表打印设计一样一样的. 2.在beofeShow事情中: procedure TUniF ...

  7. JavaScript保留关键字(全)

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

  8. mongodb replica set 添加/删除节点方法--http://www.ii123.com/jc/bc/bczh/258948.html

    replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点  代码如下   re ...

  9. git远程上传文件

    [第一步]建立先仓库 第一步的话看一般的提示就知道了,在github新建一个repository(谷歌可以解决),都是可视化的界面操作,所以难度不大.或者看这里:https://help.github ...

  10. 18、Java并发性和多线程-饥饿与公平

    以下内容转自http://ifeve.com/starvation-and-fairness/: 如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”.而该线程 ...