题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o

总共得了:130分,

1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路)

虽然不高,但是比较满意,因为把自己会的分数都拿到了。

T1:100分

 /*
T1明显是个数论题。
正确的思路:把n!质因数分解,把所有质因数的指数都取到最大的偶数,它们的乘积便是最终的结果。
有一种很快的方法在Eular筛中可以n!的质因数分解。
if(!is_prim[i])
{
prim[++prim[0]]=i;
ll x=n;
while(x)
{
cs[prim[0]]+=x/prim[prim[0]];
x/=prim[prim[0]];
}
}
具体的可以用“抽数法(反正我这么叫它)”来证明。 */
#define N 5000010
#include<iostream>
using namespace std;
#include<cstdio>
#define Mod 100000007
typedef long long ll;
ll prim[N]={};
int cs[N]={};
bool is_prim[N];
int n;
void eular()
{
for(ll i=;i<=n;++i)
{
if(!is_prim[i])
{
prim[++prim[]]=i;
ll x=n;
while(x)
{
cs[prim[]]+=x/prim[prim[]];
x/=prim[prim[]];
}
}
for(int j=;j<=prim[];++j)
{
if(i*prim[j]>n) break;
is_prim[i*prim[j]]=true;
if(i%prim[j]==) break;
}
}
/* for(int i=1;i<=prim[0];++i)
printf("%d\n",prim[i]);*/
}
void fj()
{
for(ll i=;i<=n;++i)
{
ll x=i;
while(x!=)
{
for(int j=;j<=prim[];++j)
{
if(x%prim[j]==)
{
cs[j]++;
x/=prim[j];
break;
}
}
}
}
}
ll quick_mod(ll a,ll b)//a^b
{
ll ret=;
while(b)
{
if(b&)
{
ret=(ret*a)%Mod;
}
b>>=;
a=(a*a)%Mod;
}
return ret;
}
int main()
{
freopen("hao.in","r",stdin);
freopen("hao.out","w",stdout);
scanf("%d",&n);
eular();
// fj();这是没用这个优化的部分,只能得50分。
ll ans=;
for(int i=;i<=prim[];++i)
{
if(cs[i]%==)
{
ans=(ans*quick_mod(prim[i],cs[i]))%Mod;
}
else{
ans=(ans*quick_mod(prim[i],cs[i]-))%Mod;
}
}
cout<<ans%Mod<<endl;
fclose(stdin);
fclose(stdout);
return ;
}

T2:

/*这道题目内部的转化非常巧妙,
首先[l,r]->[0,r]-[0,l-1]
现在只讨论r
Σxi/m -r<=0 --> ∑(xi-r)/m<=0 ==>∑(xi-m)<=0:
题目==>询问有多少区间和小于等于0
做一个前缀和S,现有[a,b] 要满足 s[b]-s[a]<=0 :
询问有多少对a,b使s[b]<=s[a] --> 求逆序对
注意这道题目的转换,十分的巧妙。
--------*****------
另外求逆序对有两种方法:归并排序或者树状数组,第二种请自行百度。
*/

 #include<iostream>
using namespace std;
#include<cstdio>
#define N 500010
typedef long long ll;
ll a[N],sum[N],zc[N];
int n,r,l;
ll read()
{
ll ret=,ff=;
char s=getchar();
while(s<''||s>'')
{
if(s=='-') ff=-;
s=getchar();
}
while(s>=''&&s<='')
{
ret=ret*+s-'';
s=getchar();
}
return ret*ff;
}
void gb1(int l1,int r1,ll &ans)
{
if(l1==r1) return;
int mid=(l1+r1)>>;
gb1(l1,mid,ans);
gb1(mid+,r1,ans);
int s=l1,i=l1,j=mid+;
while(i<=mid&&j<=r1)
{
if(sum[i]>=sum[j])
{
zc[s]=sum[j];
ans+=mid-i+;
s++;j++;
}
else{
zc[s]=sum[i];
i++;s++;
}
}
while(i<=mid)
{
zc[s]=sum[i];
i++;s++;
}
while(j<=r1)
{
zc[s]=sum[j];
s++;j++;
}
for(int i=l1;i<=r1;++i)
sum[i]=zc[i];
}
void gb2(int l1,int r1,ll &ans)
{
if(l1==r1) return ;
int mid=(l1+r1)>>;
gb2(l1,mid,ans);
gb2(mid+,r1,ans);
int i=l1,s=l1,j=mid+;
while(i<=mid&&j<=r1)
{
if(sum[i]>sum[j])
{
ans-=(mid-i+);
zc[s]=sum[j];
s++;j++;
}
else{
zc[s]=sum[i];
i++;s++;
}
}
while(i<=mid)
{
zc[s]=sum[i];
i++;s++;
}
while(j<=r1)
{
zc[s]=sum[j];
j++;s++;
}
for(int i=l1;i<=r1;++i)
sum[i]=zc[i];
}
void gcd(ll a,ll b,ll &gc)
{
if(!b)
{
gc=a;
return;
}
gcd(b,a%b,gc);
}
int main()
{
freopen("jian.in","r",stdin);
freopen("jian.out","w",stdout);
scanf("%d%d%d",&n,&l,&r);
for(int i=;i<=n;++i)
a[i]=read();
ll ans=;
sum[]=;
for(int i=;i<=n;++i)
sum[i]=a[i]-r;
for(int i=;i<=n;++i)
sum[i]+=sum[i-];
gb1(,n,ans);
sum[]=;
for(int i=;i<=n;++i)
sum[i]=a[i]-l;
for(int i=;i<=n;++i)
sum[i]+=sum[i-];
gb2(,n,ans);
ll mu=(ll)(n+)*n/;/*一定要注意这个小细节,赋值时最大就是int,超过int,即使是给long long 赋值,也会炸数据类型*/
ll gc;
gcd(ans,mu,gc);
ans/=gc;mu/=gc;
if(mu==) printf("");
else cout<<ans<<"/"<<mu;
fclose(stdin);
fclose(stdout);
return ;
}

