2017 10.25 NOIP模拟赛
期望得分: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模拟赛的更多相关文章
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 2018.10.30 NOIp模拟赛 T1 改造二叉树
[题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
随机推荐
- java8之重新认识HashMap(转自美团技术团队)
java8之重新认识HashMap 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(JavaDevelopmet Kit)版本的更新,JDK1.8对Ha ...
- angularJS1笔记-(2)-$watch方法监听变量的变化
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- C++编译与链接(0)-.h与.cpp中的定义与声明
C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须 ...
- Internet History, Technology and Security (Week 5-1)
Week 5 Technology: Internets and Packets Welcome to Week 5! This week, we'll be covering internets a ...
- springmvc上传文件报错org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]
在用springmvc+mybatis进行项目开发时,上传文件抛异常... org.springframework.beans.BeanInstantiationException: Could no ...
- Intellij IDEA Scala开发环境搭建
1,在intellij 官网上下载IDEA 2,在scala官网上下载最新版scala 3,安装两个下载的文件 4,打开intellij,菜单栏help->find action 输入plu ...
- Shopping Bands Rank & SBR
Shopping Bands Rank SBR https://www.guiderank.org/index.html Nike Air Zoom Pegasus 34 http://www.shi ...
- jmeter提取正则表达式中所有关联值-----我想获取所有的ID
[{ "ID": 1, "Name": "张三" }, { "ID": 2, "Name": &qu ...
- 《Linux内核设计与实现》学习总结 Chap5
一.与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层. 作用: 1)为用户空间提供了一种硬件的抽象接口. 2)系统调用保证了系统的稳定和安全. 3)每个进程都运行在虚拟系统中,而在 ...
- Codeforces 901C. Bipartite Segments(思维题)
擦..没看见简单环..已经想的七七八八了,就差一步 显然我们只要知道一个点最远可以向后扩展到第几个点是二分图,我们就可以很容易地回答每一个询问了,但是怎么求出这个呢. 没有偶数简单环,相当于只有奇数简 ...