我发现已经无力吐嘈这几次的比赛了。。。这次蹭数据的少了许多,不过出题报告讲的那叫一个玄而又玄,完全没理解他要表达什么

http://page.renren.com/601081183/note/863771603?ref=minifeed&sfet=2012&fin=1&ff_id=601081183&feed=page_blog&tagid=863771603&statID=page_601081183_2&level=1

1001

数论题,当时根本就没想到,也不知道怎么证明。。。题解说A的所有质因子包含在B里边,原因是每一个某进制数都可以写成x = p1^k1 * p2^k2 * p3^k3.... (pi为素数)。所以当B包含A的所有质因子时,A进制数一定能被B进制表示。

关于怎么判断A的质因子在B里边。打一个sqrt(A)大小的素数表。A不断除掉小于等于sqrt(A)的质因子,并且判断这个质因子是否能被B整除。最后如果A剩下>sqrt(A)的质因子,同样判断这个数是否被B整除。(不可能出现>sqrt(A)的质因子个数多于1的情况。。。)

View Code

typedef long long LL;
const int eps = 1e-8;
const int inf = ~0u>>2;using namespace std;const int N = 1000000;int prime[1000000];
bool vis[1000010];
int cnt, ans;void init() {int i;LL j;CL(vis, true);for(i = 2; i <= N; ++i) {for(j = LL(i)*LL(i); j <= N; j += i)vis[j] = false;}cnt = 0;for(i = 2; i <= N; ++i)if(vis[i])  prime[cnt++] = i;
}bool solve(LL A, LL B) {for(int i = 0; i < cnt; ++i) {if(A%prime[i] == 0) {if(B%prime[i] != 0) return false;while(A%prime[i] == 0)   A /= prime[i];}if(prime[i] > A)    break;}if(A > 1)   return B%A == 0;return true;
}int main() {//freopen("data.in", "r", stdin);int t, cas = 0;LL A, B;init();scanf("%d", &t);while(t--) {cin >> A >> B;printf("Case #%d: ", ++cas);if(solve(A, B))   puts("YES");else    puts("NO");}return 0;
}

1003

这是我对题解最想吐嘈的题。。。你妹!c和k分不清楚吗?!到底是bi还是bj不知道吗!!!

吐嘈完毕-_-!

确实是个好题,把欢乐值当成费用,糖果个数当成流。

以下为转载内容:http://blog.csdn.net/cyberzhg/article/details/7815790

当快乐的程度超过b[i]时,多出来的部分就浪费了,为了使浪费尽可能少,我们用费用流加以控制,当获得最大费用最大流的时候,这是的费用的利用率就是最高的。

在建图时只需考虑特殊的糖就可以了,建图方法:

原点到每个糖:流为1,费用为0

如果糖对某个人有特殊效果,连边:流为1,费用为0

人向汇点连边:

  最终快乐的程度不超过b[i]的情况:流为b[i]/k,限制这样的糖的数量,费用为k,因为特殊效果全部利用上了。

  快乐程度超过b[i]的情况:流为1,限制流量不超过b[i],费用为b[i] % k,因为多出来的快乐无效。当b[i] % k == 0时,这样的边没有必要。当b[i] % k == 1时,这时的糖和普通的糖无异,没必要连边。

ps:做这道题才发现以前的费用流模板是那么的水。。。Orz cyberzhg大神

