HZNU Training 1 for Zhejiang Provincial Collegiate Programming Contest
赛后总结:
TJ:今天我先到实验室,开始看题,一眼就看了一道防AK的题目,还居然觉得自己能做wwww。然后金姐和彭彭来了以后,我和他们讲了点题目。然后金姐开始搞dfs,我和彭彭看榜研究F题。想了很久脑子都炸了,做不下去了。然后在等金姐做完以后,彭彭说了D题题意,然后金姐开始写另外一道搜索题。做完两道搜索以后,金姐让我写那道线段树的题目。我搞了很久。。。然后超时了,因为要用素数筛,然后加了素数筛也做不出呜呜。金姐和彭彭把Ant的题目公式给搞出来了。开始敲。后来是因为取模的问题,就一直没搞成功。比赛吃完饭回来搞了一下,就。。ac了。
呜呜呜,我要更努力,不给队友拖后腿。
JZH:今天又迟到了,上完体育课要从a区到b区,好痛苦。刚开始先看了B题,想到了LCIS,结果n太大不能dp,然后就没思路了。。。。然后彭彭让我去做了C题,但是不够仔细,WA了三发才A。做完之后,看了下F题,没思路,听彭彭讲了D题题意,就去做了D题,结果忘记用优先队列和把队列清空,又WA了两发才A (明明打的时候提醒过自己要用优先队列)。然后就去推H题的公式了,结果推出来又因为取模的原因一直过不了。
真是曲折的一天。继续努力!
PJW:到实验室,题目都还没打开,谭总就来跟我讲了一道防AK题。但也忘了为啥没有死磕。跟了榜,我看了D,让金姐看了C,然后。。。我理解错了题意,觉得D题我来解决可能有点难度,就让金姐敲了。。F题是和谭总一起看的,觉得好绕啊,就是没想到DP(虽然贪心也能做)后来。。我开了一道线段树的题目,谭总开了一道Ant,然而是谭总打得线段树,我和金姐看的Ant(我一边继续磕F题,一边帮金姐验算)第一遍开头就错了。。后来因为取模问题,我改代码的时候有想到要分类考虑。。然而可能还是觉得自己“强”的不用分类,就结束了还是WA。去吃饭的路上,都在讨论为什么WA,然后就得出了分类讨论。
我一直都是个打酱油的~~
题解:
给你一块2*2*2的魔方,问你在n步内能拼成的最多的面有多少。
一共有6*2种旋转方法,但是因为一边旋转,相当于另一边也在旋转,所以只需要列举6种情况。
借用一下https://www.cnblogs.com/linkzijun/p/7050040.html的图。
然后dfs暴力一下就好了。注意数字不要填错wwww。填错了,检查的眼睛痛。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int maxn = 2e5 + ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); }
int maxx;
int N;
int trans[][] = {
{,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,},
}; void dfs(int a[],int step)
{
int num = ;
if (a[] == a[] && a[] == a[] && a[] == a[])
num++;
if (a[] == a[] && a[] == a[] && a[] == a[])
num++;
if (a[] == a[] && a[] == a[] && a[] == a[])
num++;
if (a[] == a[] && a[] == a[] && a[] == a[])
num++;
if (a[] == a[] && a[] == a[] && a[] == a[])
num++;
if (a[] == a[] && a[] == a[] && a[] == a[])
num++;
maxx = max(maxx, num);
if (step == N || maxx == )
return;
int m[];
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
m[j] = a[trans[i][j]];
}
dfs(m, step + );
}
}
int main()
{
while (scanf("%d", &N) != EOF)
{
maxx = ;
int a[];
for (int i = ; i < ; i++)
cin >> a[i];
dfs(a, );
cout << maxx << endl;
}
system("pause");
return ;
}
农民开始播种。在n*m的田地上有几块石头,一开始机器从左上角点开始出发,问是否开机器,经过田地上的每个点只用一次,大石头不能到达。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int MAXN = 2e5+;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
int n, m, sum;
char a[][];
int vis[][];
int dir[][] = { ,,-,,,,,- };
bool check(int x, int y) {
if (x < || x >= n || y < || y >= m || vis[x][y] || a[x][y] == 'S')
return false;
return true;
}
bool dfs(int x, int y, int k)
{
if (k <= ) return true;
vis[x][y] = ;
for (int i = ; i < ; ++i)
{
int xx = x + dir[i][];
int yy = y + dir[i][];
if (check(xx, yy))
{
if (dfs(xx, yy, k - )) return true;
vis[xx][yy] = ;
}
}
return false;
}
int main()
{
while (scanf("%d %d", &n, &m), n || m)
{
mm(vis, );
for (int i = ; i < n; ++i)
scanf("%s", a[i]);
sum = ;
for (int i = ; i < n; ++i)
{
for (int j = ; j < m; ++j)
{
if (a[i][j] == '.')
sum++;
}
}
if (dfs(, , sum)) printf("YES\n");
else printf("NO\n");
} //system("pause");
return ;
}
天使的朋友营救天使,经过一个点用花费1时间,打败guard需要花费1(可打败所有guard),问最后营救天使最少需要花费多少时间。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int MAXN = 2e5 + ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
int n, m, sum;
char a[][];
int vis[][];
int dir[][] = { ,,-,,,,,- };
bool check(int x, int y) {
if (x < || x >= n || y < || y >= m || vis[x][y] || a[x][y] == '#')
return false;
return true;
}
struct node {
int x, y, t;
bool friend operator <(node a, node b) {
return a.t > b.t;
}
};
priority_queue<node>q;
int bfs()
{
while (!q.empty())
{
node now = q.top();
q.pop();
//cout << now.x << " " << now.y <<" "<<now.t<< endl;
if (a[now.x][now.y] == 'a') return now.t; for (int i = ; i < ; ++i)
{
int xx = now.x + dir[i][];
int yy = now.y + dir[i][];
if (check(xx, yy))
{
vis[xx][yy] = ;
if (a[xx][yy] == 'x')
q.push(node{ xx,yy,now.t + });
else
q.push(node{ xx,yy,now.t + });
}
}
}
return -;
}
int main()
{
while (~scanf("%d %d", &n, &m))
{
mm(vis, );
while (!q.empty())
q.pop();
for (int i = ; i < n; ++i)
scanf("%s", a[i]);
sum = ;
for (int i = ; i < n; ++i)
{
for (int j = ; j < m; ++j)
{
if (a[i][j] == 'r')
{
q.push(node{ i,j, });
vis[i][j] = ;
}
}
}
int time = bfs();
if (time == -)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n", time);
} //system("pause");
return ;
}
F - Cake ZOJ - 3905
A和B去买蛋糕,一共买了n块蛋糕(n为偶数)。每块蛋糕对A和B的价值是不一样的。每次A从n块蛋糕里选择两块,然后B选择一块对于他来说,价值最大的值。求n/2轮以后,A获得的最大的价值为多少。
是一道dp题目。dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+cake[i].a)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int maxn = 2e5 + ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); }
const int N = ;
struct Cake
{
int a;
int b;
}cake[];
int dp[][];
bool cmp(Cake aa, Cake bb)
{
return aa.b > bb.b;
}
int main()
{
int T;
cin >> T;
while (T--)
{
memset(dp, , sizeof(dp));
int n;
cin >> n;
for (int i = ; i <= n; i++)
cin >> cake[i].a >> cake[i].b;
sort(cake + , cake + + n, cmp);
for (int i = ; i <= n; i++)
{
for (int j = ; j <= i / ; j++)
{
if (j > )
dp[i][j] = max(dp[i - ][j], dp[i - ][j - ] + cake[i].a);
else
dp[i][j] = dp[i - ][j];
}
}
cout << dp[n][n / ] << endl;
}
//system("pause");
return ;
}
G - Prime Query ZOJ - 3911
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mid(a,b) ((a+b)>>1)
#define LL int
#define maxn 110000
#define IN freopen("in.txt","r",stdin);
using namespace std; char is_prime[maxn*];
void sieve()
{
int m=(int)sqrt((maxn*)+0.5);
fill(is_prime,is_prime+(maxn*),);
is_prime[]=is_prime[]=;
for(int i=;i<=m;i++) if(is_prime[i])
for(int j=i*i;j<(maxn*);j+=i) is_prime[j]=;
} int n,q;
LL num[maxn];
struct Tree
{
int left,right;
LL sum;
LL val,lazy;
}tree[maxn<<]; /*递归建树*/
void build(int i,int left,int right)
{
tree[i].left=left;
tree[i].right=right;
tree[i].lazy=; if(left==right){
tree[i].val=num[left];
tree[i].sum=(is_prime[num[left]]? :);
return ;
} int mid=mid(left,right); build(i<<,left,mid);
build(i<<|,mid+,right); tree[i].sum=tree[i<<].sum+tree[i<<|].sum;
} /*区间修改,标记下传:每当访问到当前结点的子节点时,下传标记*/
void pushdown(int i)
{
if(tree[i].lazy){
int tmp = (is_prime[tree[i].lazy]? :);
tree[i<<].val=tree[i].lazy;
tree[i<<|].val=tree[i].lazy;
tree[i<<].lazy=tree[i].lazy;
tree[i<<|].lazy=tree[i].lazy;
tree[i<<].sum=(tree[i<<].right-tree[i<<].left+)*tmp;
tree[i<<|].sum=(tree[i<<|].right-tree[i<<|].left+)*tmp;
tree[i].lazy=; /*下传后清零*/
}
} /*区间修改,d为改变量*/
void update(int i,int left,int right,LL d)
{
if(tree[i].left==left&&tree[i].right==right)
{
int tmp = (is_prime[d]? :);
tree[i].sum=(right-left+)*tmp;
tree[i].val=d;
tree[i].lazy=d;
return ;
} pushdown(i); int mid=mid(tree[i].left,tree[i].right); if(right<=mid) update(i<<,left,right,d);
else if(left>mid) update(i<<|,left,right,d);
else
{
update(i<<,left,mid,d);
update(i<<|,mid+,right,d);
} tree[i].sum=tree[i<<].sum+tree[i<<|].sum;
} /*单点修改,d为改变量*/
void update(int i,int x,LL d)
{
if(tree[i].left==tree[i].right){
tree[i].val+=d;
tree[i].sum=(is_prime[tree[i].val]? :);
return;
} pushdown(i);
int mid=mid(tree[i].left,tree[i].right); if(x<=mid) update(i<<,x,d);
else update(i<<|,x,d); tree[i].sum=tree[i<<].sum+tree[i<<|].sum;
} /*区间结果查询*/
LL query(int i,int left,int right)
{
if(tree[i].left==left&&tree[i].right==right)
return tree[i].sum; pushdown(i); int mid=mid(tree[i].left,tree[i].right); if(right<=mid) return query(i<<,left,right);
else if(left>mid) return query(i<<|,left,right);
else return query(i<<,left,mid)+query(i<<|,mid+,right);
} int main(int argc, char const *argv[])
{
//IN; sieve();
int t;scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&q);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
build(,,n); while(q--)
{
char c;
while(c=getchar()){
if(c=='A'||c=='R'||c=='Q') break;
}
if(c=='A'){
int v,l;
scanf("%d %d",&v,&l);
update(,l,v);
}
if(c=='R'){
int a,l,r;
scanf("%d %d %d",&a,&l,&r);
update(,l,r,a);
}
if(c=='Q'){
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n", query(,l,r));
}
}
} return ;
}
小蚂蚁从立方体角上的一点爬到立方体对面的点,给你一条最长的一边n长度,另外两条边1<=a,b<=n,问所有最短长度L^2的合(答案对1e9+7取模)。
公式:
L^2=(n*n)*(n*(n+1))/2+(n*n)*(n+1)*(n+1)/2+n*(n+1)*(2*n+1)*(n+2)/6;
(具体看代码)
因为n的范围在1~10^14,所以计算取模的时候一定要小心。还有在/6的时候需要进行特判。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int maxn = 2e5 + ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007 int main()
{
int t;
ll n;
cin >> t;
while (t--)
{
scanf("%lld", &n);
n %= mod;
ll ans = (n*(n + ) / ) % mod*((n * n) % mod);
ans = (ans + (((n*(n + ) / ) % mod)*((n*(n + ) / ) % mod)) % mod) % mod;
if (n % == ||(n+)%==) {
ans = (ans + (((n*(n + ) / ) % mod)*((( * n + )*(n + )) % mod))) % mod;
}
else {
ans = (ans + (((n*(n + ) / ) % mod)*((( * n + )*(n + )/) % mod))) % mod;
}
//ans = (ans + (((n*(n + 1) / 2) % mod)*(((2 * n + 1)*(n + 2)) % mod) / 3)) % mod;
//
// ll ans = ((((n * n) % mod )*n % mod) *(n + 1)) % mod / 2;
//ans = (ans + ((((n * n % mod) *(n + 1) % mod)*(n + 1) % mod)%mod )/ 4) % mod;
//ans = (ans + (((n * (n + 1) % mod)*((2 * n + 1) % mod ) % mod)%mod*(n + 2) % mod) / 6) % mod;
cout << ans << endl;
}
//system("pause");
return ;
}
K - Asteroids POJ - 3041
一个n*n的二维坐标上,有k个星星,给你星星的位置(x,y都为整数),可以一整排一整列消灭星星,问最少需要几步。
思路:https://blog.csdn.net/u013480600/article/details/38615197
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int maxn = ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); } struct Max_Match
{
int n;
bool g[maxn][maxn];
bool vis[maxn*];
int left[maxn*];
void init(int n)
{
this->n = n;
memset(g, , sizeof(g));
memset(left, -, sizeof(left));
} bool match(int u)
{
for (int v = ; v <= n; v++)
{
if (g[u][v] && !vis[v])
{
vis[v] = true;
if (left[v] == - || match(left[v]))
{
left[v] = u;
return true;
}
}
}
return false;
} int solve()
{
int ans = ;
for (int i = ; i <= n; i++)
{
memset(vis, , sizeof(vis));
if (match(i))
ans++;
}
return ans;
} }MM; int main()
{
int n, k;
scanf("%d %d", &n, &k);
MM.init(n);
while (k--)
{
int u, v;
scanf("%d %d", &u, &v);
MM.g[u][v] = true;
}
printf("%d\n", MM.solve());
return ;
}
HZNU Training 1 for Zhejiang Provincial Collegiate Programming Contest的更多相关文章
- HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019
今日这场比赛我们准备的题比较全面,二分+数论+最短路+计算几何+dp+思维+签到题等.有较难的防AK题,也有简单的签到题.为大家准备了一份题解和AC代码. A - Meeting with Alien ...
- HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019
赛后总结: T:今天下午参加了答辩比赛,没有给予队友很大的帮助.远程做题的时候发现队友在H上遇到了挫折,然后我就和她们说我看H吧,她们就开始做了另外两道题.今天一人一道题.最后我们在研究一道dp的时候 ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5503 The 12th Zhejiang Provincial ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5494 The 12th Zhejiang Provincial ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Beauty of Array
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5496 The 12th Zhejiang Provincial ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Lunch Time
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5499 The 12th Zhejiang Provincial ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Convert QWERTY to Dvorak
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5502 The 12th Zhejiang Provincial ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest May Day Holiday
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5500 The 12th Zhejiang Provincial ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Demacia of the Ancients
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5504 The 12th Zhejiang Provincial ...
随机推荐
- spring boot中的声明式事务管理及编程式事务管理
这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...
- File signature analysis fails to recognize .old file
My friend May she found a strange file called "bkp.old" as below in the evidence files. Sh ...
- MyBatis 核心配置综述之StatementHandler
目录 MyBatis 核心配置综述之StatementHandler MyBatis 四大组件之StatementHandler StatementHandler 的基本构成 StatementHan ...
- 夯实Java基础(五)——==与equals()
1.前言 我们在学习Java的时候,看到==.equals()就认为比较简单,随便看了一眼就过了,其实你并没有深入去了解二者的区别.这个问题在面试的时候出现的频率比较高,而且据统计有85%的人理直气壮 ...
- SpringBoot第一天
一,SpringBoot 介绍 1,如果使用 Spring 开发一个"HelloWorld"的 web 应用: • 创建一个 web 项目并且导入相关 jar 包.SpringMV ...
- SpringBoot:如何优雅地处理全局异常?
之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...
- 阿里架构师浅析Java设计模式之虚拟代理模式
虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动 ...
- pythonday04数据类型(二)
今日内容: 1.列表 2.元组 3.py2与py3的区别 4解释器/编译器 5.练习题 1.列表 想要表示多个”事物“,可以使用列表 users = ["李邵奇","奇航 ...
- Linux(CentOS7)下RabbitMQ下载安装教程
原文链接:http://www.studyshare.cn/software/details/1172/0 一.下载安装步骤 下载erlang 1.wget 下载地址 2.rpm -Uvh erlan ...
- thinkPhP 引入Smarty模板引擎及配置
做配置: TMPL_ENGINE_TYPE = “Smarty” 给smarty做配置: TMPL_ENGINE_CONFIG = array( 左标记, 右标记, )