开始逐渐习惯被多校虐orz  菜是原罪

1004  Game    (hdoj 6312)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312

虽然披着博弈的外壳 但是也算是结论题 一开始开题的时候一看到博弈就不想写了 但是大佬们过题太快了 所以想到可能是结论题

题意:有A和B两个人可以对一个1-n的全排列进行操作 每一次都可以删去一个数和它所有质子 A和B轮流进行操作 先删光全排列为赢 A先手 给出n 判断A的输赢

因为每一次删数操作都会删去1 所以可以忽视掉1 直接看2-n的状态 如果在这个状态下B赢了 那么A先去选择1来转变自己的局面 A可以赢 如果2-n的状态下A赢了 可以不用专门去选择1 保持赢的状态 所以A是必胜的

知道这个结论后 代码就无比的简单了 不过要注意多组输入 这一场都要注意这个问题

代码如下

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int main(){
  7. int n;
  8. while(scanf("%d",&n)!=EOF){
  9. printf("Yes\n");
  10. }
  11. return ;
  12. }

1007  Naive Operations     (hdoj 6315)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6315

需要优化的线段树

题意:给一个全排列的数组b和为空的数组a 分为两个操作 第一个操作为给指定区间l-r a[l]-a[r]都加上1 第二个操作为给定指定区间 求b[l]/a[i]到b[r]/a[r]的和

区间求和问题 一开始想到的是裸的树状数组 但是太暴力 华丽丽的给卡掉了 一直卡到了比赛结束

每次对a数组进行++操作 都转化成--操作 具体做法为设一个minn赋值为对应的b[i]的值 一旦a[i]++,可以转换为minn--,直到minn为零 此时用于计数的sum进行++,minn重新赋值为b[i]

代码如下

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. typedef long long ll;
  7. const int maxn=1e5+;
  8. struct node{
  9. ll sum,pos,minn,lazy;
  10. }kk[maxn<<];
  11. int a[maxn];
  12. void pushup(int rt){
  13. kk[rt].minn=min(kk[rt<<].minn,kk[rt<<|].minn);
  14. kk[rt].sum=kk[rt<<].sum+kk[rt<<|].sum;
  15. }
  16. void pushdown(int rt){
  17. if(kk[rt].lazy){
  18. kk[rt<<].lazy+=kk[rt].lazy;
  19. kk[rt<<|].lazy+=kk[rt].lazy;
  20. kk[rt<<].minn-=kk[rt].lazy;
  21. kk[rt<<|].minn-=kk[rt].lazy;
  22. kk[rt].lazy=;
  23. }
  24. }
  25. void build(int l,int r,int rt){
  26. kk[rt].lazy=kk[rt].sum=;
  27. if(l==r){
  28. kk[rt].minn=kk[rt].pos=a[l];
  29. kk[rt].sum=;
  30. return ;
  31. }
  32. int mid=(l+r)>>;
  33. build(l,mid,rt<<);
  34. build(mid+,r,rt<<|);
  35. pushup(rt);
  36. }
  37. void update(int L,int R,int l,int r,int rt){
  38. if(L<=l&&r<=R&&kk[rt].minn>){
  39. kk[rt].lazy++;
  40. kk[rt].minn--;
  41. return ;
  42. }
  43. if(l==r&&kk[rt].minn==){
  44. kk[rt].sum++;
  45. kk[rt].minn=kk[rt].pos;
  46. kk[rt].lazy=;
  47. return ;
  48. }
  49. int mid=(l+r)>>;
  50. pushdown(rt);
  51. if(L<=mid) update(L,R,l,mid,rt<<);
  52. if(R>mid) update(L,R,mid+,r,rt<<|);
  53. pushup(rt);
  54. }
  55. ll query(int L,int R,int l,int r,int rt){
  56. if(L<=l&&r<=R) return kk[rt].sum;
  57. int mid=(l+r)>>;
  58. pushdown(rt);
  59. ll ans=;
  60. if(L<=mid) ans+=query(L,R,l,mid,rt<<);
  61. if(R>mid) ans+=query(L,R,mid+,r,rt<<|);
  62. return ans;
  63. }
  64. int main(){
  65. int n,q,l,r;
  66. while(~scanf("%d%d",&n,&q)){
  67. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  68. build(,n,);
  69. while(q--){
  70. char s[];
  71. scanf("%s%d%d",s,&l,&r);
  72. if(s[]=='a') update(l,r,,n,);
  73. if(s[]=='q') printf("%lld\n",query(l,r,,n,));
  74. }
  75. }
  76. return ;
  77. }

1011  Swaps and Inversions     (hdoj 6318)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6318

树状数组+离散化 求逆序数

题意:给出一个数列 如果一个数的逆序数不为0 则要付出逆序数*x的代价 但是也可以选择交换相邻两项来减少逆序数 每次交换需要付出的代价为y

只要想到这是逆序数 就是一题板子题了 因为相邻两项也可以构成逆序对 所以就可以把问题简化为逆序数和*min(x,y)

