A.Xenia and Divisors

题意:给定N个数,每个数的取值范围为1-7,N是3的倍数,判定是否能够恰好将N个数分成若干三元组,使得一个组中的元素a,b,c满足 a < b < c 并且 a|b && b|c(整除)。

分析:满足这种条件的三元组只有[1, 2, 4], [1, 2, 6], [1, 3, 6]因此如果有5或者是7肯定是不行的,然后是1的个数要等于4和6的个数之和,最后就是2的数量必须4的数量。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = ;
int n;
int cnt[]; int main() {
int x;
bool flag = false;
scanf("%d", &n);
for (int i = ; i < n; ++i) {
scanf("%d", &x);
if (x == || x == ) flag = true;
cnt[x]++;
}
if (flag || cnt[] != cnt[]+cnt[] || cnt[] < cnt[]) {
puts("-1");
return ;
}
for (int i = ; i < cnt[]; ++i) puts("1 2 4");
for (int i = ; i < cnt[]; ++i) puts("1 3 6");
for (int i = ; i < cnt[]-cnt[]; ++i) puts("1 2 6");
return ;
}

B.Xenia and Spies

题意:有N个人站成一行,现在有一个情报要从编号S传到编号F,每次每个人只能够向左或者向右边的一个人传送。给定一个时间表,某一段时间内某个区间的人使不能够接收和传送情报,要求输出花最小时间的代价的传送方案。

分析:可以得到一个结论,如果S < F,那么情报不可能向左边传,顶多是停在某个人手中,S > F 同理,因此直接模拟即可。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int M = ;
int n, m, s, f; struct interval {
int l, r, ti;
void read() {
scanf("%d %d %d", &ti, &l, &r);
}
bool judge(int x) {
if (x >= l && x <= r) return false;
else return true;
}
}q[M]; void solve() {
int dir = s < f ? : -;
char ch = s < f ? 'R' : 'L';
int ti = ;
int X = ;
while (s != f) {
++ti;
if (ti == q[X].ti) {
if (q[X].judge(s) && q[X].judge(s+dir)) putchar(ch), s += dir;
else putchar('X');
X++;
} else {
putchar(ch);
s += dir;
}
}
} int main() {
scanf("%d %d %d %d", &n, &m, &s, &f);
for (int i = ; i < m; ++i) {
q[i].read();
}
solve();
return ;
}

C.Cupboard and Balloons

题意:问一个橱柜中能够放置多少个球。

分析:其实就是一个分段函数,可以分别在顶端放1个,放2个,放3个的h取值。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; int r, h;
const double eps = 1e-; int sign(double x) {
return x < -eps ? - : x > eps ? : ;
} int get(double x) {
if (sign(*x - sqrt()*r) >= ) return ;
else if (sign(*x - r) >= ) return ;
else return ;
} int main() {
scanf("%d %d", &r, &h);
printf("%d\n", h/r* + get(h-h/r*r));
return ;
}

D.Xenia and Dominoes

题意:给定一个3*N的棋盘,其中某些位置不能够放置,并且有一个点是空的,问使用1*2的方格来平铺能够有多少种方案,要求一个空格周围有1*2的方格可能移动。

