2016 CCPC 长春 Solution
A - Hanzo vs. Genji
留坑。
B - Fraction
水。
#include <bits/stdc++.h>
using namespace std; inline int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
} int t, n;
int a[], b[]; int main()
{
scanf("%d", &t);
for (int kase = ; kase <= t; ++kase)
{
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%d", a + i);
for (int i = ; i <= n; ++i) scanf("%d", b + i);
int p = b[n], q = a[n];
for (int i = n - ; i >= ; --i)
{
int tq = a[i] * q + p;
int tp = b[i] * q;
p = tp, q = tq;
int Gcd = gcd(p, q); p /= Gcd, q /= Gcd;
}
int Gcd = gcd(p, q); p /= Gcd, q /= Gcd;
printf("Case #%d: %d %d\n", kase, p, q);
}
return ;
}
C - Rotate String
留坑。
D - Triangle
水。
#include <bits/stdc++.h>
using namespace std; int fic[]; int t, n; int main()
{
fic[] = fic[] = ;
for (int i = ; i <= ; ++i) fic[i] = fic[i - ] + fic[i - ];
scanf("%d", &t);
for (int kase = ; kase <= t; ++kase)
{
scanf("%d", &n);
int pos = upper_bound(fic + , fic + , n) - fic;
printf("Case #%d: %d\n", kase, n - pos + );
}
return ;
}
E - The Fastest Runner Ms. Zhang
留坑。
F - Harmonic Value Description
题意:有一个1-n的全排列,定义一个值$\sum_{i = 1}^{i = n - 1} gcd(p_i, p_{i + 1})$ 求这个值第k大的数列
思路:首先相邻的奇数的gcd为1,相邻的偶数的gcd为2
分类讨论:k=1输出原序列
k为偶数,将k和2*k提前输出在按照原序列输出,提供的贡献就是k-1
k为奇数,将3开始的k-1个奇数提前,其他按照原序列输出,每个奇数的提前会导致左右的偶数产生贡献为2
#include<bits/stdc++.h> using namespace std; #define N 10010 int n, k;
int arr[N];
int vis[N]; int main()
{
int t;
scanf("%d",&t);
for(int cas = ; cas <= t; ++cas)
{
scanf("%d %d",&n, &k);
printf("Case #%d:", cas);
memset(vis, , sizeof vis);
if(k == )
{
for(int i = ; i <= n; ++i) arr[i] = i;
}
else if(k % == )
{
arr[] = k;
arr[] = * k;
int cnt = ;
for(int i = ; i <= n; ++i)
{
if(i == k || i == * k) continue;
arr[cnt++] = i;
}
}
else
{
int cnt = ;
int num = ;
for(int i = ; i < k; ++i)
{
arr[cnt++] = num;
vis[num] = ;
num += ;
}
for(int i = ; i <= n; ++i)
{
if(vis[i]) continue;
arr[cnt++] = i;
}
}
for(int i = ; i <= n; ++i) printf(" %d", arr[i]);
printf("\n");
}
return ;
}
G - Instability
题意:有n个点,m条边,求有多少个点的子集,使得这个子集中点的个数$>= 3$ 并且这个子集中存在三个点互相可达,或者互相不可达
思路:根据拉姆齐定理,当点数$>= 6$ 的时候,必然存在这种情况,对于点数3, 4, 5 直接暴力求解
#include <bits/stdc++.h>
using namespace std; #define ll long long const ll MOD = (ll)1e9 + ; ll fac[], inv[]; inline ll qpow(ll base, ll n)
{
ll res = ;
while (n)
{
if (n & ) res = res * base % MOD;
base = base * base % MOD;
n >>= ;
}
return res;
} inline void Fac_Init()
{
fac[] = ;
for (int i = ; i < ; ++i)
fac[i] = fac[i - ] * i % MOD;
inv[] = qpow(fac[], MOD - );
for (int i = ; i >= ; --i)
inv[i] = inv[i + ] * (i + ) % MOD;
} inline ll C(int a, int b)
{
if (b > a) return ;
if (b == ) return ;
return fac[a] * inv[b] % MOD * inv[a - b] % MOD;
} //ll C[55][55];
//
//void I() {
// for (int i = 0; i < 55; i++) C[i][0] = 1;
// for (int i = 1; i < 55; i++) {
// for (int j = 1; j <= i; j++) {
// C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
// }
// }
//} int t, n, m;
bool G[][];
int a[]; inline bool ok(int sz)
{
for (int i = ; i < sz; ++i)
for (int j = i + ; j < sz; ++j)
for (int k = j + ; k < sz; ++k)
{
if (G[a[i]][a[j]] && G[a[j]][a[k]] && G[a[i]][a[k]]) return true;
if (!G[a[i]][a[j]] && !G[a[j]][a[k]] && !G[a[i]][a[k]]) return true;
}
return false;
} inline ll work()
{
ll res = ;
for (a[] = ; a[] <= n; ++a[])
for (a[] = a[] + ; a[] <= n; ++a[])
for (a[] = a[] + ; a[] <= n; ++a[])
{
if (ok()) res = (res + ) >= MOD ? (res + - MOD) : (res + );
for (a[] = a[] + ; a[] <= n; ++a[])
{
if (ok()) res = (res + ) >= MOD ? (res + - MOD) : (res + );
for (a[] = a[] + ; a[] <= n; ++a[])
if (ok()) res = (res + ) >= MOD ? (res + - MOD) : (res + );
}
}
return res;
} inline void Run()
{
Fac_Init();
scanf("%d", &t);
for (int kase = ; kase <= t; ++kase)
{
printf("Case #%d: ", kase);
scanf("%d%d", &n, &m);
memset(G, , sizeof G);
for (int i = , u, v; i <= m; ++i)
{
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = ;
}
ll ans = ;
if (n >= )
{
for (int i = ; i <= n; ++i)
ans = (ans + C(n, i)) % MOD;
}
ans = (ans + work()) % MOD;
printf("%lld\n", ans);
}
} int main()
{
#ifdef LOCAL
freopen("Test.in", "r", stdin);
#endif Run();
return ;
}
H - Sequence I
题意:给出$arr[]$和$brr[]$ 给出p 求有多少个q 满足 $a_q, a_{q + p}, a_{q + 2p}.....a_{q + (m - 1)p}$ 和$brr[]$ 能够匹配上
思路:多次KMP 注意求nx数组的时候,要用模板中的第一个,不知道为啥。
#include<bits/stdc++.h> using namespace std; #define N 1000010 int arr[N];
int brr[N]; int n, m, p; inline void preKMP(int x[], int m, int kmpNext[])
{
int i, j;
j = kmpNext[] = -;
i = ;
while(i < m)
{
while(- != j && x[i] != x[j]) j = kmpNext[j];
kmpNext[++i] = ++j;
}
} int nxt[N]; int KMP_count(int x[], int m, int y[], int n)
{
preKMP(x, m, nxt);
int ans = ;
for(int k = ; k < p; ++k)
{
int i = k, j = ;
while(i < n)
{
while(j != - && y[i] != x[j]) j = nxt[j];
i += p;j++;
if(j >= m)
{
ans++;
j = nxt[j];
}
}
}
return ans;
} int main()
{
int t;
scanf("%d", &t);
for(int cas = ; cas <= t; ++cas)
{
scanf("%d %d %d",&n, &m, &p);
for(int i = ; i < n; ++i) scanf("%d", arr + i);
for(int i = ; i < m; ++i) scanf("%d", brr + i);
int ans = KMP_count(brr, m, arr, n);
printf("Case #%d: %d\n", cas, ans);
}
return ;
}
I - Sequence II
题意:给出一个$arr[]$ ,每次询问给出l, r 求这个区间内第一次出现的数中,第K个数的下标
思路:裸的主席树
#include <bits/stdc++.h>
using namespace std; #define N 200010
#define M N * 50 int t, n, q, ans;
int vis[N], arr[N];
int T[N], L[M], R[M], C[M], tot; inline int build(int l, int r)
{
int root = tot++;
C[root] = ;
if (l < r)
{
int mid = (l + r) >> ;
L[root] = build(l, mid);
R[root] = build(mid + , r);
}
return root;
} inline int update(int root, int pos, int val)
{
int newroot = tot++, tmp = newroot;
C[newroot] = C[root] + val;
int l = , r = n;
while (l < r)
{
int mid = (l + r) >> ;
if (pos <= mid)
{
L[newroot] = tot++, R[newroot] = R[root];
newroot = L[newroot], root = L[root];
r = mid;
}
else
{
L[newroot] = L[root], R[newroot] = tot++;
newroot = R[newroot], root = R[root];
l = mid + ;
}
C[newroot] = C[root] + val;
}
return tmp;
} inline int query(int root, int pos)
{
int l = , r = n;
int res = ;
while (l < r)
{
int mid = (l + r) >> ;
if (pos <= mid)
{
root = L[root];
r = mid;
}
else
{
res += C[L[root]];
root = R[root];
l = mid + ;
}
}
return res + C[root];
} inline int query2(int root, int k)
{
int l = , r = n;
int res = ;
while (l < r)
{
int mid = (l + r) >> ;
if (C[L[root]] >= k)
{
root = L[root];
r = mid;
}
else
{
k -= C[L[root]];
root = R[root];
l = mid + ;
}
}
return l; } int main()
{
scanf("%d", &t);
for (int kase = ; kase <= t; ++kase)
{
printf("Case #%d:", kase);
scanf("%d%d", &n, &q); tot = ;
for (int i = ; i <= n; ++i) scanf("%d", arr + i);
T[n + ] = build(, n);
memset(vis, , sizeof vis);
for (int i = n; i >= ; --i)
{
if (vis[arr[i]] == )
{
T[i] = update(T[i + ], i, );
}
else
{
T[i] = update(T[i + ], vis[arr[i]], -);
T[i] = update(T[i], i, );
}
vis[arr[i]] = i;
}
ans = ;
for (int i = , l, r; i <= q; ++i)
{
scanf("%d%d", &l, &r);
l = (l + ans) % n + ;
r = (r + ans) % n + ;
if (l > r) swap(l, r);
if (l == r)
{
printf(" %d", l);
ans = l;
continue;
}
int k = query(T[l], r); k = (k + ) / ;
ans = query2(T[l], k);
printf(" %d", ans);
}
puts("");
}
return ;
}
J - Ugly Problem
题意:给出一个数,求这个数能够被多少个回文数相加得到,个数不能超过50,输出这些数
思路:如果是10000 这样的数,那么就取9999 否则 就是 位数减半的前一位-1然后右半部分回文得到回文数
#include<bits/stdc++.h> using namespace std; int main() {
int t;
char st[];
int a[],b[],ans[][];
int x,y;
int i,j,k,len,cnt,kase;
scanf("%d",&t);
kase=;
while (t--) {
printf("Case #%d:\n",++kase);
scanf("%s",st);
len=strlen(st);
for (i=;i<len;++i)
a[len-i]=st[i]-;
x=len;
cnt=;
while (x>) {
cnt++;
k=x/+;
memset(b,,sizeof b);
while (k<=x) {
if (a[k]==) b[k]=;
else
{
b[k]=a[k]-;
k++;
break;
}
k++;
}
while (k<=x) {
b[k]=a[k];
k++;
}
y=x;
for (i=;i<=x/;++i)
b[i]=b[y-i+];
if (b[y]==) {b[]=; y--;}
ans[cnt][]=y;
for (i=y;i>=;--i) {
ans[cnt][i]=b[i];
//printf("%d",b[i]);
a[i]=a[i]-b[i];
}
//printf("\n");
for (i=;i<=x;++i)
if (a[i]<) {
a[i]=a[i]+;
a[i+]--;
}
while (a[x]==) --x;
}
if (a[]!=) {cnt++; ans[cnt][]=; ans[cnt][]=a[];}
printf("%d\n",cnt);
for (i=;i<=cnt;++i) {
for (j=ans[i][];j>=;--j) printf("%d",ans[i][j]);
printf("\n");
}
}
return ;
}
K - Binary Indexed Tree
留坑。
2016 CCPC 长春 Solution的更多相关文章
- 2016 CCPC长春重现赛
1.2016中国大学生程序设计竞赛(长春)-重现赛 2.总结:会做的太少,应变能力也不行,或者说猜题目的能力不行 02 水 04 HDU 5914 Triangle 1.题意:1~n,n个数,问 ...
- 2016 CCPC 东北地区重现赛
1. 2016 CCPC 东北地区重现赛 2.总结:弱渣,只做出01.03.05水题 08 HDU5929 Basic Data Structure 模拟,双端队列 1.题意:模拟一个栈的操 ...
- HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)
题目链接 2016 CCPC东北地区大学生程序设计竞赛 B题 题意 给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...
- 2016 ccpc 网络选拔赛 F. Robots
Robots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2016 CCPC 长春站现场赛总结(流水账= =)
总的来说在写这篇总结的时候心情还是愉悦的,因为第一次参加区域赛就越过铜直接拿了个银~开心之情无法用语言形容啊233= =... 从杭州坐火车到长春,去的时候24个小时,回来32个小时,在路上就花了2天 ...
- 2016 CCPC 合肥赛区 平行四边形//打铁记录..... 背锅还是我在行 此处@ctr 233
也希望自己记住这些题并不是真的很难很难... 平行四边形... 这个题要两个直线上的两个点和给出点中的两个点组成的平行四边形面积最大. 确定两个点后,发现线上的点随之确定.那么我们解出线上的点 然后求 ...
- 2016 CCPC 杭州站 小结
5题倒数第一,铜……(我就知道我们很稳!!!哼!! 这一次心态完全爆炸 开场我就没有按照平时的顺序读题 然后zr的A题wa 我F题T xl说B是一个最小生成树,又说是最小树形图,不会写 K题完全没思路 ...
- HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢-- 这个变形并不难,跳着选数,把漏掉的位置补上就可以了. 代码如下: #include<iostream ...
- 2016 ccpc 杭州赛区的总结
毕竟是在杭电比的,和之前大连的icpc不同,杭电毕竟是隔壁学校,来回吃住全都是在自家寝室,方便! 不过说到方便也是有点不方便,室友都喜欢玩游戏,即使我昨晚9.30就睡觉了,仍然是凌晨一点才睡着,233 ...
随机推荐
- Qt监控后台服务运行状态
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMa ...
- Host ‘host_name’ is blocked
参考:http://web2.0coder.com/archives/163 之前服务器遇到了这个错误: Host ‘host_name‘ is blocked because of many con ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之LayerColor(8)
在前面文章中讲述了Cocos2d-x引擎OpenGL渲染准备Shader方面,本文主要讲解使用LayerColor来讲述OpenGL的渲染过程. 1.LayerColor对象创建 添加LayerCol ...
- c/c++设置图片为透明图
在绘制图片的时候先把源位图填充背景设置为白色 例如:m_bufferpicture.FillSolidRect(0,0,m_nWidth,m_nHeight,RGB(255,255,255));//这 ...
- JavaScript基础细讲
JavaScript基础细讲 JavaScript语言的前身叫作Livescript.自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原 ...
- ubuntu 安装nfs 服务
1. 安装nfs服务软件 (1)服务器端 $sudo apt-get install nfs-kernel-server rpcbind (2)客户端 (可以省略) $sudo apt-get in ...
- poj_2752 kmp
题目大意 给定字符串S,求出S的所有可能相同前后缀的长度.比如: "alala"的前缀分别为{"a", "al", "ala&qu ...
- 使用boch仿真器在x86 PC平台上搭建Linux0.11系统环境(windows下)
当你有机会来到这页面时 十有八九是遇到这样一个问题 执行配置文件bochsrc_fd.bxrc时出现找不到 ips的情况! 版本原因吧 将boch版本换成2.4的问题就迎刃而解了~ 简单 ...
- 对cookie的重新认识
这两天做了一个跟cookie打交道比较多的项目,把其中重新认识的点记录下来: 1.$.cookie(name, value, time),当time为0时,相当于本句没有执行,并不会将原本记录在用户浏 ...
- Maven常用操作
1. 修改Maven的本地仓库路径 1.1 默认会放在~/.m2/repository目录下 (“~”代表用户的目录,比如windows下一般都是C:\Documents and Settings\[ ...