View Code

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <ctime>
#include <queue>
#include <map>
#include <sstream>#define CL(arr, val)    memset(arr, val, sizeof(arr))
#define REP(i, n)       for((i) = 0; (i) < (n); ++(i))
#define FOR(i, l, h)    for((i) = (l); (i) <= (h); ++(i))
#define FORD(i, h, l)   for((i) = (h); (i) >= (l); --(i))
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   x < y ? x : y
#define Max(x, y)   x < y ? y : x
#define E(x)    (1 << (x))
#define iabs(x)  ((x) > 0 ? (x) : -(x))typedef long long LL;
const int eps = 1e-8;
const int inf = ~0u>>2;using namespace std;const int N = 110;
const int M = N*N*2;int n, m, k;
int b[N], sumb;
int c[N][N];
int S, T;struct node {int from, to, cost, flow, next;   //
} g[M];int head[N], t;void init() {CL(head, -1); t = 0;
}void add(int u, int v, int f, int w) {g[t].from = u; g[t].to = v;  g[t].cost = w; g[t].flow = f;g[t].next = head[u]; head[u] = t++;g[t].from = v; g[t].to = u; g[t].cost = -w; g[t].flow = 0;g[t].next = head[v]; head[v] = t++;
}void build() {init();int i, j;S = 0; T = m + n + 1;for(i = 1; i <= n; ++i) {add(S, i, 1, 0);    //flow, cost;
    }for(i = 1; i<= m; ++i) {for(j = 1; j <= n; ++j) {if(c[i][j]) add(j, i + n, 1, 0);}}for(j = 1; j <= m; ++j) {add(j+n, T, b[j]/k, k);if(b[j]%k > 1) {add(j + n, T, 1, b[j]%k);}}
}int dis[N];
int pre[N];
bool vis[N];
queue<int> q;bool spfa() {while(!q.empty())   q.pop();CL(vis, 0);CL(dis, -1);CL(pre, -1);q.push(S); dis[S] = 0;vis[S] = true; pre[S] = -1;int u, v, w, i;while(!q.empty()) {u = q.front(); q.pop();for(i = head[u]; i != -1; i = g[i].next) {v = g[i].to;w = g[i].cost;if(g[i].flow && dis[v] < dis[u] + w) {dis[v] = dis[u] + w;pre[v] = i;if(!vis[v]) {vis[v] = true; q.push(v);}}}vis[u] = false;}return dis[T] != -1;
}int get_flow() {int tmp = T;int res = inf;while(pre[tmp] != -1) {res = min(res, g[pre[tmp]].flow);tmp = g[pre[tmp]].from;}tmp = T;while(pre[tmp] != -1) {g[pre[tmp]].flow -= res;g[pre[tmp]^1].flow += res;tmp = g[pre[tmp]].from;}return res;
}bool solve() {int Cost = 0, Flow = 0;while(spfa()) {Cost += dis[T];Flow += get_flow();}//printf("%d %d\n", Cost, Flow);//return Cost + n - Flow >= sumb;
}int main() {//freopen("data.in", "r", stdin);int t, i, j, cas = 0;scanf("%d", &t);while(t--) {CL(c, 0);CL(b, 0);sumb = 0;scanf("%d%d%d", &n, &m, &k);for(i = 1; i <= m; ++i)     {scanf("%d", b + i); sumb += b[i];}for(i = 1; i <= m; ++i) {for(j = 1; j <= n; ++j) scanf("%d", &c[i][j]);}printf("Case #%d: ", ++cas);build();if(solve()) puts("YES");else    puts("NO");}return 0;
}

1004

对字符串添加,删除,更改。。。很明显的dp。。。数据不强,不用BK-Tree优化就可以过。。。

暴力+dp

View Code

int dif[20][20];
char dic[1600][20];
char tmp[20];
int len[1600];
int n, m;int solve(char* str1,char* str2, int x, int y) {int len1 = x;int len2 = y;CL(dif, 0);for (int a = 0; a <= len1; a++) {dif[a][0] = a;}for (int a = 0; a <= len2; a++) {dif[0][a] = a;}int temp;for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; j++) {if (str1[i - 1] == str2[j - 1]) {temp = 0;} else {temp = 1;}dif[i][j] = min(dif[i - 1][j - 1] + temp, min(dif[i][j - 1] + 1, dif[i - 1][j] + 1));}}return dif[len1][len2];
}int main() {//freopen("data.in", "r", stdin);int t, i, y, l, cnt, cas = 0;scanf("%d", &t);while(t--) {scanf("%d%d", &n, &m);CL(dic, 0);CL(len, 0);for(i = 0; i < n; ++i) {scanf("%s", dic[i]);len[i] = strlen(dic[i]);}printf("Case #%d:\n", ++cas);while(m--) {scanf("%s%d", tmp, &y);cnt = 0;for(i = 0; i < n; ++i) {l = strlen(tmp);if(iabs(l - len[i]) > y)    continue;if(solve(dic[i], tmp, len[i], l) <= y)    cnt++;}printf("%d\n", cnt);}}return 0;
}

