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$的数不改变相对顺序的前提 ...
随机推荐
- 创建一个实例&创建一个线程。。
using System; using System.Threading; namespace WorkerThread02 { class ThreadTest { bool done; stati ...
- 在linux下使用CMake构建应用程序
本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法. CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来.文中通过一些例 ...
- char a[] = "hello world1"和char *p = "hello world2";的区别(转)
转自:jianchi88 http://blog.csdn.net/jianchi88/article/details/6876405 #include<stdio.h> int main ...
- 4619 Warm up 2
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ][]; ...
- MicroRNA 详解
MicroRNA研究历史和方法 Views 88 1Report
- mysql - 索引的一些理解
推荐下这篇文章 http://blog.codinglabs.org/articles/theory-of-mysql-index.html 写的十分的不错.留着以后慢慢看,慢慢的理解.
- sqlplus 简单的几个查询语句
sqlplus 是用来和oracle进行交互的工具,可以在电脑端使用,也可以在服务器使用 常用命令 show 显示SQL Plus中的信息 connect 先无条件断 ...
- javascript事件坐标
clientX 鼠标在页面显示区域的坐标 screenX鼠标在显示屏幕上的坐标 layerX 鼠标相对于“触发事件的元素的层级关系中离该元素最近的,设置了position的父元素”的边界的位置,从bo ...
- 团体程序设计天梯赛L1-027 出租 2017-03-23 23:16 40人阅读 评论(0) 收藏
L1-027. 出租 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声, ...
- scalaWindows和Linux搭建
Windows搭建 https://www.cnblogs.com/freeweb/p/5623372.html Linux搭建 https://www.cnblogs.com/freeweb/p/5 ...