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 ...
随机推荐
- 【WPF】大量Canvas转换为本地图片遇到的问题
原文地址:https://www.cnblogs.com/younShieh 项目中遇到一个难题,需要将上百个没有显示出来的Canvas存储为图片保存在本地. 查阅资料后(百度一下)后得知保存为本 ...
- 深入理解JVM-java字节码文件结构剖析(1)
public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { ...
- python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3
异常捕获 异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 影响:整个程序无法再正常运行 异常的结构 异常的类型 NameError 异常的信息 ...
- 邻域保持嵌入(NPE)
传统的线性降维方法,如主成分分析(PCA).因子分析(FA)等,关注的是样本的方差,能学习线性流形的结构,却无法学习非线性流形.而经典的流形学习方法虽然能够学习非线性流形结构,但由于本身属于直推学习, ...
- 算法与数据结构基础 - 二叉查找树(Binary Search Tree)
二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...
- Android实现多语言so easy
微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521声明:本文由CodingAndroid原创,未经授权,不可随意转载! 最近,我们公 ...
- #348 大陆争霸(DIjkstra)
在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉 ...
- 关于阿里云Mysql分页查询不走索引的问题
需要修改阿里云中的MYSQL 配置参数 : eq_range_index_dive_limit 阿里云上默认是 10 , 这个参数 表示 in 查询 条件超过 10 个 就不走索引,走全表扫描.如果我 ...
- 使用Cmake编译CEF时遇到Error in configuration process,project file may be invalid的解决办法
今天在用Cmake编译cef框架时,弹出了错误,如图: 可以排查一下几种原因: 1.在64位计算机编译32位程序 可以更换编译环境,或者下载64位版本来解决这个问题. 2.选择的Visual Stud ...
- HTTP2.0的多路复用和HTTP1.X中的长连接复用区别
HTTP/2 多路复用 (Multiplexing) 多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息 HTTP1.1 在HTTP/1.1协议中,浏览器客户端在同一时间,针 ...