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

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

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

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

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

贪心,按结束时间排序

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4.  
  5. using namespace std;
  6.  
  7. #define N 100001
  8.  
  9. struct node
  10. {
  11. int t,s;
  12. }e[N];
  13.  
  14. void read(int &x)
  15. {
  16. x=; char c=getchar();
  17. while(!isdigit(c)) c=getchar();
  18. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  19. }
  20.  
  21. bool cmp(node p,node q)
  22. {
  23. return p.s>q.s;
  24. }
  25.  
  26. int main()
  27. {
  28. freopen("manage.in","r",stdin);
  29. freopen("manage.out","w",stdout);
  30. int n;
  31. read(n);
  32. for(int i=;i<=n;i++) read(e[i].t),read(e[i].s);
  33. sort(e+,e+n+,cmp);
  34. int now=2e9,start;
  35. for(int i=;i<=n;i++)
  36. {
  37. start=min(now,e[i].s);
  38. now=start-e[i].t;
  39. }
  40. if(now>=) printf("%d",now);
  41. else printf("-1");
  42. }

设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]的每一种方案再塞进去

  1. #include<cstdio>
  2. #include<iostream>
  3.  
  4. using namespace std;
  5.  
  6. #define N 100001
  7.  
  8. #define mod 998244353
  9.  
  10. int cnt[N],sum[N];
  11.  
  12. int fac[N*],inv[N*];
  13.  
  14. int f[N];
  15.  
  16. void read(int &x)
  17. {
  18. x=; char c=getchar();
  19. while(!isdigit(c)) c=getchar();
  20. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  21. }
  22.  
  23. int Pow(int a,int b)
  24. {
  25. int r=;
  26. for(;b;a=1ll*a*a%mod,b>>=)
  27. if(b&) r=1ll*a*r%mod;
  28. return r;
  29. }
  30.  
  31. int getC(int a,int b)
  32. {
  33. return 1ll*fac[a]*inv[b]%mod*inv[a-b]%mod;
  34. }
  35.  
  36. int main()
  37. {
  38. freopen("qiang.in","r",stdin);
  39. freopen("qiang.out","w",stdout);
  40. int n;
  41. read(n);
  42. for(int i=;i<=n;i++) read(cnt[i]),sum[i]=sum[i-]+cnt[i];
  43. fac[]=inv[]=;
  44. int tot=sum[n];
  45. for(int i=;i<=tot;i++) fac[i]=1ll*fac[i-]*i%mod,inv[i]=Pow(fac[i],mod-);
  46. f[]=;
  47. for(int i=;i<=n;i++) f[i]=1ll*f[i-]%mod*getC(sum[i]-,cnt[i]-)%mod;
  48. printf("%d",f[n]);
  49. }

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

40分大爆搜

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4.  
  5. using namespace std;
  6.  
  7. #define N 100001
  8.  
  9. int n,tot; bool flag1;
  10.  
  11. int sum[N];
  12.  
  13. void read(int &x)
  14. {
  15. x=; char c=getchar();
  16. while(!isdigit(c)) c=getchar();
  17. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  18. }
  19.  
  20. void init()
  21. {
  22. read(n);
  23. for(int i=;i<=n;i++) read(sum[i]),tot+=sum[i];
  24. if(tot<=) flag1=true;
  25. }
  26.  
  27. namespace solve1
  28. {
  29. int mx[];
  30. int ans=;
  31.  
  32. void dfs(int x,int tmp[])
  33. {
  34. if(x==tot+) { ans++; return; }
  35. for(int i=;i<=n;i++)
  36. if(tmp[i])
  37. {
  38. if(tmp[i]==)
  39. {
  40. for(int j=;j<i;j++)
  41. if(!tmp[j] && mx[j]>x && mx[j]!=-) return;
  42. for(int j=i+;j<=n;j++)
  43. if(!tmp[j] && mx[j]<x && mx[j]!=-) return;
  44. }
  45. tmp[i]--;
  46. int last=mx[i]; mx[i]=x;
  47. dfs(x+,tmp);
  48. tmp[i]++;
  49. mx[i]=last;
  50. }
  51. }
  52.  
  53. void work()
  54. {
  55. int rest[];
  56. for(int i=;i<=n;i++) rest[i]=sum[i];
  57. memset(mx,-,sizeof(mx));
  58. dfs(,rest);
  59. printf("%d",ans);
  60. }
  61. }
  62.  
  63. int main()
  64. {
  65. freopen("qiang.in","r",stdin);
  66. freopen("qiang.out","w",stdout);
  67. init();
  68. if(flag1) solve1 :: work();
  69. else printf("%d\n",);
  70. }

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

