赛后总结:

  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,然后就得出了分类讨论。

我一直都是个打酱油的~~

题解:

A.Pocket Cube HDU - 4801

 给你一块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 ;
}

C.Seeding  ZOJ - 2100

农民开始播种。在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 ;
}

D:D - Rescue  ZOJ - 1649

天使的朋友营救天使,经过一个点用花费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 ;
}

H:Ant  ZOJ - 3903

小蚂蚁从立方体角上的一点爬到立方体对面的点,给你一条最长的一边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的更多相关文章

  1. HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019

    今日这场比赛我们准备的题比较全面,二分+数论+最短路+计算几何+dp+思维+签到题等.有较难的防AK题,也有简单的签到题.为大家准备了一份题解和AC代码. A - Meeting with Alien ...

  2. HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019

    赛后总结: T:今天下午参加了答辩比赛,没有给予队友很大的帮助.远程做题的时候发现队友在H上遇到了挫折,然后我就和她们说我看H吧,她们就开始做了另外两道题.今天一人一道题.最后我们在研究一道dp的时候 ...

  3. 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 ...

  4. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5494 The 12th Zhejiang Provincial ...

  5. 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 ...

  6. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Lunch Time

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5499 The 12th Zhejiang Provincial ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. lvs+keepalived 高可用及负载均衡

    一.环境准备 VIP:10.18.43.30 dr1:10.18.43.10 dr2:10.18.43.20 web1:10.18.43.13 web2:10.18.43.14 结构图 (一).预处理 ...

  2. LeetCode 85. 冗余连接 II

    题目: 在本问题中,有根树指满足以下条件的有向图.该树只有一个根节点,所有其他节点都是该根节点的后继.每一个节点只有一个父节点,除了根节点没有父节点. 输入一个有向图,该图由一个有着N个节点 (节点值 ...

  3. Vsftp服务器配置文件详解

    vsftp软件是我们常见的FTP服务器搭建软件,所有的配置都是基于vsftpd.conf这个配置文件的.vsftpd.conf里面主要包括安全配置,传输,用户还有权限等相关的选项.现在我们讲解下关于V ...

  4. Java——字符串

    1.不可变的String String对象是不可变的.String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改修改后的字符串内容. public ...

  5. Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)

    Zookeeper是开源的,如果想多了解Zookeeper或看它的源码,最好是能找到它的源码并在 IDE 里启动,可以debug看它咋执行的,能够帮助你理解其原理. 准备源码 所以我们很容易搞到它的源 ...

  6. 洛谷 P1177 【模板】快速排序

    这道题用传统快排(如下所示)的结果就是最后三个点TLE: void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } void ...

  7. 阿里注册中心Nacos生产部署方案

    一.说明 生产环境中部署nacos首先肯定是使用集群模式cluster保证高可用,本文主要详细介绍最佳的集群方案怎样搭建与spring cloud程序怎样集成   二.集群方案 下图是官方推荐的集群方 ...

  8. Zabbix数据库空间大小使用计算

    一.Zabbix的数据存储主要分类 1.历史数据 2.趋势数据 3.事件数据 二.每秒处理的数据量 顾名思义,例如,有3000个监控项(item),每60秒取一次值,即平均每秒有50(3000/60) ...

  9. 项目启动会(project initiating meeting)与项目开工会(kick-off meeting)区别

    一.项目启动会initiating meeting 召开时间:是启动阶段结束时召开的会议:主要任务:发布项目章程,并任命项目经理,赋予项目经理动用组织资源的权力:注意事项:(1)会议召开前已经对干系人 ...

  10. 曹工杂谈:一例简单的Jar包冲突解决示例

    Jar包冲突的相关文章: 了不得,我可能发现了Jar 包冲突的秘密   一.前言 jar包冲突分多种,简单理解来说,就是同package且同名的类在多个jar包内出现,如果两个jar包在同一个clas ...