8.11

T1 给定一个序列M,求出能过构造出的序列使得(Si+Si+1)/2=Mi成立的序列个数.保证M,S递增。

T2 平面点集中最大的四边形面积

T3 不太懂得一道国家队选拔的加强版。

90+20+10=120 三题暴力

T1写了一个非常不正确的O(n)结果拿了90,T2只想到了n^3的做法,T3暴力

Sol:

T1显然知道S中的一个数就可以知道所有的S,每个S都可以由S1和Mi来表示,那么由于S是递增的就可以列出一些很有规律的不等式,解不等式即可。

不正确的做法就是对于每三个M的差,两边的和-中间的最小值。

T2四边形肯定会有一条的对角线那么枚举对角线,在枚举对角线的两端就能做到O(n^3)

会发现答案的四边形显然会在凸包上,那么离对角线最远的点总是单调的。

T3看了不会

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
inline void Get_Int(LL &x)
{
x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
}
inline LL Min(LL x,LL y) {return x>y?y:x;}
inline LL Max(LL x,LL y) {return x>y?x:y;}
//========================
const LL Maxn=;
const LL Inf=(LL)<<;
LL M[Maxn],Ans,n;
int main()
{
Get_Int(n);
for (LL i=;i<=n;i++) Get_Int(M[i]);
LL Ret=M[],L=-Inf,R=M[];
for (int i=;i<n;i++)
{
if (i&) Ret=Ret+M[i]-M[i+];
else Ret=M[i+]-M[i]+Ret;
if (i&) L=Max(L,Ret);
else R=Min(R,Ret);
}
if (L>R) puts(""); else printf("%d\n",R-L+);
return ;
}

T1

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int Maxn=;
const double eps=1e-;
struct Node
{
double x,y;
Node (double x=,double y=):x(x),y(y){}
};
inline Node operator - (Node P,Node Q) {return Node(P.x-Q.x,P.y-Q.y);}
inline double Cross(Node P,Node Q) {return P.x*Q.y-P.y*Q.x;}
inline double Area(Node A,Node B,Node C) {return Cross(B-A,C-A);}
inline int dcmp(double x) {if (fabs(x)<eps) return ; return x>?:-;}
inline double Dis(Node O) {return sqrt(O.x*O.x+O.y*O.y);}
inline double Max(double x,double y) {return x>y?x:y;}
inline void Swap(Node &X,Node &Y) {Node T=X;X=Y;Y=T;}
//====================================
int n,Top;
double Ans;
Node P[Maxn],V[Maxn];
inline bool cmp(Node A,Node B)
{
if (dcmp(Area(P[],A,B))==) return Dis(A-P[])<Dis(B-P[]);
return Area(P[],A,B)>;
}
inline void Graham()
{
int k=;
for (int i=;i<=n;i++)
if (P[i].y<P[k].y || (dcmp(P[i].y-P[k].y)== && P[i].x<P[k].x)) k=i;
Swap(P[],P[k]);
sort(P+,P+n+,cmp);
V[]=P[],V[]=P[]; Top=;
for (int i=;i<=n;i++)
{
while (Top>= && Area(V[Top-],V[Top],P[i])<=) Top--;
V[++Top]=P[i];
}
}
inline void Work()
{
V[Top+]=V[]; Ans=;
for (int X=;X<=Top;X++)
{
int u=X%Top+,v=(X+)%Top+;
for (int Y=X+;Y<=Top;Y++)
{
while (u%Top+!=Y && fabs(Area(V[X],V[Y],V[u+]))>fabs(Area(V[X],V[Y],V[u]))) u=u%Top+;
while (v%Top+!=X && fabs(Area(V[X],V[Y],V[v+]))>fabs(Area(V[X],V[Y],V[v]))) v=v%Top+;
Ans=Max(Ans,fabs(Area(V[u],V[X],V[Y]))+fabs(Area(V[v],V[X],V[Y])));
}
}
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lf%lf",&P[i].x,&P[i].y);
Graham();
Work();
printf("%.3lf\n",Ans/2.0);
return ;
}

T2

8.12 啊被虐爆了..

T1 有 M 个序列,要在每个序列里选一个元素出来,求元素总和第 K 小的值。

T2 平面上有n个凸包求两点间的最短路,不能穿过凸包。

T3 看不懂..

50+0+0=50

T1 一眼转化为第K短路模型然后50MLE了(循环队列的话应该没问题),T2 计算几何+Dij貌似出了点偏差,而且我在判断两条直线关系的时候居然是求出交点然后判断!(mdzz)

Sol:

T1 实际上非常暴力,把小根堆弹K次就行了,然后把当前的堆其中的一个序列把原来的删去,加入比他大的后一个。需要注意的是每次把所有的序列往后会有重复,所以要记录一个i,表示前1~i-1的都不能变化了