1005

思路是找节点数为 3的环。用dfs可以解决

开一个cnt[]记录每个节点的状态

cnt[i] = 0 表示i还未被访问过

cnt[i] = -1 表示跟i相连的所有子节点还没有被访问完,如果在访问它的所有字节点过程中又访问到它自己,说明有环。

cnt[i] = 1 表示跟i相连的所有子节点还被访问完。

用一个pos[]记录每个节点被访问的次序。如果dfs(u)时出现cnt[v] = -1的情况,则判断pos[u] 和pos[v]的距离是否为2.

View Code

const int N = 2048;struct node {int to;int next;
} g[N*N];char str[N][N];
int head[N], t;
int cnt[N];
int pot[N];
int np;
bool flag;void init() {CL(head, -1); t = 0;
}void add(int u, int v) {g[t].to = v; g[t].next = head[u]; head[u] = t++;
}void dfs(int cur) {cnt[cur] = -1;pot[cur] = np++;int i, v;for(i = head[cur]; i != -1; i = g[i].next) {v = g[i].to;if(cnt[v] == -1 && iabs(pot[cur] - pot[v]) == 2) {flag = true;return ;} else if(cnt[v] == 0)  {dfs(v);}}cnt[cur] = 1;
}int main() {//freopen("data.in", "r", stdin);int t, i, j, n, cas = 0;scanf("%d", &t);while(t--) {init();scanf("%d", &n);for(i = 0; i < n; ++i) {scanf("%s", str[i]);for(j = 0; j < n; ++j) {if(str[i][j] == '1')    add(i, j);}}CL(cnt, 0);CL(pot, 0);flag = false;np = 0;for(i = 0; i < n; ++i) {if(cnt[i] == 0)   dfs(i);if(flag)    break;}printf("Case #%d: ", ++cas);if(flag)    puts("Yes");else    puts("No");}return 0;
}

1006

很裸的线段树染色问题。。。比赛的时候gbx做的

View Code

const int N = 100010;struct node {int l, r;int col;
} tree[N<<2];int num[N*3], cnt;
int L[N], R[N], M[N];
int n, m;int find(int x) {int l = 0, r = cnt, mid;while(l <= r) {mid = MID(l, r);if(num[mid] == x)   return mid;else if(num[mid] > x)   r = mid - 1;else    l = mid + 1;}return -1;
}void creat(int t, int l, int r) {tree[t].l = l;tree[t].r = r;tree[t].col = 0;if(l == r)  return ;int mid = MID(l, r);creat(L(t), l, mid);creat(R(t), mid + 1, r);
}void push_down(int t) {if(tree[t].col != 0) {tree[L(t)].col += tree[t].col;tree[R(t)].col += tree[t].col;tree[t].col = 0;}
}void updata(int t, int l, int r) {if(tree[t].l >= l && tree[t].r <= r) {tree[t].col ++;return ;}push_down(t);int mid = MID(tree[t].l, tree[t].r);if(l > mid) updata(R(t), l, r);else if(r <= mid)   updata(L(t), l, r);else {updata(L(t), l, mid);updata(R(t), mid + 1, r);}
}int query(int t, int p) {if(tree[t].l == tree[t].r) {return tree[t].col;}push_down(t);int mid = MID(tree[t].l, tree[t].r);if(p > mid) return query(R(t), p);else    return query(L(t), p);
}void read() {scanf("%d%d", &n, &m);cnt = 0;for(int i = 0; i < n; ++i) {scanf("%d%d", &L[i], &R[i]);num[cnt++] = L[i];num[cnt++] = R[i];}for(int i = 0; i < m; ++i) {scanf("%d", &M[i]);num[cnt++] = M[i];}sort(num, num + cnt);
}int main() {//freopen("data.in", "r", stdin);int t, i, x, y, cas = 0;scanf("%d", &t);while(t--) {read();creat(1, 0, cnt);for(i = 0; i < n; ++i) {x = find(L[i]);y = find(R[i]);updata(1, x, y);}printf("Case #%d:\n", ++cas);for(i = 0; i < m; ++i) {x = find(M[i]);printf("%d\n", query(1, x));}}return 0;
}

