zoukankan      html  css  js  c++  java
  • gym训练记录

    [upd 12.18] 老年选手也该看看欧洲的acm了,不然以后就再也没有机会了

    neerc 17

    [problem A] 挺牛逼的结论,与y轴平行的直线最多只会经过$O(log C)$个点,拿一个线段树维护一下每个x对应哪些圆即可。复杂度$O(nlog nlog C)-O(n)$

    [problem B] 对每种图讨论即可

    [problem C] 建出一棵dfs树,假设当前与$1$构成强联通的集合为$S$,bfs每次找到一个不在$S$中的点指向$S$中点的边,把不在$S$中的点到根路径加入$S$即可。复杂度$O(n+m)-O(n+m)$

    [problem D] 假设$a$最大,显然$b$个上面的和$c$个右面的只会产生最多$bc$个正面的,所以只要$aleq bc$有解。如果$a<b+c-1$,那么就不断构造单个,把$a,b,c$减去$1$,直到大于等于为止。

    [problem E] 随便加加减减

    [problem F]

    [problem G] 首先二分答案,把问题变成计数问题。先把$b_i$,$c_i$减去$a_i$,把结果分成两类:两个区间不相交的情况,两个代价是独立的,直接扫描左边的左端点,维护右边的左端点,在线段树上二分右边的即可;两个区间相交的情况,假设相交区域为$[x,y]$,那么代价就是$f_{x,y}=sum_{b[y-r+1,x-1]}+sum_{c[x,y]}+sum_{b[y+1,x+r-1]}$,可以发现$f_{x,y+1}-f_{x,y}=c_{y+1}-b_{y+1}-b_{y-r+1}$,数值与x无关,这样问题就变成:插入删除、给所有数值加一个数、找几个数比$k$小。那么可以利用一个变量维护当前线段树中所有数值加上的数字,查询直接二分即可。复杂度$O(nlog nlog ANS)-O(n)$

    [problem H]

    [problem I] 拿第二列中的数字把第一列的数字全部问一遍,就可以把第一列分成两部分,且可以知道当前的数值。假设已经问了$k$次,即第一列已经分成了$k+1$段,我们可以首先二分出来$o_{k+1}$属于哪一段,然后暴力分块,二分的时候只要比较段内的一个数字,然后最后在最后一个小于的段和第一个大于的段中找就行了,这样总询问次数是$O(nlog n)$的,维护分段的复杂度可以$O(n^2)$。

    [problem J] 考虑枚举第$k$大的边的数值$x$,把小于$x$的边全部修改为$0$,跑一边恰好有$k$个非$0$边的最短路,这样是$O(nm^2)$的。考虑转为一般最短路,对于一条路径,如果其非$0$边的数量大于$k$,那么显然有更优的方案被别的数值统计,不会影响答案;如果小于,补足$k$个数值$x$后也不影响答案。那么把非$0$的权值减去$x$,那么最后最短路加上$xk$就是权值$x$的答案,数据会卡spfa。复杂度$O(m^2log n)-O(m+n)$

    [problem K] 

    [problem L] 按照链的长度从大到小排序,这样就不会出现某个线被后面严格包含。扫一遍整条路径,如果有被搞过的点那么就是NO,否则把一端为路径上点的路径全部取出来,这样问题就变到了数列上:询问是否存在x1<y2,x2<y1,按照左端点排序,那个单调栈维护类似括号序列的东西,去掉右端点小于的区间,检查最后一个区间即可。复杂度$O(nlog n)-O(nlog n)$

     

    cerc 17

    [problem A]

    [problem B]

    [problem C]

    [problem D] 

    [problem E]

    [problem F]

    [problem G]

    [problem H]

    [problem I]

    [problem J]

    [problem K]

    [problem L]

  • 相关阅读:
    CTF-cookies欺骗
    CTF-速度要快100
    php实现登录注册界面
    CTF-秋名山老司机 100
    三大类型语句
    PHP运算符
    标记风格和注释
    连接串口服务器时的注意事项
    RS485转以太网的概述和应用领域
    工业级路由器的优点有哪些
  • 原文地址:https://www.cnblogs.com/rqgao2014/p/8034390.html
Copyright © 2011-2022 走看看