分析:与其他的题目稍有不同的就是棋盘多了一些限制并且有一个点周围的点至少有一个1*2的方格能够移动。对于前者,在dp的时候做个位运算即可,后者我的做法是用总的方案数减去不合法的方案数。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int mod = int(1e9)+;
vector<int>vt[];
int dp[][];
int mp[];
int ocp[];
int n, cx, cy; void pre() {
vt[].push_back();
vt[].push_back();
vt[].push_back();
vt[].push_back(), vt[].push_back();
vt[].push_back();
vt[].push_back();
vt[].push_back(), vt[].push_back();
vt[].push_back(), vt[].push_back(), vt[].push_back();
} int cal_1() { // 计算全部的情况
dp[][] = ;
for (int i = ; i <= n; ++i) {
for (int j = ; j < ; ++j) {
if ((j & mp[i]) != j) continue;
for (int k = ; k < (int)vt[j].size(); ++k) {
dp[i][j|ocp[i]] = (1LL*dp[i][j|ocp[i]] + dp[i-][vt[j][k]])%mod;
}
}
}
return dp[n][];
} int cal_2() { // 计算非法的情况
memset(dp, , sizeof (dp));
dp[][] = ;
for (int i = ; i <= n; ++i) {
if (i+ == cx) { // 如果是空点的上一行
for (int j = ; j < ; ++j) {
if ((j & mp[i]) != j) continue;
for (int k = ; k < (int)vt[j].size(); ++k) {
if (!(vt[j][k] & ( << cy-))) continue;
dp[i][j|ocp[i]] = (1LL*dp[i][j|ocp[i]] + dp[i-][vt[j][k]])%mod;
}
}
} else if (i == cx) { // 如果是空点的所在行
for (int j = ; j < ; ++j) {
if ((j & mp[i]) != j) continue;
for (int k = ; k < (int)vt[j].size(); ++k) {
if (cy==&&(j&(<<cy-))&&(j&(<<cy-))&&(vt[j][k]&(<<cy-))&&(vt[j][k]&(<<cy-))) continue;
if (cy==&&(j&(<<cy))&&(j&(<<cy+))&&(vt[j][k]&(<<cy))&&(vt[j][k]&(<<cy+))) continue;
dp[i][j|ocp[i]] = (1LL*dp[i][j|ocp[i]] + dp[i-][vt[j][k]])%mod;
}
}
} else if (i- == cx) { // 如果是空点的下数第二行
for (int j = ; j < ; ++j) {
if ((j & mp[i]) != j) continue;
for (int k = ; k < (int)vt[j].size(); ++k) {
if (!(vt[j][k] & ( << cy-))) continue;
dp[i][j|ocp[i]] = (1LL*dp[i][j|ocp[i]] + dp[i-][vt[j][k]])%mod;
}
}
} else {
for (int j = ; j < ; ++j) {
if ((j & mp[i]) != j) continue;
for (int k = ; k < (int)vt[j].size(); ++k) {
dp[i][j|ocp[i]] = (1LL*dp[i][j|ocp[i]] + dp[i-][vt[j][k]])%mod;
}
}
}
}
return dp[n][];
} int main() {
pre();
scanf("%d", &n);
char str[];
for (int i = ; i <= ; ++i) {
scanf("%s", str+);
for (int j = ; j <= n; ++j) {
mp[j] |= (int)(str[j]=='.') << (i-);
ocp[j] |= (int)(str[j]!='.') << (i-);
if (str[j] == 'O') cx = j, cy = i;
}
}
printf("%d\n", (cal_1()-cal_2()+mod)%mod);
return ;
}

E.Xenia and Tree

题意:给定一棵树,初始化1号节点为红色,其他点为蓝色。有两种操作:1.将某个点从蓝色变成红色;2.询问某个节点到最近的红色的点的距离。

分析:对于1操作保留要改变的点,当有询问时在bfs更新。不过觉得这种做法在树退化成一条链时时间复杂度为O(N^2)。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef unsigned int uint;
const int N = ;
int dis[N];
char vis[N];
int n, m;
vector<int>vt;
queue<int>q; struct Edge {
int v, nxt;
}e[N<<];
int idx, head[N]; void addedge(int a, int b) {
e[idx].v = b, e[idx].nxt = head[a];
head[a] = idx++;
} void spread() {
memset(vis, , sizeof (vis));
for (uint i = ; i < vt.size(); ++i) {
dis[vt[i]] = ;
vis[vt[i]] = ;
q.push(vt[i]);
}
vt.clear();
while (!q.empty()) {
int u = q.front(); q.pop();
vis[u] = ;
for (int i = head[u]; ~i; i = e[i].nxt) {
int v = e[i].v;
if (dis[v] > dis[u] + ) {
dis[v] = dis[u] + ;
if (!vis[v]) vis[v] = , q.push(v);
}
}
}
} int main() {
int a, b;
idx = ;
memset(head, 0xff, sizeof (head));
memset(dis, 0x3f, sizeof (dis));
scanf("%d %d", &n, &m);
for (int i = ; i < n; ++i) {
scanf("%d %d", &a, &b);
addedge(a, b), addedge(b, a);
}
vt.push_back();
for (int i = ; i < m; ++i) {
scanf("%d %d", &a, &b);
if (a == ) vt.push_back(b);
else spread(), printf("%d\n", dis[b]);
}
return ;
}