1009

对于红蓝相间的块和单色的块分开讨论,单色块是很经典的最大子矩阵问题的变形,记录一下上界,左右边界,找最大面积。

红蓝相间的块直接dp,f[i][j]表示以i,j为右下角的最大正方形。tmp = min(f[i][j-1] , f[i-1][j]); f[i][j] = max(tmp + mp[i-tmp][j-tmp], 1)

这个过程画画图就很清楚。因为tmp本身取的求实小的,那么>tmp的那一块肯定是红蓝相间的正方形。

View Code

const int N = 1010;int dp[N][N];
int mp[N][N];
int H[N], L[N], R[N];
int n, m, ans;
char str[N];void red_or_blue(int x) {    //单色int i, j;for(i = 1; i <= m; ++i) {H[i] = 0; L[i] = 1; R[i] = m;}int lm, rm;for(i = 1; i <= n; ++i) {lm = 1, rm = m;for(j = 1; j <= m; ++j) {if(mp[i][j] == x) {H[j]++;if(L[j] < lm)   L[j] = lm;} else {H[j] = 0; lm = j + 1; L[j] = 1; R[j] = m;}}for(j = m; j >= 1; --j) {if(H[j]) {if(R[j] > rm)   R[j] = rm;ans = max(ans, (H[j] + R[j] - L[j] + 1)*2);} else {rm = j - 1;}}}
}void red_and_blue() {     //相间色int i, j, x;for(i = 1; i <= n; ++i) dp[i][1] = 1;for(j = 1; j <= m; ++j) dp[1][j] = 1;for(i = 2; i <= n; ++i) {for(j = 2; j <= m; ++j) {dp[i][j] = 1;if(mp[i][j] == mp[i][j-1] ||mp[i][j] == mp[i-1][j] ||mp[i][j] != mp[i-1][j-1]) {continue;}x = min(dp[i-1][j], dp[i][j-1]);if(mp[i][j] == mp[i-x][j-x])  ++x;dp[i][j] = max(dp[i][j], x);ans = max(ans, dp[i][j]);}}ans <<= 2;
}int main() {//freopen("data.in", "r", stdin);int t, i, j, cas = 0;scanf("%d", &t);while(t--) {scanf("%d%d", &n, &m);CL(mp, 0);for(i = 1; i <= n; ++i) {scanf("%s", str + 1);for(j = 1; j <= m; ++j) {mp[i][j] = (str[j] == 'R');}}ans = 1;red_and_blue();red_or_blue(0);red_or_blue(1);printf("Case #%d: %d\n", ++cas, ans);}return 0;
}

1010

神题意

题意说明白了相信都会做

P(r)怎么求,

比如给出原字典串

(1)Apple iphone.com ipad.com

又给出搜索得到的串

(2)Apple gdfgd.com iphone.com ipad.com

P(i)表示:(2)串中,前i个串里边有j个串在字典串中包含,那么P(i) = 1.0*j / i;

AveP = sum(P[i])/num  num表示(2)中有多少个串。

ans = sum(AveP)/n;

View Code

const int N = 10010;char dic[110][N];
char res[110][N];
string s;double getAveP(char* a, char* b) {map<string, int> mp;istringstream dic(a);istringstream res(b);int num = 0, cnt = 0, l = 0;double ret = .0;dic >> s;while(dic >> s)     mp[s] = 1, num++;res >> s;while(res >> s) {cnt++;if(mp[s] == 1) {l++;ret += double(l)/cnt;}}return ret/num;
}int main() {//freopen("data.in", "r", stdin);int t, n, i, cas = 0;scanf("%d", &t);while(t--) {scanf("%d\n", &n);for(i = 0; i < n; ++i)  cin.getline(dic[i], N);for(i = 0; i < n; ++i)  cin.getline(res[i], N);double ans = .0;for(i = 0; i < n; ++i) {ans += getAveP(dic[i], res[i]);}printf("Case #%d: %.6f\n", ++cas, ans/n);}return 0;
}

