Codeforces Round #264 (Div. 2)
http://codeforces.com/contest/463
这场是我人生第一场cf啊。。
悲剧处处是啊。
首先,看不懂题,完全理解不了啊。都是wa了好几次才过的
所以a和b这两sb题我做了1个小时!
然后c这题我用cin。。。。。。。悲剧
因为我听说cf评测机很快!!
rating掉了73,1300名啊,如果c没tle。。。。就到300名了。。。以后一定要小心!小心!小心!
悲剧
(太急打出来的代码不是很优美)
A.
题意:给你n个物品及他们的价格,美元加上美分,然后你有s美元,问买一种且一个所剩最大美分为多少(去掉美元)
直接判这种物品是否可行然后用100减去(总钱价格)mod100.。。。。找个最大的就完了
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=105;
int x[N], y[N], sum[N], s, can[N];
int main() {
int n, s, maxi=-(~0u>>1);
cin >> n >> s;
for1(i, 1, n) { cin >> x[i] >> y[i]; if(x[i]*100+y[i]<=s*100) can[i]=1; }
s*=100;
int flag=0;
for1(i, 1, n) {
if(!can[i]) continue;
flag=1;
maxi=max(maxi, (100-y[i])%100);
}
if(!flag) maxi=-1;
cout << maxi << endl;
return 0;
}
B.
给你个初始能量,从1塔爬到n塔,初始高度为0,每爬一个塔就要耗费h[k]-h[k+1],当然是正的就可以补能量,负就就减能量,要求每一个塔的能量都不能负。求初始能量最小的答案。
输出最高的即可。。。因为不是最高的积累的能量是不可能爬到最高的。所以。。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=100005;
int a[N], n;
int main() {
cin >> n;
for1(i, 1, n) cin >> a[i];
int ans=-(~0u>>1);
for1(i, 1, n) ans=max(a[i], ans);
cout << ans;
return 0;
}
C.
放2个象到n×n的棋盘上,攻击范围为两条斜线,且斜线不能有格子重叠,将所有在斜线上的格子的和累加起来就是一个答案,求最大的答案。
不能重叠显然要黑白染色,一个象在黑,一个象在白,自己画图。然后预处理每条斜线的和,然后n^2扫一遍就行了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const long long getint() { long long r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=2005, oo=~0u>>1;
typedef long long ll;
ll mp[N][N], lft[N+N], rgh[N+N];
int n; int main() {
cin >> n;
for1(i, 1, n) for1(j, 1, n) read(mp[i][j]);
for1(i, 1, n) for1(j, 1, n) {
lft[i+j]+=mp[i][j];
rgh[n+(i-j)]+=mp[i][j];
}
int xx=-1, yy=-1, xxx=-1, yyy=-1;
ll now1=-oo, now2=-oo;
for1(i, 1, n) for1(j, 1, n) {
if((i+j)%2) { //black
if(xx==-1 || (lft[i+j]-mp[i][j]+rgh[n+i-j])>now1) {
xx=i; yy=j;
now1=(lft[i+j]-mp[i][j]+rgh[n+i-j]);
}
}
else {
if(xxx==-1 || (lft[i+j]-mp[i][j]+rgh[n+i-j])>now2) {
xxx=i; yyy=j;
now2=(lft[i+j]-mp[i][j]+rgh[n+i-j]);
}
}
}
cout << now1+now2 << endl;
cout << xxx << " " << yyy << " " << xx << " " << yy <<endl;
return 0;
}
D.不会,有时间去看看
dp。。。
题意:给你1-n的排列组成的k个串,求lcs
一开始不会啊。
我们设状态d[i]表示第一行第i个组成的lcs的最大长度。
我们来想怎么转移呢。。
我们可以找到所有在i位置的数,只要判断他们都是不是都在第一行前面i个的某一个数的右边,
然后更新。
也就是说
d[i]=max(d[i], d[j]+1) j<i 当所有的 pos[a[k][i]]>pos[a[k][j]]
只要注意我的定义是第一行的就行了。
然后取所有d[i]最大的即可
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=1005;
int a[N][N], d[N], pos[N][N];
int n, m; bool check(int x, int y) {
for1(i, 1, m) if(pos[i][x]<pos[i][y]) return false;
return true;
} int main() {
read(n); read(m);
int ans=-1;
for1(i, 1, m) for1(j, 1, n) {
read(a[i][j]);
pos[i][a[i][j]]=j;
}
for1(i, 1, n) rep(j, i) if(check(a[1][i], a[1][j])) d[i]=max(d[i], d[j]+1);
for1(i, 1, n) ans=max(ans, d[i]);
print(ans);
return 0;
}
E.没看,有时间去看看。
听说暴力可以过。。。
正解就是dfs+分解质因数,因为修改操作不超过50,所以复杂度为O(nsqrt(a))~O(1)
gcd不等于1说明他们没有相同的质因数,所以我们只要存个质因数的链,找到这个点所有质因数的最大的祖先,就是了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
#define rdm(x) for(int i=ihead[x]; i; i=e[i].next)
#define pb push_back
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } typedef vector<int> vin;
typedef vin::iterator vii;
const int N=100001;
vin pm[N*10*2];
int ihead[N], w[N], cnt, f[N], n, q, dep[N];
struct ED { int to, next; }e[N*2]; inline void add(const int &u, const int &v) {
e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v;
e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u;
}
void dfs1(const int &x, const int &ff) {
dep[x]=dep[ff]+1;
rdm(x) if(ff!=e[i].to) dfs1(e[i].to, x);
}
void dfs(const int &x, const int &ff) {
vin y;
int t=w[x], fa=-1, upd=-1;
for(int i=2; i*i<=t; ++i)
if(!(t%i)) {
if(pm[i].size()) if(dep[pm[i].back()]>fa) fa=dep[upd=pm[i].back()];
y.pb(i); pm[i].pb(x);
while(!(t%i)) t/=i;
}
if(t!=1) {
if(pm[t].size()) if(dep[pm[t].back()]>fa) fa=dep[upd=pm[t].back()];
y.pb(t); pm[t].pb(x);
}
f[x]=upd;
rdm(x) if(ff!=e[i].to) dfs(e[i].to, x);
for(vii it=y.begin(); it!=y.end(); ++it) pm[*it].pop_back();
}
int main() {
read(n); read(q);
for1(i, 1, n) read(w[i]);
for2(i, 1, n) add(getint(), getint());
dfs1(1, 0); dfs(1, 0);
int a, b;
while(q--) {
read(a); read(b);
if(a==1) printf("%d\n", f[b]);
else {
read(a);
w[b]=a;
dfs(1, 0);
}
}
return 0;
}
预处理筛素数版(快了3000ms。。。)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
#define rdm(x) for(int i=ihead[x]; i; i=e[i].next)
#define pb push_back
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } typedef vector<int> vin;
typedef vin::iterator vii;
const int N=100001, A=N*10*2;
vin pm[N*2];
int ihead[N], w[N], cnt, f[N], n, q, dep[N], prime[N*2], pos[A], pcnt;
bool notprime[A+10];
struct ED { int to, next; }e[N*2]; inline void add(const int &u, const int &v) {
e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v;
e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u;
}
void init() {
for1(i, 2, A) {
if(!notprime[i]) prime[pcnt++]=i, pos[i]=pcnt-1;
for(int j=0; j<pcnt && i*prime[j]<=A; ++j) {
notprime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
void dfs1(const int &x, const int &ff) {
dep[x]=dep[ff]+1;
rdm(x) if(ff!=e[i].to) dfs1(e[i].to, x);
}
void dfs(const int &x, const int &ff) {
vin y;
int t=w[x], fa=-1, upd=-1;
for(int i=0; prime[i]*prime[i]<=t; ++i)
if(!(t%prime[i])) {
int p=prime[i];
if(pm[i].size()) if(dep[pm[i].back()]>fa) fa=dep[upd=pm[i].back()];
y.pb(i); pm[i].pb(x);
while(!(t%p)) t/=p;
}
if(t!=1) {
if(pm[pos[t]].size()) if(dep[pm[pos[t]].back()]>fa) fa=dep[upd=pm[pos[t]].back()];
y.pb(pos[t]); pm[pos[t]].pb(x);
}
f[x]=upd;
rdm(x) if(ff!=e[i].to) dfs(e[i].to, x);
for(vii it=y.begin(); it!=y.end(); ++it) pm[*it].pop_back();
}
int main() {
read(n); read(q);
init();
for1(i, 1, n) read(w[i]);
for2(i, 1, n) add(getint(), getint());
dfs1(1, 0); dfs(1, 0);
int a, b;
while(q--) {
read(a); read(b);
if(a==1) printf("%d\n", f[b]);
else {
read(a);
w[b]=a;
dfs(1, 0);
}
}
return 0;
}
Codeforces Round #264 (Div. 2)的更多相关文章
- Codeforces Round #264 (Div. 2) E. Caisa and Tree 树上操作暴力
http://codeforces.com/contest/463/problem/E 给出一个总节点数量为n的树,每个节点有权值,进行q次操作,每次操作有两种选项: 1. 询问节点v到root之间的 ...
- Codeforces Round #264 (Div. 2) D. Gargari and Permutations 多序列LIS+dp好题
http://codeforces.com/contest/463/problem/D 求k个序列的最长公共子序列. k<=5 肯定 不能直接LCS 网上题解全是图论解法...我就来个dp的解法 ...
- Codeforces Round #264 (Div. 2) C. Gargari and Bishops 主教攻击
http://codeforces.com/contest/463/problem/C 在一个n∗n的国际象棋的棋盘上放两个主教,要求不能有位置同时被两个主教攻击到,然后被一个主教攻击到的位置上获得得 ...
- Codeforces Round #264 (Div. 2) C
题目: C. Gargari and Bishops time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- Codeforces Round #264 (Div. 2) C Gargari and Bishops 【暴力】
称号: 意甲冠军:给定一个矩阵,每格我们有一个数,然后把两个大象,我希望能够吃的对角线上的所有数字.我问两个最大的大象可以吃值. 分析:这种想法是暴力的主题,计算出每一格放象的话能得到多少钱,然后求出 ...
- Codeforces Round #264 (Div. 2) D
题意: 给出最多5个序列,问这几个序列的最长公共子序列的长度是多少. solution : 脑抽级别我是,第一个序列每个数字位置固定,这样只要维护一个k-1维的偏序集就好了.然后在保证每个位置合法的情 ...
- 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 ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
随机推荐
- delphi 枚举类型
枚举类型定义了一系列有序值的集合.枚举变量就是从这个既定的集合中取某个值.集合中的有序值可以称为元素,元素一般从0开始索引(也就是元素的顺序号). 定义一个枚举类型,采用以下的格式: type typ ...
- 关于delphi PAServer 远程调试DLL文件
用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...
- typedef 各类定义,各类问题大全
第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定 ...
- shell脚本检测局域网内存活主机
<1> d211 admin # for i in {3..254} ; do ping -c 1 192.168.1.$i &>/dev/null && e ...
- 【GoLang】GoLang 微服务、开源库等参考资料
参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries ...
- ASP.NET MVC 的URL路由介绍
在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ...
- WebSite和WebApplication的区别
1. WebApplication(Web应用程序)和WebSite(网站)的区别:WebSite是为了兼容从ASP转过来的开发人员的习惯而存在的,用起来简单,例如:不需要创建命名控件.C#代码修改以 ...
- Group Shifted Strings
Given a string, we can "shift" each of its letter to its successive letter, for example: & ...
- C++复数四则运算的实现
程序主要实现复数的加减乘,数乘,取共轭功能. 将所有函数都定义为了成员函数. 使用库函数atof将字符串转换为浮点型数据. 函数主要难点在于处理输入.由于需要判断输入是选择退出还是继续,所以用字符串来 ...
- Html5 History API解析
浏览器前进与回退操作 在传统的浏览器中我们只能通过调用window.history对象的 forward() . back() 或 go(number|url) 方法来进行页面的前进.回退或跳转到某一 ...