逆序数在线性代数中有定义(orz还好没忘记这学期刚学的线代)一个数的逆序数 是在这个数之后所有比它要小的数字个数的和 这里可以用离散化的思想来处理 用树状数组来进行修改和查询

有个小坑 一直wa 后知后觉发现是姿势不对orz 在排序的时候进行特判 差不多一个结构体二重排序(?)

哦对了 会爆int 要开long long

代码如下:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=1e5+;
  7. typedef long long ll;
  8. int c[maxn],pos[maxn];
  9. int n;
  10. struct node{
  11. int v;
  12. int id;
  13. }kk[maxn];
  14. int cmp(node a,node b){
  15. if(a.v==b.v) return a.id<b.id;
  16. else return a.v<b.v;
  17. }
  18. int lowbit(int x){
  19. return x&(-x);
  20. }
  21. void insert(int i,int x){
  22. while(i<=n){
  23. c[i]+=x;
  24. i+=lowbit(i);
  25. }
  26. }
  27. ll getsum(int i){
  28. ll sum=;
  29. while(i>=){
  30. sum+=c[i];
  31. i-=lowbit(i);
  32. }
  33. return sum;
  34. }
  35. int main(){
  36. int x,y;
  37. while(~scanf("%d%d%d",&n,&x,&y)){
  38. ll ans=;
  39. for(int i=;i<=n;i++){
  40. scanf("%d",&kk[i].v);
  41. kk[i].id=i;
  42. }
  43. sort(kk+,kk+n+,cmp);
  44. for(int i=;i<=n;i++){
  45. pos[kk[i].id]=i;
  46. }
  47. memset(c,,sizeof(c));
  48. for(int i=;i<=n;i++){
  49. insert(pos[i],);
  50. ans+=i-getsum(pos[i]);
  51. }
  52. printf("%lld\n",(ll)ans*min(x,y));
  53. }
  54. return ;
  55. }

2018 Multi-University Training Contest 2 杭电多校第二场的更多相关文章

  1. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  2. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  3. hdu6312 2018杭电多校第二场 1004 D Game 博弈

    Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  5. 2018 Multi-University Training Contest 3 杭电多校第三场

    躺了几天 终于记得来填坑了 1001 Ascending Rating   (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 ...

  6. 2018杭电多校第二场1003(DFS,欧拉回路)

    #include<bits/stdc++.h>using namespace std;int n,m;int x,y;int num,cnt;int degree[100007],vis[ ...

  7. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

  8. 2019杭电多校第二场hdu6602 Longest Subarray(线段树)

    Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...

  9. 杭电多校第二场 1005 hack it

    题意: 构造一个n*n 的 01 矩阵, 0 < n < 2001,  矩阵需要满足没有一个子矩阵的4个角都是1,并且矩阵内1的个数至少有85000个. 题解:数论构造题 参考From 代 ...

随机推荐

  1. 【优秀的素材收藏管理工具】Inboard for Mac 1.1

    [简介] Inboard 1.1 版本,Inboard 是一款Mac上强大的设计素材管理器,Inboard功能简洁实用,是设计师必备的一款软件,集成Dribbble,支持从 Safari.Chrome ...

  2. 洛谷P1762 杨辉三角,规律

    https://www.luogu.org/problemnew/show/P1762 题意:给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果. 由于N <= 1e ...

  3. Centos 6\7下yum安装R

    在linux下安装软件不如windows方便,在windows下我们一般针对可安装的文件(如R.exe)直接双击运行就可以了.而在linux下我们首先要学会使用安装软件的专门工具如centos下的rp ...

  4. maven构建myeclipse 工程

    前提:安装maven完成后 mvn -version查看版本 一,新建WEB 工程  mvn archetype:generate -DgroupId={project-packaging} -Dar ...

  5. 利用 JMetal 实现大规模聚类问题的研究(二) JMetal代码总览

    之前完成了导入JMetal到自己的工程这一步. 在开始我们研究的问题之前,我们先对JMetal的源代码一个全局的认识. JMetal很好地利用了面向对象的特性,对所有的优化问题做了高度的抽象,建议有空 ...

  6. python 面向对象(经典作业讲解)

    #############################总结######################## # lst =['python%s期' %i for i in range(510)]# ...

  7. Kafka技术内幕 读书笔记之(一) Kafka入门

    在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解耦. 异步消息 . 流量削峰等问题. 在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为 ...

  8. golang etcdclientv3使用说明

    clientv3.New() 创建连接 config = ec.Config{ Endpoints: []string{"10.0.0.5:2379"}, //连接的etcd集群地 ...

  9. HDU 1007(套圈 最近点对距离)

    题意是求出所给各点中最近点对的距离的一半(背景忽略). 用分治的思想,先根据各点的横坐标进行排序,以中间的点为界,分别求出左边点集的最小距离和右边点集的最小距离,然后开始合并,分别求左右点集中各点与中 ...

  10. Oracle的to_char()函数使用

    (1)用作日期转换: to_char(date,'格式'); select to_date('2005-01-01 ','yyyy-MM-dd') from dual; select to_char( ...