T2 M^3暴力枚举每个点判一下是否会相交即可,感觉类似于VIJOS中的有一道叫做围墙的题.

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define PA pair<int,pair<int,vector<int> > > using namespace std;
inline void Get_Int(int &x)
{
x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
}
priority_queue<PA,vector<PA>,greater<PA> > Q;
int m,k,a[][];
vector<int> V;
int main()
{
Get_Int(m),Get_Int(k);
for (int i=;i<=m;i++)
{
Get_Int(a[i][]);
for (int j=;j<=a[i][];j++) Get_Int(a[i][j]);
sort(a[i]+,a[i]+a[i][]+);
}
int Ret=; for (int i=;i<=m;i++) Ret+=a[i][];
V.clear(); V.pb(); for (int i=;i<=m;i++) V.pb();
Q.push(mp(Ret,mp(,V)));
for (int i=;i<k;i++)
{
PA U=Q.top(); Q.pop();
for (int j=U.se.fi;j<=m;j++)
{
U.se.se[j]++;
Q.push(mp(U.fi+a[j][U.se.se[j]]-a[j][U.se.se[j]-],mp(j,U.se.se)));
U.se.se[j]--;
}
}
printf("%d\n",Q.top().fi);
return ;
}

T1

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define pa pair<int,int>
#define PA pair<double,int>
using namespace std;
inline void Get_Int(int &x)
{
x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
}
const int Maxn=;
const double eps=1e-;
int Begin[Maxn],End[Maxn],num[Maxn],tot,n,S,T;
double f[Maxn][Maxn],dis[Maxn];
bool vis[Maxn];
vector<pa> Line;
struct Vector
{
double x,y;
Vector(double x=,double y=):x(x),y(y){}
}P[Maxn];
inline Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x,A.y-B.y);}
inline double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
inline double Area(Vector A,Vector B,Vector C) {return Cross(B-A,C-A);}
inline double Dis(Vector A) {return sqrt(A.x*A.x+A.y*A.y);}
inline int dcmp(double x) {if (fabs(x)<eps) return ; return x>?:-;}
inline bool Pan(int u,int v,int p,int q)
{
int s=Area(P[u],P[p],P[q]);
int t=Area(P[v],P[p],P[q]);
if (dcmp(s)*dcmp(t)==-) return true;
return false;
}
inline bool Pan2(int u,int v,int p,int q)
{
int s=Area(P[u],P[p],P[q]);
int t=Area(P[v],P[p],P[q]);
if (dcmp(s)*dcmp(t)==) return true;
return false;
}
inline bool Check(int u,int v)
{
for (int i=;i<=n;i++)
{
int Cnt=;
for (int j=Begin[i];j<=End[i];j++)
{
if (Pan(u,v,Line[j].fi,Line[j].se) && Pan(Line[j].fi,Line[j].se,u,v)) return false;
if (Pan2(u,v,Line[j].fi,Line[j].se) || Pan2(Line[j].fi,Line[j].se,u,v)) Cnt++;
}
if (Cnt>=) return false;
}
return true;
}
priority_queue<PA,vector<PA>,greater<PA> > Q;
void Dij()
{
for (int i=;i<=tot;i++) dis[i]=10000000.0;
memset(vis,false,sizeof(vis));
dis[S]=;
Q.push(mp(0.0,S));
while (!Q.empty())
{
int u=Q.top().se; Q.pop();
if (vis[u]) continue; vis[u]=true;
for (int i=;i<=tot;i++)
if (u!=i && f[u][i]!=- && dis[i]>dis[u]+f[u][i])
{
dis[i]=dis[u]+f[u][i];
Q.push(mp(dis[i],i));
}
}
}
int main()
{ Get_Int(n);
Line.pb(mp(,));
for (int i=;i<=n;i++)
{
Get_Int(num[i]); Begin[i]=tot+;
for (int j=;j<=num[i];j++)
{
tot++; scanf("%lf%lf",&P[tot].x,&P[tot].y);
if (j!=) Line.pb(mp(tot,tot-));
}
Line.pb(mp(tot,tot-num[i]+)); End[i]=tot;
}
Get_Int(S),Get_Int(T);
for (int i=;i<=tot;i++)
for (int j=;j<=tot;j++)
{
if (i==j) {f[i][j]=0.0; continue;}
if (Check(i,j)) f[i][j]=Dis(P[i]-P[j]); else f[i][j]=-;
}
Dij();
printf("%.4lf\n",dis[T]);
return ;
}

T2

8.13

T1 定义两个函数f,g,并求出g(n)的值:f(n)为所有小于n的与n互质的数之和,g(n)为所有所有n的约数的f的和..

T2 DP 难以描述

T3 MST难以描述

30+50+30=110 三题暴力

T1

30:暴力枚举

60:然后会发现f其实可以用容斥算出来即,比如算f(60),先 O(sqrt(N))的时间,找出60的质因子有哪些。得到它的质因子2,3,5后,f(60) = 所有数的和-2的倍数的和-3的倍数的和-5的倍数的和+6(2*3)的倍数的和+10(2*5)的倍数的和+15(3*5)的倍数的和-30(2*3*5) 的倍数的和(当然这里的数都限定在60以内)。

