7.15模拟赛

T1.fuction

吐槽一波错误拼写

跟考场思路差不多,只不过细节挺多的呢。

判掉a=0,b=0,c=0的几种组合,还有负数的情况要打标记特殊处理。

然后就是一个拓欧啦,先求出g=gcd(a,b),顺便求出ax+by=g的x和y,然后根据裴蜀定理(或者是直觉),我们知道ax+by可以以g为长度遍历数轴,要是c%g!=0,那就无解了。

然后是可以整除的情况,就把x和y乘以d=c/g,这样就求出了ax+by=c的一组x和y了,定x为较小的数,把x补到正,同时y跟着减,要是x刚好到正,y已经负了,那就是无解。

还有,此时如果a和b是一正一负的,是无穷多解的,因为可以正负系数同时不断扩大。

然后剩下的情况,就是x和y都是正整数啦,此时为了满足ax+by=c,考虑有多少种等价情况,也就是x加上一个sa*x,y就得减去一个sb*y,显然sa=lcm(a,b)/a=b/g,同理sb=a/g

因为x是增大的,y是减小的,我们只需要判断y能减多少个sb就可以啦。

 

#include<iostream>
#include<cstdio>
#define NON puts("0"),0
#define INF puts("ZenMeZheMeDuo"),0
using namespace std;const int MAX=65535;inline int rd(){int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}typedef long long ll;ll exgcd(ll A,ll B,ll &x,ll &y){if(!B) return x=1,y=0,A;ll ret=exgcd(B,A%B,y,x);y-=A/B*x;return ret;
}ll T,a,b,c;int solve(){a=rd();b=rd();c=rd();bool fa=0,fb=0;if(a<=0&&b<=0) a=-a,b=-b,c=-c;if(!a)if(c%b==0&&c/b>0) return INF;else return NON;if(!b)if(c%a==0&&c/a>0)return INF;else return NON;if(a==0&&b==0)return c?NON:INF;if(a==1&&b==1)return c>MAX-1?INF:printf("%lld\n",c-1);if(a<0) fa=1,a=-a;if(b<0) fb=1,b=-b;if(a+b==c)return puts("1"),0;ll x,y;ll g=exgcd(a,b,x,y);if(c%g) return NON;ll d=c/g;x*=d;y*=d;if(fa) a=-a,x=-x;if(fb) b=-b,y=-y;ll sa=b/g,sb=a/g;if(a*b<0) return INF;ll t=x/sa-1;if(x%sa==0) t--;x-=t*sa;y+=t*sb;if(x>sa) x-=sa,y+=sb;if(y<=0) return NON;ll ans=y/sb+(y%sb!=0);if(ans>MAX) return INF;printf("%lld\n",ans);return 0;
}int main(){T=rd();while(T--) solve();return 0;
}
View Code

 

 

T2.coloration

树形DP,提供了一种好的思路。

涉及考虑树上点对的题,与其O(n^2)地考虑任意两点的关系,不如考虑每条边的贡献

本题中,对于一条边e,它的边权为w,其贡献为 (左侧黑点*右侧黑点+左侧白点*右侧白点)*w

设f[i][j]为以i为根的子树中选取j个黑点的最大贡献,转移时逐个合并子树,用一个g数组先跑一次背包,再添加进f状态。

复杂度O(n^2),卡好边界。

注意int到long long要乘一个1ll

#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;const int MAXN=2048;inline int rd() {int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}struct Edge {int next,to,w;
} e[MAXN<<1];
int ecnt,head[MAXN];
inline void add(int x,int y,int w) {e[++ecnt].to = y;e[ecnt].next = head[x];e[ecnt].w = w;head[x] = ecnt;
}int n,m;
long long f[MAXN][MAXN],g[MAXN];
int siz[MAXN];
int dfs(int x,int pre) {siz[x]=1;for(int i=head[x]; i; i=e[i].next) {int v=e[i].to;if(v==pre) continue;memset(g,0,sizeof(g));dfs(v,x);for(int j=min(m,siz[x]); j>=0; j--)for(int k=min(m-j,siz[v]); k>=0; k--)g[j+k]=max(g[j+k],f[x][j]+f[v][k]+((k*(m-k)+(siz[v]-k)*(n-m-siz[v]+k))*1ll*e[i].w));for(int j=0; j<=m; j++)f[x][j]=g[j];siz[x]+=siz[v];}
}int main() {n=rd();m=rd();int x,y,w;for(int i=1; i<=n-1; i++) {x=rd();y=rd();w=rd();add(x,y,w);add(y,x,w);}dfs(1,0);cout<<f[1][m];
}
View Code

 T3.ray