T3:

考试时蒙蔽到连10%的数据都不会处理了。╮(╯▽╰)╭

 /*
这道题目直接用dfs可以,也可以如下的先用dp处理一部分点。
但是都要用到状态压缩。
其实,这一点我们是应该想到的,每个栅栏内放哪几个葱是很重要的而且n<=16,我们应该想到用状压的。
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> using namespace std; int m,k,n,x[],y[],f[][<<],cost[<<],s[],ans; void dfs(int now,int cnt,int res)/*res当前所用的栅栏长度,now当前处理第几根葱,cnt已用栅栏的数目*/
{
if (now==n)
{
if (res<ans) ans=res;
return;
}
if (res+(k-cnt)*>=ans) return;/*最优性剪枝,当前所用栅栏的数目+几乎最少的长度>=ans就剪枝*/
/*对于当前这个葱,只有放入之前的栅栏和新建一个栅栏两种方案*/
for (int a=;a<=cnt;a++)/*枚举已用的栅栏*/
{
int pres=s[a];/*取出这个栅栏的放的葱的情况*/
s[a]|=(<<now);/*把这个葱放进去,再进行下一步搜索*/
dfs(now+,cnt,res-cost[pres]+cost[s[a]]);
s[a]^=(<<now);/*把这个葱取出来,回溯*/
}
if (cnt<k)
{
cnt++;/*新建一个栅栏,把葱放进去*/
s[cnt]=(<<now);
dfs(now+,cnt,res+);
}
} int main()
{
freopen("dan.in","r",stdin);
freopen("dan.out","w",stdout); scanf("%d%d%d",&m,&k,&n);
for (int a=;a<n;a++)
scanf("%d%d",&x[a],&y[a]);
if (n<=)
{
memset(f,0x3f,sizeof(f));
for (int a=;a<(<<n);a++)/*状态压缩,把葱在一个栅栏中的所有情况都枚举了出来*/
{
int sx=,mx=-,sy=,my=-;
for (int b=;b<n;b++)
if ((a>>b)&)
{
if (x[b]<sx) sx=x[b];
if (x[b]>mx) mx=x[b];
if (y[b]<sy) sy=y[b];
if (y[b]>my) my=y[b];/*计算这个栅栏的最小大小*/
}
f[][a]=(mx-sx+)*+(my-sy+)*;
}
for (int a=;a<=k;a++)/*枚举k个栅栏*/
for (int b=;b<(<<n);b++)/*枚举b个葱组成集合的1<<n中放置方法*/
for (int c=b-;c;c=(c-)&b)/*这是一种状态压缩枚举b集合中的所有子集的方法,c=b-1,就可以表示所有的元素都在集合中,每次-1,可以枚举出1<<b的所有情况*/
f[a][b]=min(f[a][b],f[a-][c]+f[][b^c]);/*枚举出任意子集c,b^c是c在b中的补集,c与b按位如果都有1或0,则他们的子集中都没有。*/
int ans=f[][(<<n)-];/*这是一个栅栏n个葱都放入的结果*/
for (int a=;a<=k;a++)
ans=min(ans,f[a][(<<n)-]);
printf("%d\n",ans);
}
else/*如果不这样特判的话,n>14会有超时*/
{
ans=;
for (int a=;a<(<<n);a++)
{
int sx=,mx=-,sy=,my=-;
for (int b=;b<n;b++)
if ((a>>b)&)
{
if (x[b]<sx) sx=x[b];
if (x[b]>mx) mx=x[b];
if (y[b]<sy) sy=y[b];
if (y[b]>my) my=y[b];
}
cost[a]=(mx-sx+)*+(my-sy+)*;/*一个栅栏的情况*/
}
dfs(,,);
printf("%d\n",ans);
} return ;
}