Codeforces Round #199 (Div. 2)的更多相关文章

  1. Codeforces Round #199 (Div. 2) E. Xenia and Tree

    题目链接 2了,差点就A了...这题真心不难,开始想的就是暴力spfa就可以,直接来了一次询问,就来一次的那种,TLE了,想了想,存到栈里会更快,交又TLE了..无奈C又被cha了,我忙着看C去了.. ...

  2. Codeforces Round #199 (Div. 2) A Xenia and Divisors

    注意题目的数字最大是7 而能整除的只有 1,2,3,4,6,故构成的组合只能是1,2,4 或1,2,6或1,3,6,故分别统计1,2,3,4,6的个数,然后再分配 #include <iostr ...

  3. Codeforces Round #199 (Div. 2) B. Xenia and Spies

    B. Xenia and Spies time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. Codeforces Round #199 (Div. 2) C. Cupboard and Balloons

    C. Cupboard and Balloons time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Codeforces Round #199 (Div. 2) D. Xenia and Dominoes

    把 'O' 看成 'X',然后枚举它的四个方向看看是否能放,然后枚举 $2^4$ 种可能表示每种方向是否放了,放了的话就标成 'X',就相当于容斥,对于新的图去dp. dp就是铺地砖,行用二进制来表示 ...

  6. Codeforces Round #515 (Div. 3)

    Codeforces Round #515 (Div. 3) #include<bits/stdc++.h> #include<iostream> #include<cs ...

  7. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  8. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  9. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

随机推荐

  1. js,replace() 和 正则表达式(regular expression)

    repalce() 只能替换字符串中的匹配到的第一个字符或者字符串 正则表达式   替换多个字符或者字符串 注意:一些数字型的字符串使用replace() 时要确保是字符串,而不是数字. 转换方法: ...

  2. SQLServer学习笔记<>sql的范围内查找,sql数据类型,字符串处理函数

    sql的范围内查找 (1)between.....and用法 通常情况下我们查找一个在某固定区域内的所有记录,可以采用>=,<=来写sql语句,例如:查找订单价格在1000到2000之间的 ...

  3. PostgreSQL中如何查看一个表所对应的文件

    通过pg_relation_filepath可以直接表(索引)对象对应的物理文件在哪里? 上面截图是“德哥”做的ppt:上面有详细解释! 当然也可以通过 系统表 pg_class 可以直接查出对应的物 ...

  4. 《深度探索C++对象模型》1

    C++对象模型: 多重继承模型示意: 第二章:构造函数 语意学 基类和派生类: Bear yogi; ZooAnimal franny=yogi; 在这里,很容易理解合成的copy构造函数将vptr指 ...

  5. 对js原型的理解

    1.值类型和引用类型,引用类型都是对象,通过typeof()测试类型,instanceof测试是否是对象.对象是属性的集合. 2.对象都是由函数创建的,函数又是一个对象. 3.函数有一个默认的属性,叫 ...

  6. quick lua目录结构

    http://cn.cocos2d-x.org/tutorial/show?id=1138 http://cn.cocos2d-x.org/tutorial/show?id=2385

  7. 20151210001 DataGridView 选中与被选中

    // DataSet_IP list        private void DataSet_IP_list()        {            DataSet_IP = new System ...

  8. Codeforces Round #336 Marbles

    E. Marbles time limit per test:  2 seconds memory limit per test:  256 megabytes input:  standard in ...

  9. poj3270 Cow Sorting

    给定有序数组a[1...n]的一个置换a[σ(1)...σ(n)], 通过交换数组元素把置换后的数组恢复为有序, 定义进行一次交换的代价为两元素之和,试问此过程的最小总代价. 实际上一种置换即定义S ...

  10. Maximum Value(哈希)

    B. Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standard inp ...