100:有个规律及f(n)=n*φ(n)/2,Prove:(加入a与n互素呢么n-a与n也互素,反之则不互素,那么(a,n-a)的和刚好为n,而却总共有φ(n)/2对);

g(n)=∑x*φ(x)/2,因为φ具有积性可以把它分解为每个质因数的乘积即可.

T2  DP +然后用数据结构维护即可

T3

30:暴力重建MST

60:会发现重边非常多,那么对于每条重边建个卡壳就可以了。

100:奥妙重重的做法

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std; inline void Get_Int(LL &x)
{
x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
}
//==============================
LL Kase,n,Ans;
inline LL Calc(LL a,LL b)
{
LL q=a*a,fr=q-a,r=;
for (LL i=;i<=b;i++) r+=fr,fr*=q;
return r;
}
int main()
{
freopen("shobera.in","r",stdin);
freopen("shobera.out","w",stdout);
Get_Int(Kase);
for (LL kase=;kase<=Kase;kase++)
{
Get_Int(n); LL t=n; Ans=;
for (LL i=;i*i<=n;i++)
if (t%i==)
{
LL Ret=;
for (;t%i==;t/=i) Ret++;
Ans*=Calc(i,Ret);
}
if (t>) Ans*=Calc(t,);
printf("%lld\n",(Ans+)>>);
}
return ;
}

T1

8.15

T1 难以表述的DP

T2 求序列第K大

T3 求分数在K进制下的有循环节长度

Sol :

T

8.17

T1 输出一定长度的升子序列

T2 数据结构,在线修改一段区间的颜色为一种颜色,询问某段区间的某个颜色个数

T3 使得a[i]>b[j]的对数

10+60+60

T1 就nlogn的发现要按照字典序输出,WA 10

T2 线段树暴力可以做到60,再大开不下了

T3 一眼网络流..mdzz 60

Sol :

T1 :那么如BZOJ1046中但是BZOJ1046中的位置,而这道题中的是权值,离散化一下就可以了。

T2 :可以有分块以时间换空间

T3 :水题贪心,拍完须后,同BZOJ1707

NOIP 赛前模拟记录的更多相关文章

  1. 刷题总结——纸带(NOIP赛前模拟)

    题目: 有一个无限长的纸带··上面被划分为若干个格子··现在进行N次操作,第i次操作在L到R上擦出曾经写上的数字(如果有),并写上数字i,询问最终可以看到多少个数字 N小于10^6 题解: 首先毫无疑 ...

  2. NOIP赛前模拟20171027总结

    题目: 1.寿司 给定一个环形的RB串··要求经过两两互换后RB分别形成两段连续区域,求最少操作次数(算法时间O(n)) 2.金字塔 给定一个金字塔的侧面图有n层··已知每一层的宽度··高度均为1·· ...

  3. NOIP赛前集训备忘录(含每日总结)(日更?。。。)

    NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...

  4. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

  5. 2018年牛客网NOIP赛前训练营游记

    2018年牛客网NOIP赛前训练营游记 提高组(第一场) 中位数 #include<cstdio> #include<cctype> #include<climits&g ...

  6. 牛客网NOIP赛前集训营-提高组(第四场)B区间

    牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1  \dots   a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...

  7. 牛客网NOIP赛前集训营-提高组(第四场)B题 区间

    牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...

  8. NOIP前模拟赛总结

    NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...

  9. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

随机推荐

  1. Python 修饰符

    def hello(fn):    def wrapper():        print "hello"        fn()        print "goodb ...

  2. php curl用法

    curl 是使用URL语法的传送文件工具,支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP.curl 支持SSL证书.HTTP POS ...

  3. 转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select ...

  4. Android之ViewPager组件实现左右滑动View

    什么是ViewPager VIewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用来实现左右滑动切换View的效果.如果想向下兼容需要 android-support-v4.j ...

  5. Windows Store App JavaScript 开发:页面加载

      在开发基于JavaScript的Windows应用商店应用时,可以使用HtmlControl和PageControl控件加载一个页面,这两个WinJS库控件曾在上面的内容中提到过,HtmlCont ...

  6. ASCII编码对照表

    Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释 0000 0000 0 0 00 NUL(null) 空字符 0000 0001 1 1 01 SOH(st ...

  7. mysql5.6新特性总结

    一. server参数默认值设置的变化http://dev.mysql.com/doc/refman/5.6/en/server-default-changes.html 二. innodb增强1.全 ...

  8. [原创]C#应用WindowsApi实现查找(FindWindowEx)文本框(TextBox、TextEdit)。

    /// <summary> /// 获取文本框控件 /// </summary> /// <param name="hwnd">文本框所在父窗口 ...

  9. UIImage

    //设置UIImage的圆角 + (UIImage *)imageNamed:(NSString *)name size:(CGSize)size cornerRadius:(CGFloat)corn ...

  10. mysql数据库使用

    C#操作Mysql数据库的存储过程,网址 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间 ...