周记<From 2016/8/17 to 2016/8/23>


Day1

看了一套非常有趣的题目:《浅谈数据的合理组织》
大概讲的是一群DP。
有些想法感觉还是不错的。
1.金明的预算方案:
01背包。
2.给定一个树结构,选儿子的时候必须选父亲,求最大收益。
这个感觉想法还是不错的。
f[i][j]ij
f[i][j]=max(f[ed[id[i]]+1][j],f[i+1][jvi]+ci)
3.
给定一棵树:
1.询问子树中权值>根节点的权值的总数。
2.询问整棵树中权值>某个节点的值的总数。
3.询问根到节点x中权值>x的权值的总数。
按照权值排序,维护每个节点在欧拉序上对应1~st[i],1~ed[i]的值。
用树状数组进行快速的计算。


1.其实树的问题转dfs序很重要。
2.用dfs序做关于子树的dp其实也不错啊QAQ


实际上这一天的总结还有一些……
学习了莫队算法:
莫队算法可以解决一系列的可离线的区间询问问题。
莫队算法的就是通过尽可能小的代价来计算答案。
首先我们考虑询问区间为[L,R]的这一个询问,如果[L,R]能够通过O(R’ - R)的代价转移到[L,R’],[L,R]能通过O(L’ - L)的代价转移到[L’,R],那么我们就可以使用莫队算法。
莫队算法的流程:
首先按照左端点的块来分,在同一块的按照右端点排序。
设置两个指针l,r,表示当前扩展的区间为[l,r]。
初始l = 0,r = -1。
然后对排序好的询问进行处理:
每次以O(abs(ql - l) + abs(qr - r))的代价去转移[l,r]。
看起来复杂度相当不对,但是它的复杂度的确是 O((n+m)n)
考虑证明一下:
在同一块内的所有操作:
右指针单调不降。
左指针每次只会移动 n
处理一块的复杂度是: O(mn+n)
考虑处理完了第 i 块的内容:
右指针退回到第i+1块的第一条询问,代价 O(n) .
然后变成同一块的所有操作:
处理一块的复杂度是: O(Qn+n) .
也就是说:
1.从一块跳到另一块的复杂度为 O(n) .
2.单独一块的复杂度是: O(Qn+n) .(Q为在那一块的询问)
总复杂度为: O((n+m)n)


昨天做的板子题是Codeforces#340 Div2E:

#include <bits/stdc++.h>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
using namespace std;
const int N = 1000005;
typedef long long LL;
int n,m,val[N],cnt[N * 3],Xor[N],K;
LL ans;
struct Query{int l,r,bl,id;LL ans;}q[N];
bool cmp(Query a,Query b){return a.bl != b.bl ? a.bl < b.bl : a.r < b.r;}
bool cp(Query a,Query b){return a.id < b.id;}
void add(int v)
{
    ans += cnt[v ^ K];++ cnt[v];
}
void del(int v)
{
    -- cnt[v];ans -= cnt[v ^ K];
}
int main()
{
    scanf("%d%d%d",&n,&m,&K);
    Rep(i,n)scanf("%d",&val[i]),val[i] ^= val[i - 1];
    int bl = sqrt(n);
    Rep(i,m)scanf("%d%d",&q[i].l,&q[i].r),q[i].l --,q[i].id = i,q[i].bl = q[i].l / bl;
    sort(q + 1,q + 1 + m,cmp);
    int l = 0,r = -1;
    Rep(i,m)
    {
        if(r < q[i].r)for(int j = r + 1;j <= q[i].r;++ j)add(val[j]);
        else if(r > q[i].r)for(int j = r;j > q[i].r;-- j)del(val[j]);
        if(l < q[i].l)for(int j = l;j < q[i].l;++ j)del(val[j]);
        else if(q[i].l < l)for(int j = l - 1;j >= q[i].l;j --)add(val[j]);
        q[i].ans = ans;
        l = q[i].l,r = q[i].r;
    }
    sort(q + 1,q + 1 + m,cp);
    Rep(i,m)printf("%lld\n",q[i].ans);
    return 0;
}

Day2

今天可以学习一些博弈论的内容。
博弈论的知识总结发到博客上。
然后我就忘记写周记了TAT
今天感觉自己颓废了一天(或许?)
看了一些博弈论的简单知识,实际上就是多图DAG博弈。
总之就是这样,另外还做了一套NOIP模拟赛……
说是NOIP……
分块+主席树什么鬼啊TAT(虽然码出来了)


Day3

感觉马上就要放假了……?
然而下午还要做一套NOIP模拟赛TAT
江苏那边画风有毒吧……QAQ


Day4

昨天没有写周记,略微补一下。
值得纪念的是昨天的Codeforces。
总体失误还是有的,比如不测样例交程序?
但是rating还是因为数据水所以暴涨了223啊
~~话说回来给我涨300就紫了啊(被pia飞~~
感觉D还是一个很神琦的题,题意:
给定4种操作:
1.在 (i,j) 放一本书(如果放了就不放)
2.在 (i,j) 拿走一本书(如果没有就忽略)
3.把第 i 层的书的状态取反。
4.时间回溯到第i个操作之后。
对于每个操作,回答当前有多少书。
n,m<=103,q<=105


很神琦的做法,大致想法就是:
1.首先这个题看起来需要可持久化的思想。
2.既然回到过去,那么我就建立操作树。
3.容易发现,撤销操作是很简单的,我们建立操作树之后似乎很好搞。


怎么做?
1.对每个(除了4)操作和上一个操作的位置连边。
2.对于4操作和第i个操作连边。
3.第一个操作和第0个操作连边。
4.dfs整个操作树,在处理每个节点的询问时,先处理这个点的修改,然后更新答案,并继续搜索子树。
5.搜索完这个点及其子树后,把修改操作撤销。
复杂度显然可以做到O(q).
数据水O(nq)也是可以过的


Day5

今天颓了一天啊TAT
看了有关于分数规划的知识,大致讲了三点:
1.可以二分。
2.强行凑第二点。
3.强行凑第三点。
(下载了上古卷轴5,看上去游戏似乎不错(我会告诉你昨天作死去下载黑魂3然后差点烧掉电脑么),但是……为什么我感觉人物做得好丑
(本来想选黑暗精灵一系列。看了看样子,就算了。)
其实今天没有做什么啊(果然一放假就开始颓么)
另外存一下mps的blog:
http://medalplus.com/category/
(仰慕神犇.jpg)
惨啊……
连个FFT都写不出来了TATATATAT
NOIP普及组爆零选手TAT
GG


Day6 && Day7

真的一直在浪TAT
学了一下分数规划之后实力就再无寸进。
还是滚去做NOIP模拟赛吧。
下周学完反演(另外送窝一份ppt也是滋磁的啊QAQ)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值