HDU 多校联合第三场相关推荐

  1. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去 2 ...

  2. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

    题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<1 ...

  3. hdu 多校赛 第三场

    slove  2/11 rank  288 补题   5/11 --------------------------------------------------- 6604 Blow up the ...

  4. 2021湖南多校对抗赛第三场

    2021湖南多校对抗赛第三场 排名 第一 第二 第三 中南2队 中南1队 湘潭大学1队 团体成绩 学校 总题数 总罚时 中南大学 26 4396 题解(部分) special thanks: Binb ...

  5. 2022湖南多校对抗赛第三场

    2022湖南多校对抗赛第三场 队伍排名 第一 第二 第三 中南大学1队 国防科技大学1队 湖南师范大学3队 团体成绩 取每个学校正式队伍前四名 学校 总题数 中南大学 27 湖南师范大学 27 湖南大 ...

  6. 2015 多校赛 第三场 1002 (hdu 5317)

    Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more i ...

  7. 2019牛客暑期多校训练营 第三场 I Median

    传送门 链接:https://ac.nowcoder.com/acm/contest/883/I 来源:牛客网 JSB has an integer sequence a1,a2,-,ana_1, a ...

  8. 2014多校联合-第六场

    最近这两场好无奈啊... 今天这场最后30分钟敲1001,压力倍增,虽然思路比较明确,但是代码打起来不怎么容易. 但是还是好在25分钟左右debug结束.提交wa,再提交,依然WA.......最后5 ...

  9. HDU多校联合赛(1007 Magical Forest)模拟题

    题目: Problem Description There is a forest can be seen as N * M grid. In this forest, there is some m ...

最新文章

  1. 一些有用的Python问题
  2. SqlServer项目经验:介质集有2个介质簇,但只提供了1个。必须提供所有成员
  3. 用JS实现一个定时间段的跳转
  4. 如何评价rcnn、fast-rcnn和faster-rcnn这一系列方法?
  5. plsql(轻量版)_游标的使用1
  6. signature=0880bf79d1c426abd0c8ca4bc897d06f,index.html
  7. mysql快速部署主从复制
  8. eclipse下的webservice开发
  9. Linux系统维护人员的必备参考书
  10. 一周第二次课(12月12日)
  11. 为什么做了梦第二天想不起来_做过的梦为什么总是想不起来?
  12. double、float、long占几个字节?
  13. QQ空间自动删除说说的js脚本(亲测有效)
  14. Axure RP8手机边框
  15. qt开源项目: tiled 瓦片 游戏地图编辑器
  16. 【Matlab系列】Matlab信号添加噪声及信噪比SNR的计算
  17. 有一篇文章,共有3行文字,每行有最多80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
  18. h0154.加勒比海盗船——最优装载问题 (20 分)
  19. ISP Tuning—高通Chromatix6
  20. 智能家居大规模落地的关键,在于能否迈过“老人”这道坎

热门文章

  1. 计算机中表示信息量最小的单位是什么,计算机中信息的最小单位是什么?
  2. 中兴JAVA直板手机_中国移动定制中兴直板3G手机U210图赏
  3. Oday安全 12.3.1Ret2Libc实战之利用ZwSetInformationProcess一节注记(下)
  4. a20+android4.4,6.6【落叶出品】开博尔全志A20双核系列KIUI7.0_Android4.4固件
  5. python下载第三方库的时候报错ERROR: Command errored out with exit status 1: python setup.py egg_info Check the
  6. 记一次泛微漏洞分析到发现未公开新漏洞
  7. 我对这产品有个理解二--脸萌
  8. Labelmx条码软件如何制作试卷答题卡条码标签
  9. [VM]为Windows Server 2012 R2安装vmtools遇到的问题
  10. 2022-2028年中国城市物流车行业市场前瞻与投资战略规划分析报告