期望得分:100+40+100=240

实际得分:50+40+20=110

T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O

T3 代码3个bug :数组开小了,一个细节没注意,手抖打错变量。。。

细节处理很重要啊!!!!

贪心,按结束时间排序

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 struct node
{
int t,s;
}e[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool cmp(node p,node q)
{
return p.s>q.s;
} int main()
{
freopen("manage.in","r",stdin);
freopen("manage.out","w",stdout);
int n;
read(n);
for(int i=;i<=n;i++) read(e[i].t),read(e[i].s);
sort(e+,e+n+,cmp);
int now=2e9,start;
for(int i=;i<=n;i++)
{
start=min(now,e[i].s);
now=start-e[i].t;
}
if(now>=) printf("%d",now);
else printf("-1");
}

设f[i] 表示 前i种珠子的排列方案

sum[i] 表示前i种珠子的前缀和

cnt[i] 表示第i种珠子的个数

因为第i种珠子的最后一个一定要在第i+1种珠子的最后一个之前

所以 到第i种珠子,第i种的最后一个一定在sum[i]位置上

所以还剩sum[i]-1个位置,还剩cnt[i]-1个珠子

所以 f[i]=f[i-1]*C(sum[i]-1,cnt[i]-1)

可以理解为 在sum[i]-1 个位置上选了cnt[i]-1个位置之后,剩下的位置就是把原来f[i-1]的每一种方案再塞进去

#include<cstdio>
#include<iostream> using namespace std; #define N 100001 #define mod 998244353 int cnt[N],sum[N]; int fac[N*],inv[N*]; int f[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int Pow(int a,int b)
{
int r=;
for(;b;a=1ll*a*a%mod,b>>=)
if(b&) r=1ll*a*r%mod;
return r;
} int getC(int a,int b)
{
return 1ll*fac[a]*inv[b]%mod*inv[a-b]%mod;
} int main()
{
freopen("qiang.in","r",stdin);
freopen("qiang.out","w",stdout);
int n;
read(n);
for(int i=;i<=n;i++) read(cnt[i]),sum[i]=sum[i-]+cnt[i];
fac[]=inv[]=;
int tot=sum[n];
for(int i=;i<=tot;i++) fac[i]=1ll*fac[i-]*i%mod,inv[i]=Pow(fac[i],mod-);
f[]=;
for(int i=;i<=n;i++) f[i]=1ll*f[i-]%mod*getC(sum[i]-,cnt[i]-)%mod;
printf("%d",f[n]);
}

考场上我是真的不会,~~~~(>_<)~~~~

40分大爆搜

#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; #define N 100001 int n,tot; bool flag1; int sum[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void init()
{
read(n);
for(int i=;i<=n;i++) read(sum[i]),tot+=sum[i];
if(tot<=) flag1=true;
} namespace solve1
{
int mx[];
int ans=; void dfs(int x,int tmp[])
{
if(x==tot+) { ans++; return; }
for(int i=;i<=n;i++)
if(tmp[i])
{
if(tmp[i]==)
{
for(int j=;j<i;j++)
if(!tmp[j] && mx[j]>x && mx[j]!=-) return;
for(int j=i+;j<=n;j++)
if(!tmp[j] && mx[j]<x && mx[j]!=-) return;
}
tmp[i]--;
int last=mx[i]; mx[i]=x;
dfs(x+,tmp);
tmp[i]++;
mx[i]=last;
}
} void work()
{
int rest[];
for(int i=;i<=n;i++) rest[i]=sum[i];
memset(mx,-,sizeof(mx));
dfs(,rest);
printf("%d",ans);
}
} int main()
{
freopen("qiang.in","r",stdin);
freopen("qiang.out","w",stdout);
init();
if(flag1) solve1 :: work();
else printf("%d\n",);
}

20%的数据:Q*N暴力枚举

另外30%的数据:

因为每个函数最多覆盖10个元素,而且保证每个位置只修改一次

所以最多进行10^6 次 单个的修改

用vector记录下每个元素对哪些函数有影响

用线段树维护 函数的和

修改的时候 枚举 这个元素有影响的所有函数,一个一个的在线段树里改

查询直接区间求和

100%的数据:

树状数组+分块

树状数组里记录每个元素的值

把数组分为根号n块,

cnt[i][j]记录 第i块内,第j个元素使用的次数

用 差分+前缀和 即可得到这个数组

用tot[i]记录第i块的函数和

修改的时候,直接修改tot,修改树状数组中的元素

查询的时候,一个块里的直接用tot,凑不成一个块的暴力在树状数组里查

代码3部分均有

#include<cmath>
#include<cstdio>
#include<vector>
#include<iostream> #define lowbit(x) x&-x using namespace std; #define N 100001 typedef long long LL; int n; int a[N];LL sum[N]; int L[N],R[N]; bool flag2=true; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void init()
{
read(n);
for(int i=;i<=n;i++) read(a[i]),sum[i]=sum[i-]+a[i];
for(int i=;i<=n;i++)
{
read(L[i]); read(R[i]);
if(R[i]-L[i]>) flag2=false;
}
} namespace solve2
{
vector<int>v[N];
LL tot[N<<];
LL ans; void build(int k,int l,int r)
{
if(l==r) { tot[k]=sum[R[l]]-sum[L[l]-]; return; }
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tot[k]=tot[k<<]+tot[k<<|];
} void change(int k,int l,int r,int pos,int w)
{
if(l==r) { tot[k]+=w; return; }
int mid=l+r>>;
if(pos<=mid) change(k<<,l,mid,pos,w);
else change(k<<|,mid+,r,pos,w);
tot[k]=tot[k<<]+tot[k<<|];
} void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr) { ans+=tot[k];return; }
int mid=l+r>>;
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} void pre()
{
for(int i=;i<=n;i++)
for(int j=L[i];j<=R[i];j++) v[j].push_back(i);
build(,,n);
} void work()
{
pre();
int m,ty,l,r;
int w,s;
read(m);
while(m--)
{
read(ty); read(l); read(r);
if(ty==)
{
w=r-a[l]; a[l]=r;
s=v[l].size();
for(int i=;i<s;i++) change(,,n,v[l][i],w);
}
else
{
ans=;
query(,,n,l,r);
printf("%I64d\n",ans);
}
}
}
} namespace solve1
{
LL tot[N]; void pre()
{
for(int i=;i<=n;i++) tot[i]=sum[R[i]]-sum[L[i]-];
} void work()
{
pre();
int m,ty,l,r,w;
LL ans;
read(m);
while(m--)
{
read(ty); read(l); read(r);
if(ty==)
{
w=r-a[l]; a[l]=r;
for(int i=;i<=n;i++)
if(L[i]<=l && R[i]>=l) tot[i]+=w;
}
else
{
ans=;
for(int i=l;i<=r;i++) ans+=tot[i];
printf("%I64d\n",ans);
}
}
}
} namespace solve3
{
int siz,mx;
int id[N],cnt[][N+];
unsigned long long tot[],ans;
LL c[N]; void add(int x,int w)
{
while(x<=n)
{
c[x]+=w;
x+=lowbit(x);
}
} LL query(int x)
{
LL t=;
while(x)
{
t+=c[x];
x-=lowbit(x);
}
return t;
} void pre()
{
siz=sqrt(n);
for(int i=;i<=n;i++) id[i]=(i-)/siz+;
mx=(n-)/siz+;
int l,r;
for(int i=;i<=mx;i++)
{
l=(i-)*siz+;
r=min(i*siz,n);
for(int j=l;j<=r;j++)
{
cnt[i][L[j]]++,cnt[i][R[j]+]--;
tot[i]+=sum[R[j]]-sum[L[j]-];
}
for(int j=;j<=n;j++) cnt[i][j]+=cnt[i][j-];
}
for(int i=;i<=n;i++) add(i,a[i]);
} void out(unsigned long long x)
{
if(x/) out(x/);
putchar(x%+'');
} void work()
{
pre();
int m,ty,l,r,w;
int bl,br,tl,tr;
read(m);
while(m--)
{
read(ty); read(l); read(r);
if(ty==)
{
w=r-a[l]; a[l]=r;
add(l,w);
for(int i=;i<=mx;i++) tot[i]+=1ll*cnt[i][l]*w;
}
else
{
ans=;
bl=(l-)/siz+; br=(r-)/siz+;
tl=bl*siz; tr=(br-)*siz+;
for(int i=l;i<=min(r,tl);i++) ans+=query(R[i])-query(L[i]-);
for(int i=bl+;i<br;i++) ans+=tot[i];
if(bl!=br)
for(int i=tr;i<=r;i++) ans+=query(R[i])-query(L[i]-);
out(ans);
printf("\n");
}
}
}
} int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
init();
if(n<=) solve1 :: work();
else if(flag2) solve2 :: work();
else solve3 :: work();
}

