2019 CCPC-Wannafly Winter Camp Day4(Div2, onsite)
slove 6/11
Code:zz
Thinking:zz
贪心即可。这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两种情况,选择距离短的即可,就这样一直往前贪心。
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#include<stack>
#include<bitset>
#include<unordered_map>
const int maxn = 0x3f3f3f3f;
const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427;
const double PI = 3.141592653589793238462643383279;
using namespace std;
struct s
{
long long x1,y1,x2,y2;
}z[];
inline long long dis(long long x1,long long y1, long long x2,long long y2)
{
long long z1 = x1 - x2;
long long z2 = y1 - y2;
if(z1 < )
{
z1 = -z1;
}
if(z2 < )
{
z2= -z2;
}
return z1 + z2;
}
int main(void)
{
//ios::sync_with_stdio(false);
int n,m,i;
long long ans;
while(~scanf("%d %d",&n,&m))
{
for(i = ;i <= n;i++)
{
scanf("%lld %lld %lld %lld",&z[i].x1,&z[i].y1,&z[i].x2,&z[i].y2);
}
//printf("1111\n");
ans = ;
ans += dis(z[n].x1,z[n].y1,z[n].x2,z[n].y2);
//printf("2222 %lld\n",ans);
for(i = n - ;i >= ;i--)
{
ans += min(dis(z[i].x1,z[i].y1,z[i + ].x1,z[i + ].y1) + dis(z[i].x2,z[i].y2,z[i + ].x2,z[i + ].y2)
,dis(z[i].x1,z[i].y1,z[i + ].x2,z[i + ].y2) + dis(z[i].x2,z[i].y2,z[i + ].x1,z[i + ].y1));
/*printf("%d %lld\n",i,min(dis(z[i].x1,z[i].y1,z[i + 1].x1,z[i + 1].y1) + dis(z[i].x2,z[i].y2,z[i + 1].x2,z[i + 1].y2)
,dis(z[i].x1,z[i].y1,z[i + 1].x2,z[i + 1].y2) + dis(z[i].x2,z[i].y2,z[i + 1].x1,z[i + 1].y1)));*/
}
printf("%lld\n",ans);
}
return ;
}
Code:kk
Thinking:kk zz
用树形dp找每个联通块 树的直径,树的直径大于等于4的就肯定不行,有孤立的点也不行,就这样。
然而别人都是用结论做的,每条边连上去后,边两边的点只能有一个入度大于1.
我就是个弟弟。
#include<bits/stdc++.h>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
const int inf=0x3f3f3f3f;
int fa[maxn],n,m;
bool vis[maxn];
int head[maxn],tot;
struct edge{
int to,Next;
}a[maxn<<];
void init() {
CLR(vis,);
CLR(head,-),tot=;
}
void addv(int u,int v){
a[++tot].to=v;
a[tot].Next=head[u];
head[u]=tot;
}
int u,v,maxx;
int dfs(int u,int deep,int fa)
{
// printf("u:%d\n",u);
int fmax=,smax=;
vis[fa]=;
for(int i=head[u];i!=-;i=a[i].Next)
{
int v=a[i].to;
if(v==fa)continue;
if(vis[v]==)
{
maxx=inf;
return inf;
}
vis[v]=;
int tep=dfs(v,deep+,u);
if(fmax==)fmax=max(fmax,tep);
else if(smax==){
smax=tep;
if(fmax<smax)swap(fmax,smax);
}
else if(tep>fmax){
smax=fmax,fmax=tep;
}else if(tep>smax){
smax=tep;
}
}
// printf("u:%d\n",u);
// printf("maxx:%d\n",maxx);
// printf("fmax:%d smax:%d\n",fmax,smax);
maxx=max(maxx,max(fmax+smax,fmax+deep));
if(maxx>=inf)return inf; return fmax+;
}
int main() {
while(cin>>n>>m) {
init();
while(m--) {
scanf("%d%d",&u,&v);
addv(u,v),addv(v,u);
}
for(int i=;i<=n;i++)
{
if(vis[i]==)
{
dfs(i,,-);
}
if(maxx>=)
{
break;
}
}
for(int i=;i<=n;i++)
{
if(vis[i]==){
puts("No\n");
return ;
}
}
if(maxx>=){
printf("No\n");
}else{
puts("Yes");
}
}
}
题解待补。
Code:zz
Thinking:zz
马是走日字的,因此走一步后,他所在的格子的颜色和上一格肯定是不一样的,因此,如果他的起点颜色和终点颜色是一样的,那么肯定是No;如果颜色是一样的,那么只要起点和终点是互相可达的,那么是Yes,反之是No。除了3*3的棋盘和2*n的棋盘需要判断是否可达外,其他都能可达。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#include<stack>
#include<bitset>
#include<unordered_map>
const int maxn = 0x3f3f3f3f;
const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427;
const double PI = 3.141592653589793238462643383279;
using namespace std;
int main(void)
{
//ios::sync_with_stdio(false);
int n,m,s1,s2,e1,e2;
while(~scanf("%d %d",&n,&m))
{
scanf("%d %d %d %d",&s1,&s2,&e1,&e2);
if(n > m)
{
int r = n;
n = m;
m = r;
}
if(n == && m == )
{
if(s1 == && s2 == || e1 == && e2 == )
{
printf("No\n");
}
else if((s1 + s2) % == (e1 + e2) % )
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
else if(n == )
{
if(s1 > || e1 > )
{
int r = e1;
e1 = e2;
e2 = r; r = s1;
s1 = s2;
s2 = r;
}
if(e1 == s1)
{
printf("No\n");
}
else
{
if((abs(e2 - s2) - ) % == )
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
else
{
if((s1 + s2) % == (e1 + e2) % )
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
}
return ;
}
Code:pai爷
Thinking:pai爷
dp,注意到上凸和下凸的答案是一样的,从下到大枚举插入的数用组合数搞一下方案
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int p=1e9+;
ll dp[],sum[],fac[],inv[];
ll qpow(ll a,ll b)
{
ll ret=;a%=p;
while(b)
{
if(b&) ret=ret*a%p;
b/=;a=a*a%p;
}
return ret;
}
ll C(ll n,ll m)
{
if(m>n) return ;
return 1ll * fac[n] * inv[m] % p * inv[n - m] % p;
} int main()
{
fac[]=;inv[]=;
for(int i=;i<=;i++)
{
fac[i]=1ll*fac[i-]*i%p;
inv[i]=qpow(fac[i],p-);
}
int n;
scanf("%d",&n);
dp[]=dp[]=;
sum[]=;
for(int i=;i<=n;i++)
{
sum[i]=;
for(int j=;j<=i;j++)
{
sum[i]=(sum[i]+dp[j-]*dp[i-j]%p*C(i-,j-)%p) %p;
}
dp[i]=sum[i]*qpow(,p-)%p;
}
printf("%lld\n",dp[n]);
return ;
}
Code:pai爷
Thinking:pai爷
一个裸的贪心,计算一下式子枚举保留了k个物品,之后sort一下。取前k个。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
struct node{
int c,id;
}sum[];
int a[],b[];
long long p,q,ans=;
int n;
bool cmp(node a,node b)
{
return a.c>b.c;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(int k=;k<=n;k++)
{
p=;q=;
for(int i=;i<=n;i++)
{
sum[i].c=a[i]-k*b[i];
sum[i].id=i;
}
sort(sum+,sum++n,cmp);
for(int i=;i<=k;i++)
{
p=p+a[sum[i].id];
}
for(int i=k+;i<=n;i++)
{
q=q+b[sum[i].id];
}
ans=max(ans,p+1ll*q*k);
}
printf("%lld\n",ans);
}
Code:kk zz
Thinking:kk
选取的两条链交点是x,所以就是选取和x有关的两条大链,而且查询次数非常少,所以就是求每个节点的四条子链的总和,如果子链为负数,则不取。
#include<bits/stdc++.h>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
const int inf=0x3f3f3f3f;
int n,m;
bool vis[maxn];
int head[maxn],tot;
struct edge{
int to,Next;
}a[maxn<<];
ll val[maxn];
ll pre[];
void init() {
CLR(vis,);
CLR(head,-),tot=;
pre[]=;
for(int i=;i<=;i++)
{
pre[i]=pre[i-]*;
}
}
void addv(int u,int v){
a[++tot].to=v;
a[tot].Next=head[u];
head[u]=tot;
}
int u,v;
ll son[maxn][];
ll dfs(int u,int fa)
{
for(int i=head[u];i!=-;i=a[i].Next)
{
int v=a[i].to;
if(v==fa)continue;
ll tep=dfs(v,u);
int flag = ;
for(int j=;j<;j++)
{
if(son[u][j]==){
son[u][j]=tep;
flag = ;
break;
}
}
sort(son[u],son[u]+);
if(son[u][]<tep && flag){
son[u][]=tep;
}
sort(son[u],son[u]+);
}
// printf("u:%d\n",u);
return max((ll),son[u][]+val[u]);
}
int main() {
while(cin>>n) {
init();
for(int i=;i<=n;i++)
{
scanf("%d",&u);
if(u>=)
{
val[i]=pre[u];
}else{
val[i]=-pre[-u];
}
} for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
addv(u,v),addv(v,u);
}
int q;
cin>>q;
while(q--)
{
memset(son,,sizeof(son));
scanf("%d",&u);
dfs(u,-);
ll ans=val[u];
for(int i=;i<;i++)
{
ans+=max((ll),son[u][i]);
//printf("%lld ",son[u][i]);
}
//printf("\n");
//printf("%lld\n",ans);
int op= (ans<);
if(ans < )
{
ans = -ans;
}
int cc[],cnt = ;
while(ans)
{
cc[cnt++] = ans %;
ans /= ;
}
if(op)
{
printf("-");
}
if(cnt == )
{
printf("");
}
for(int i = cnt - ;i >= ;i--)
{
printf("%d",cc[i]);
}
printf("\n");
} }
}
赛后总结:
kk:今天有蛮多图的题目的,但是读c题的题意没读懂,别人用简单结论一小时不到就做出的题目,我写了树形dp求树的直径两小时后才ac,k题也是个树形dp的题,套了上一题的代码,结果int忘记改成long long了,wawawawawa,贼菜,把队友的腿都给抱断了。
pai爷:今天状态很差,那道DP题一直在想DP[i][j]表示枚举到第i个位置填了j的方案数,但是无法满足排列,想了很久才写出来,之后那道欧拉回路的时间不多了,找规律的题还是缺少一个系统的操作,最后时刻还是没有写出来。
zz:今天很快写掉了两个签到题,然后帮队友看c题,看了很久没看出来,后来发现题读错了,然后又一起看了k,做法很快就出了,代码打出来以后要出了很多bug,wa了很多次,改了很久才过,写代码还是要仔细点,不然小bug改到死。
2019 CCPC-Wannafly Winter Camp Day4(Div2, onsite)的更多相关文章
- CCPC-Wannafly Winter Camp Day4 (Div2, onsite)
Replay Dup4: 两轮怎么退火啊? 简单树形dp都不会了,送了那么多罚时 简单题都不想清楚就乱写了,喵喵喵? X: 欧拉怎么回路啊, 不会啊. 还是有没有手误?未思考清楚或者未检查就提交, 导 ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)
solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...
- 2019 CCPC-Wannafly Winter Camp Day2(Div2, onsite)
solve 4/11 A Erase Numbers II Code:KK Thinking :KK 用ans表示当前最优答案,maxx表示遍历到的最大数字,一开始ans肯定等于a[ 1 ]+a[ 2 ...
- 2019 CCPC-Wannafly Winter Camp Day3(Div2, onsite)
solve 4/11 补题:5/11 A 二十四点* Code:pai爷 zz Thinking :pai爷 打表找规律,1张牌 10个不可能的 2张牌有 43 种不可能的 3张牌 有74 种不可能 ...
- 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)
solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)
题目链接 题意 对序列进行三种操作: 1.区间求和. 2.将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边. 3.将区间大于$x$的数不改变相对顺序的前提 ...
随机推荐
- PollingProvider方法的使用及示例
来自<sencha touch权威指南>第12章,374页开始 ----------------------------------------------------- PollingP ...
- linux的操作
对tomcat的操作 打开终端 cd /java/tomcat#执行bin/startup.sh #启动tomcatbin/shutdown.sh #停止tomcat tail -f logs/cat ...
- JavaScript语言精粹 笔记04 数组
数组1 数组字面量2 长度3 删除4 列举5 混淆的地方6 方法7 维度 数组1 数组字面量 var empty = []; var numbers = [ 'zero', 'one', 'two', ...
- Python之set集合与collections系列
1>set集合:是一个无序且不重复的元素集合:访问速度快,解决了重复的问题: s2 = set(["che","liu","haha" ...
- ModelMap
首先介绍ModelMap[Model]和ModelAndView的作用 Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类. ModelMapModelMa ...
- [LeetCode 题解]: Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- [LeetCode 题解]: String to Interger (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- HBase介绍 (1)---数据模型
http://blog.csdn.net/heyutao007/article/details/5766896 BigTable是什么?Google的Paper对其作了充分的说明.字面上看就是一张大表 ...
- leetcode 存在重复元素
给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: 输入: [1,2,3,1] 输出: true ...
- ZKEACMS 2.2.1 正式发布,更多特性等您来发现
前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...