我的:

 #define M 1010
#include<iostream>
using namespace std;
#include<cstdio>
#define N 17
int n,m,k;
struct Pos{
int x,y;
}pos[N];
int val[<<N],ans,zha[N+];
void input()
{
scanf("%d%d%d",&m,&k,&n);
for(int i=;i<n;++i)
scanf("%d%d",&pos[i].x,&pos[i].y);
}
void pre_chuli()
{
for(int i=;i<(<<n);++i)
{
int dx=-,dy=-,xx=,xy=;
for(int j=;j<n;++j)
{
if((<<j)&i)
{
dx=max(dx,pos[j].x);
dy=max(dy,pos[j].y);
xy=min(xy,pos[j].y);
xx=min(xx,pos[j].x);
}
}
val[i]=(dy-xy+)*+(dx-xx+)*;
}
}
void dfs(int now,int cnt,int cos)
{
if(now==n)
{
ans=min(cos,ans);
return;
}
if(cos+(k-cnt)*>=ans) return;
for(int i=;i<=cnt;++i)
{
int x=zha[i];
zha[i]|=(<<now);
dfs(now+,cnt,cos-val[x]+val[zha[i]]);
zha[i]^=(<<now);
}
if(cnt<k)
{
zha[cnt+]=(<<now);
dfs(now+,cnt+,cos+);
zha[cnt+]=;
}
}
int main()
{
freopen("dan.in","r",stdin);
freopen("dan.out","w",stdout);
input();
pre_chuli();
ans=;
dfs(,,);
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return ;
}

2016.10.30 NOIP模拟赛 day2 AM 整理的更多相关文章

  1. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  2. 2016.10.29 NOIP模拟赛 PM 考试整理

    300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...

  3. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  4. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  5. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  8. CH Round #55 - Streaming #6 (NOIP模拟赛day2)

    A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...

  9. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

随机推荐

  1. ASP.NET MVC 了解FileResult的本质

    FileResult是一个基于文件的ActionResult,利用FileResult我们可以很容易地将从某个物理文件的内容响应给客户端.ASP.NET MVC定义了三个具体的FileResult,分 ...

  2. should be mapped with insert="false" update="false

    SSH项目出现了 should be mapped with insert="false" update="false 错误,仔细检查后发现,是两个不同的属性映射了表中的 ...

  3. 个人项目框架搭建 -- Autofac简单使用记录

    1.添加autofac相关程序集/使用Nuget 2.引入命名空间 using Autofac; using Autofac.Configuration; 3.使用 3.1:直接使用 var buil ...

  4. 【算法】PHP实现冒泡排序和快速排序--防遗忘

    有没有这样的感觉,排序算法虽然简单,但是没看过一次,一会就又忘了,所以有必要 自己使用实际的代码运行实现,才记忆牢固,为此Mark //需求:将数组中元素,从大到小排列$a = array(11, 2 ...

  5. Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)

    1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...

  6. 删掉SQL Server登录时登录名下拉列表框中的选项

    问题: 我以前创建了一个登录名如kpi,之后在"安全性-登录名" 里删掉了,但是每次登录时,登录名的下拉框中总是能显示登录名kpi,怎么把它删掉呢? 解决方案: 1).SQL Se ...

  7. mfc学习之路--如何删除通过控件新增的变量

    刚刚学校mfc的人都会遇到这样一个问题(比如我),在照做书做一个mfc程序,给控件新增变量时变量类型错了,但是变量名对了,然后想要加个正确的时候提示"已经存在该对象",然后就傻了, ...

  8. JavaScript小细节点罗列

    共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...

  9. Android开发重点难点1:RelativeLayout(相对布局)详解

    前言 啦啦啦~博主又推出了一个新的系列啦~ 之前的Android开发系列主要以完成实验的过程为主,经常会综合许多知识来写,所以难免会有知识点的交杂,给人一种混乱的感觉. 所以博主推出“重点难点”系列, ...

  10. Android Studio添加aar

    1.把aar复制到项目中的 libs 里面 2.在module 里面的build.gradle 的根目录添加 repositories{ flatDir { dirs 'libs' } } 3.在mo ...