2017 10.25 NOIP模拟赛的更多相关文章

  1. 10.17 NOIP模拟赛

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

  2. 10.16 NOIP模拟赛

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

  3. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  4. 2016.10.30 NOIP模拟赛 day2 PM 整理

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

  5. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  6. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

  7. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  8. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

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

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

随机推荐

  1. OC中的私有方法

    1.不写在.h文件中 2.不写在.m文件中 一.私有方法: 没有在.h文件当中进行声明的方法在OC中都被称为私有方法 私有方法子类是无法继承到的

  2. angularJS1笔记-(1)-多控制器

    前端写好: <div ng-app="myApp"> <div ng-controller="firstController"> < ...

  3. 转 理解vuex -- vue的状态管理模式

    转自:https://segmentfault.com/a/1190000012015742 vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 ...

  4. JS面向对象(封装,继承)

    在六月份找工作中,被问的最多的问题就是: js面向对象,继承,封装,原型链这些,你了解多少? 额,,,我怎么回答呢, 只能说,了解一些,不多不少,哈哈哈哈,当然,这是玩笑话. 不过之前学过java,来 ...

  5. From 百度知道 SQLSERVER 字符集排序规则简单说明

    https://zhidao.baidu.com/question/390314825002277485.html 学习一下, 以后说不定用得到. collate Latin1_General_CS_ ...

  6. sql 设计规范

    设计规范: 1.采用有意义的字段名 尽可能地把字段描述的清楚些.当然,也别做过头了,比如CustomerShippingAddressStreetLine1虽然很富有说明性,但没人愿意键入这么长的名字 ...

  7. 【Java并发编程】之七:使用synchronized获取互斥锁的几点说明

    在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确 ...

  8. line search中的重要定理 - 梯度与方向的点积为零

    转载请注明出处:http://www.codelast.com/ 对精确的line search(线搜索),有一个重要的定理: ∇f(xk+αkdk)Tdk=0 这个定理表明,当前点在dk方向上移动到 ...

  9. BZOJ5288 HNOI/AHOI2018游戏

    首先将之间没有锁的房间合并.显然可达性具有传递性和反交换律(即若a能到达b,则b不能到达a). 考虑对每个房间找到其左右第一个(即与其最接近的)能作为起点到达它的房间.如果能求出这个,对此建两棵树,问 ...

  10. Codeforces 893F(主席树+dfs序)

    在子树内和距离不超过k是一个二维限制,容易想到主席树,但主席树显然没法查最小值,因为不满足区间可减.kdtree和二维线段树可以干这事,但肯定会T飞.但事实上我们的问题有一个特殊性:对某个点x,查询其 ...