神题,正解居然是模拟。

考场写了四类分类讨论,预期得分60,实际扣了一些?可能是写挂了一部分的原因。

考场想到了离散化存储,二分查找,但是突然觉得这样会多一个log,感觉最差情况的状态数是n^2的,非常不可做,就用一个二维数组直接存了。

事实上,是可以离散化存的,这样就有70分啦。(实际复杂度确实是O(nmlogn)

#include<algorithm>
#include<iostream>
#include<string>
#include<cstdio>
#include<vector>using namespace std;const int MAXN=100005;inline int rd(){int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}vector<int> V[MAXN];bool vis[MAXN];
inline bool vaild(int x,int y){return !binary_search(V[x].begin(),V[x].end(),y);}
inline void add(int x,int y){vis[x]=1;V[x].push_back(y);} int n,m,lim,stx,sty,stdir;const int dx[5]={0,-1,-1,1,1};
const int dy[5]={0,1,-1,1,-1};int main(){n=rd();m=rd();lim=rd();int x,y;for(int i=1;i<=lim;i++){x=rd();y=rd();add(x,y);}for(int i=0;i<=n+1;i++){add(i,0);add(i,m+1);}for(int i=0;i<=m+1;i++){add(0,i);add(n+1,i);}stx=rd();sty=rd();string s;cin>>s;if(s=="NE") stdir=1;if(s=="NW") stdir=2;if(s=="SE") stdir=3;if(s=="SW") stdir=4;for(int i=1;i<=100000;i++) if(vis[i]) sort(V[i].begin(),V[i].end());//nlogn is better :)int cur,nx,ny,t1,t2;long long cnt=0;x=stx;y=sty;cur=stdir;bool db=0;while(cnt==0||x!=stx||y!=sty||cur!=stdir){nx=x+dx[cur];ny=y+dy[cur];cnt++;if(vaild(nx,ny)){x=nx;y=ny;continue;}switch(cur){case 1:{t1=vaild(nx,ny-1);t2=vaild(nx+1,ny);if(!(t1^t2)){db=1;cur=4;continue;}if(!t1){y++;cur=3;continue;}if(!t2){x--;cur=2;continue;}break;}case 2:{t1=vaild(nx+1,ny);t2=vaild(nx,ny+1);if(!(t1^t2)){db=1;cur=3;continue;}if(!t1){x--;cur=1;continue;}if(!t2){y--;cur=4;continue;}break;}case 3:{t1=vaild(nx,ny-1);t2=vaild(nx-1,ny);if(!(t1^t2)){db=1;cur=2;continue;}if(!t1){y++;cur=1;continue;}if(!t2){x++;cur=4;continue;}break;}case 4:{t1=vaild(nx-1,ny);t2=vaild(nx,ny+1);if(!(t1^t2)){db=1;cur=1;continue;}if(!t1){x++;cur=3;continue;}if(!t2){y--;cur=2;continue;}break;}}}if(db) cnt>>=1;cout<<cnt<<endl;return 0;
}
70pts

正解是这样的,我们不去考虑每一步怎么走,而是考虑沿着这个方向可以到达哪里(哪个反射点)。

反射点的位置是可以计算的,可以证明,反射的次数是O(n+m+k)级别的,再加上关于k个限制的二分,总复杂度在O((n+m+k)logk),可以接受!

对于先后经过的两个反射点u,v,它们一定处于一个正方形对角线上,所以其距离就是切比雪夫距离

所以,现在就要快速地找到某条对角线上下次出现的点了,怎么做呢?

对于左上到右下对角线上的点(x,y),x-y是一个定值,与在第几条有关。

同理,对于右上到左下的,x+y是一个定值,可以唯一代表第几条对角线。

因此,我们重新将坐标分别写为(x+y,x),(x-y,x),这即保留了原始的坐标信息(可以O(1)算出),还可以通过把第一维作为第一关键字,使得排序后一条对角线在一个连续区间,第二维递增。

这样就可以迅速二分出下一个障碍物啦,很快地就可以算出了。

顺便学到了切比雪夫距离(好像有人讲过诶,忘记了..),可以方便地把坐标系旋转45°并放缩sqrt(2)倍。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;inline int rd() {int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}// "CBSV" == "Chebyshev" :)
struct CBSV {int fi,se;CBSV(int X,int Y) {fi=X;se=Y;}bool operator<(const CBSV &rhs) const {return rhs.fi==fi?se<rhs.se:fi<rhs.fi;}
};int n,m,lim;
long long ans;
int sx,sy,sdx,sdy;
int cur,dir,dx,dy,db=0;vector<CBSV> V[2];
vector<CBSV>::iterator it;inline void add(int x,int y) {V[0].push_back(CBSV(x-y,x));V[1].push_back(CBSV(x+y,x));
}void work(int &x,int &y) {dir=(dx!=dy);CBSV now=dir?CBSV(x+y,x):CBSV(x-y,x);it=upper_bound(V[dir].begin(),V[dir].end(),now);while(it->fi!=now.fi) it--;if(dx<0) while(it->se>=x) it--;ans+=abs(x-it->se)-1;x=it->se;y=dir?it->fi-x:x-it->fi;int u=binary_search(V[0].begin(),V[0].end(),CBSV(x-y-dx,x-dx));int v=binary_search(V[0].begin(),V[0].end(),CBSV(x-y+dy,x));if(u==v )db=1,dx*=-1,dy*=-1;else if(u) x-=dx,dy*=-1;else if(v) y-=dy,dx*=-1;
}int main() {n=rd();m=rd();lim=rd();int x,y;for(int i=1; i<=lim; i++) {x=rd();y=rd();add(x,y);}for(int i=0; i<=n+1; i++) add(i,0),add(i,m+1);for(int i=0; i<=m+1; i++) add(0,i),add(n+1,i);sort(V[0].begin(),V[0].end());sort(V[1].begin(),V[1].end());char s[50];x=rd();y=rd();scanf("%s",s);dx=s[0]=='N'?-1:1;dy=s[1]=='W'?-1:1;work(x,y);ans=0;sx=x;sy=y;sdx=dx;sdy=dy;do work(x,y);while(!(x==sx&&y==sy&&dx==sdx&&dy==sdy));printf("%lld",db?(ans>>1):ans);
}
View Code

 

转载于:https://www.cnblogs.com/ghostcai/p/9314178.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苏宁国美盈利报警:线下乏力线上重金加码

摘要&#xff1a;国美电器则发布盈利预警&#xff0c;预计今年一季度净利润同比大幅减少———这也致使国美股价最近连续低位徘徊。苏宁电器一季报显示&#xff0c;今年1至3月公司营业收入226 .41亿元&#xff0c;同比增长10%&#xff0c;但盈利9.51亿元&#xff0c;同比下降15…

静态变量的多线程同步问题

2019独角兽企业重金招聘Python工程师标准>>> 我们先来讨论一个问题&#xff0c;一个类的静态变量当类被多次实例化的时候&#xff0c;静态变量是否会受影响&#xff1f;首先我们应该清楚的是静态变量是在类被JVM classloader的时候分配内存&#xff0c;并且是分配在…

Hive 行列转换

在京东众多业务中&#xff0c;促销业务充满了复杂性和挑战性&#xff0c;因为业务的灵活性&#xff0c;很多数据都存储成xml和json格式数据&#xff0c;这就要求下游数据分析师们需要对其做解析后方可使用 。 在众多操作中 &#xff0c;有一种是需要对数据做行列转换操作。 数据…

Java WebService 简单实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言&#xff1a;朋友们开始以下教程前&#xff0c;请先看第五大点的注意事项&#xff0c;以避免不必要的重复操作。 一、准备工作&…

关于JavaScript的数组随机排序

昨天了解了一下Fisher–Yates shuffle费雪耶兹随机置乱算法&#xff0c;现在再来看看下面这个曾经网上常见的一个写法&#xff1a; function shuffle(arr) { arr.sort(function () { return Math.random() - 0.5; }); } 或者使用更简洁的 ES6 的写法&#xff1a; function shu…

通用唯一识别码UUID

UUID是通用唯一识别码&#xff08;Universally Unique Identifier&#xff09;的缩写。UUID 的目的&#xff0c;是让分布式系统中的所有元素&#xff0c;都能有唯一的辨识资讯&#xff0c;而不需要透过中央控制端来做辨识资讯的指定。如此一来&#xff0c;每个人都可以建立不与…

java内省机制 + 内省是什么 + 内省实现方式 + 和反射的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、内省是什么、实现方式&#xff1a; 内省&#xff08;Introspector&#xff09;是Java语言对Bean类属性、事件的一种缺省处理方法。…

百度联合长虹发布第二款云手机 售价900元以下

摘要&#xff1a;【搜狐IT消息】5月15日消息&#xff0c;百度今天宣布联合长虹发布第二款智能手机&#xff0c;采用3.5英寸屏幕、300万像素摄像头&#xff0c;650MHz主频处理器&#xff0c;零售价格在700-899元之间&#xff0c;中国联通将为其提供话费补贴。 【搜狐IT消息】5月…

博客园中的源代码格式显示

昨天写了一篇文章&#xff0c;但是在写的时候呢&#xff0c;没有注意&#xff0c;直接将代码复制上去了&#xff0c;今天正好有人提醒&#xff0c;看到了格式的混乱&#xff0c;借此记录整理一下&#xff0c;如何能直接粘贴代码&#xff0c;而且格式&#xff08;缩进&#xff0…

Laravel5.5之事件监听、任务调度、队列

一、事件监听 流程&#xff1a; 1.1 创建event php artisan make:event UserLogin LoginController.php /*** The user has been authenticated.** param \Illuminate\Http\Request $request* param mixed $user* return mixed*/protected function authenticated(Request …

朱江洪功成身退 朱董配解体谁主格力(图)

摘要&#xff1a;中国家电营销委员会副理事长洪仕斌向时代周报记者表示&#xff1a;“朱江洪和董明珠已经完成了他们在格力发展前二十年的使命。“朱董配”解体之后&#xff0c;有人质疑格力“技术营销”的格局必将被打破&#xff0c;难以延续&#xff0c;“董氏班底”与朱江洪…

传腾讯人事大地震 马化腾将重整公司架构

摘要&#xff1a;5月17日消息&#xff0c;传腾讯董事长马化腾将重新组织公司架构&#xff0c;为腾讯大换血。据悉&#xff0c;腾讯之所以选择互动娱乐部门负责人接任这一重要岗位&#xff0c;也是因为互娱部门业绩持续快速发展&#xff0c;成为了“腾讯帝国”发展的核心驱动力之…

Thread.yield()

&#xff08;一&#xff09;java yield()方法注释&#xff1a; /*** A hint to the scheduler that the current thread is willing to yield* its current use of a processor. The scheduler is free to ignore this* hint.** <p> Yield is a heuristic attempt to im…

WSDL 详解

转载自&#xff1a;http://kalogen.javaeye.com/blog/418958 WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application&#xff0c;他将Web服务描述定义为一组服务访问点&#xff0c;客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服…

传苹果新iPhone显示屏4英寸 可视面积扩大30%

摘要&#xff1a;北京时间5月17日凌晨消息&#xff0c;据熟知内情的消息人士周三称&#xff0c;苹果计划为其下一代iPhone使用更大的显示屏&#xff0c;并已开始从韩国和日本供应商那里订购新的显示屏。业绩人士指出&#xff0c;苹果为下一代iPhone配备更大显示屏的决定意味着&…

通过IDE生成和手动call调用webservice

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 通过IDE自动生成的代码调用webservice服务 我们的IDE一般来说都是能够通过各种各样的工具来支持我们的开发使我们的开发变得更加的便捷。…

JAVA使用FTPClient类读写FTP

见&#xff1a;http://blog.csdn.net/kardelpeng/article/details/6588284 1.首先先导入相关jar包 2.创建一个连接FTP的工具类FTPUtil.Java [java] view plaincopy package com.metarnet.ftp.util; import java.io.IOException; import java.io.InputStream; import j…

Java IO类库之ObjectInputStream和ObjectOutPutStream

2019独角兽企业重金招聘Python工程师标准>>> 一、ObjectOutputStream 1 - ObjectOuputStream介绍 ObjectOutputStream(对象字节输出流)&#xff0c;用于将一个序列化对象写入到创建ObjectOutputStream时传入的底层字节输入流中&#xff0c;通过源码可知该类继承Outp…

什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?

如果你不知道什么是覆盖索引&#xff0c;那么SQL性能优化便无从谈起&#xff01; 什么是覆盖索引?如何利用索引进行SQL语句优化&#xff1f; 表结构 150多万的数据&#xff0c;这么一个简单的语句&#xff1a; 慢查询日志里居然很多用了1秒的&#xff0c;Explain的结果是&am…

ARM的商业模式是如何炼成的?

导读&#xff1a;保守、严谨&#xff0c;又有一些皇族气质&#xff0c;作为一家拥有纯正英国血统的公司&#xff0c;ARM看似呆板的作风却让其在移动互联网大潮中势如破竹&#xff0c;没有对手。也许过于看重产业链伙伴的声音&#xff0c;导致ARM的决策有些迟缓&#xff0c;比如…