另外30%的数据:

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

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

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

用线段树维护 函数的和

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

查询直接区间求和

100%的数据:

树状数组+分块

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

把数组分为根号n块,

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

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

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

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

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

代码3部分均有

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<iostream>
  5.  
  6. #define lowbit(x) x&-x
  7.  
  8. using namespace std;
  9.  
  10. #define N 100001
  11.  
  12. typedef long long LL;
  13.  
  14. int n;
  15.  
  16. int a[N];LL sum[N];
  17.  
  18. int L[N],R[N];
  19.  
  20. bool flag2=true;
  21.  
  22. void read(int &x)
  23. {
  24. x=; char c=getchar();
  25. while(!isdigit(c)) c=getchar();
  26. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  27. }
  28.  
  29. void init()
  30. {
  31. read(n);
  32. for(int i=;i<=n;i++) read(a[i]),sum[i]=sum[i-]+a[i];
  33. for(int i=;i<=n;i++)
  34. {
  35. read(L[i]); read(R[i]);
  36. if(R[i]-L[i]>) flag2=false;
  37. }
  38. }
  39.  
  40. namespace solve2
  41. {
  42. vector<int>v[N];
  43. LL tot[N<<];
  44. LL ans;
  45.  
  46. void build(int k,int l,int r)
  47. {
  48. if(l==r) { tot[k]=sum[R[l]]-sum[L[l]-]; return; }
  49. int mid=l+r>>;
  50. build(k<<,l,mid);
  51. build(k<<|,mid+,r);
  52. tot[k]=tot[k<<]+tot[k<<|];
  53. }
  54.  
  55. void change(int k,int l,int r,int pos,int w)
  56. {
  57. if(l==r) { tot[k]+=w; return; }
  58. int mid=l+r>>;
  59. if(pos<=mid) change(k<<,l,mid,pos,w);
  60. else change(k<<|,mid+,r,pos,w);
  61. tot[k]=tot[k<<]+tot[k<<|];
  62. }
  63.  
  64. void query(int k,int l,int r,int opl,int opr)
  65. {
  66. if(l>=opl && r<=opr) { ans+=tot[k];return; }
  67. int mid=l+r>>;
  68. if(opl<=mid) query(k<<,l,mid,opl,opr);
  69. if(opr>mid) query(k<<|,mid+,r,opl,opr);
  70. }
  71.  
  72. void pre()
  73. {
  74. for(int i=;i<=n;i++)
  75. for(int j=L[i];j<=R[i];j++) v[j].push_back(i);
  76. build(,,n);
  77. }
  78.  
  79. void work()
  80. {
  81. pre();
  82. int m,ty,l,r;
  83. int w,s;
  84. read(m);
  85. while(m--)
  86. {
  87. read(ty); read(l); read(r);
  88. if(ty==)
  89. {
  90. w=r-a[l]; a[l]=r;
  91. s=v[l].size();
  92. for(int i=;i<s;i++) change(,,n,v[l][i],w);
  93. }
  94. else
  95. {
  96. ans=;
  97. query(,,n,l,r);
  98. printf("%I64d\n",ans);
  99. }
  100. }
  101. }
  102. }
  103.  
  104. namespace solve1
  105. {
  106. LL tot[N];
  107.  
  108. void pre()
  109. {
  110. for(int i=;i<=n;i++) tot[i]=sum[R[i]]-sum[L[i]-];
  111. }
  112.  
  113. void work()
  114. {
  115. pre();
  116. int m,ty,l,r,w;
  117. LL ans;
  118. read(m);
  119. while(m--)
  120. {
  121. read(ty); read(l); read(r);
  122. if(ty==)
  123. {
  124. w=r-a[l]; a[l]=r;
  125. for(int i=;i<=n;i++)
  126. if(L[i]<=l && R[i]>=l) tot[i]+=w;
  127. }
  128. else
  129. {
  130. ans=;
  131. for(int i=l;i<=r;i++) ans+=tot[i];
  132. printf("%I64d\n",ans);
  133. }
  134. }
  135. }
  136. }
  137.  
  138. namespace solve3
  139. {
  140. int siz,mx;
  141. int id[N],cnt[][N+];
  142. unsigned long long tot[],ans;
  143. LL c[N];
  144.  
  145. void add(int x,int w)
  146. {
  147. while(x<=n)
  148. {
  149. c[x]+=w;
  150. x+=lowbit(x);
  151. }
  152. }
  153.  
  154. LL query(int x)
  155. {
  156. LL t=;
  157. while(x)
  158. {
  159. t+=c[x];
  160. x-=lowbit(x);
  161. }
  162. return t;
  163. }
  164.  
  165. void pre()
  166. {
  167. siz=sqrt(n);
  168. for(int i=;i<=n;i++) id[i]=(i-)/siz+;
  169. mx=(n-)/siz+;
  170. int l,r;
  171. for(int i=;i<=mx;i++)
  172. {
  173. l=(i-)*siz+;
  174. r=min(i*siz,n);
  175. for(int j=l;j<=r;j++)
  176. {
  177. cnt[i][L[j]]++,cnt[i][R[j]+]--;
  178. tot[i]+=sum[R[j]]-sum[L[j]-];
  179. }
  180. for(int j=;j<=n;j++) cnt[i][j]+=cnt[i][j-];
  181. }
  182. for(int i=;i<=n;i++) add(i,a[i]);
  183. }
  184.  
  185. void out(unsigned long long x)
  186. {
  187. if(x/) out(x/);
  188. putchar(x%+'');
  189. }
  190.  
  191. void work()
  192. {
  193. pre();
  194. int m,ty,l,r,w;
  195. int bl,br,tl,tr;
  196. read(m);
  197. while(m--)
  198. {
  199. read(ty); read(l); read(r);
  200. if(ty==)
  201. {
  202. w=r-a[l]; a[l]=r;
  203. add(l,w);
  204. for(int i=;i<=mx;i++) tot[i]+=1ll*cnt[i][l]*w;
  205. }
  206. else
  207. {
  208. ans=;
  209. bl=(l-)/siz+; br=(r-)/siz+;
  210. tl=bl*siz; tr=(br-)*siz+;
  211. for(int i=l;i<=min(r,tl);i++) ans+=query(R[i])-query(L[i]-);
  212. for(int i=bl+;i<br;i++) ans+=tot[i];
  213. if(bl!=br)
  214. for(int i=tr;i<=r;i++) ans+=query(R[i])-query(L[i]-);
  215. out(ans);
  216. printf("\n");
  217. }
  218. }
  219. }
  220. }
  221.  
  222. int main()
  223. {
  224. freopen("sum.in","r",stdin);
  225. freopen("sum.out","w",stdout);
  226. init();
  227. if(n<=) solve1 :: work();
  228. else if(flag2) solve2 :: work();
  229. else solve3 :: work();
  230. }

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. java8之重新认识HashMap(转自美团技术团队)

    java8之重新认识HashMap 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(JavaDevelopmet Kit)版本的更新,JDK1.8对Ha ...

  2. angularJS1笔记-(2)-$watch方法监听变量的变化

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. C++编译与链接(0)-.h与.cpp中的定义与声明

    C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须 ...

  4. 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 ...

  5. springmvc上传文件报错org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]

    在用springmvc+mybatis进行项目开发时,上传文件抛异常... org.springframework.beans.BeanInstantiationException: Could no ...

  6. Intellij IDEA Scala开发环境搭建

    1,在intellij 官网上下载IDEA 2,在scala官网上下载最新版scala 3,安装两个下载的文件 4,打开intellij,菜单栏help->find action   输入plu ...

  7. Shopping Bands Rank & SBR

    Shopping Bands Rank SBR https://www.guiderank.org/index.html Nike Air Zoom Pegasus 34 http://www.shi ...

  8. jmeter提取正则表达式中所有关联值-----我想获取所有的ID

    [{ "ID": 1, "Name": "张三" }, { "ID": 2, "Name": &qu ...

  9. 《Linux内核设计与实现》学习总结 Chap5

    一.与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层. 作用: 1)为用户空间提供了一种硬件的抽象接口. 2)系统调用保证了系统的稳定和安全. 3)每个进程都运行在虚拟系统中,而在 ...

  10. Codeforces 901C. Bipartite Segments(思维题)

    擦..没看见简单环..已经想的七七八八了,就差一步 显然我们只要知道一个点最远可以向后扩展到第几个点是二分图,我们就可以很容易地回答每一个询问了,但是怎么求出这个呢. 没有偶数简单环,相当于只有奇数简 ...