Day1
看了一套非常有趣的题目:《浅谈数据的合理组织》
大概讲的是一群DP。
有些想法感觉还是不错的。
1.金明的预算方案:
01背包。
2.给定一个树结构,选儿子的时候必须选父亲,求最大收益。
这个感觉想法还是不错的。
f[i][j]表示以i为子树的根,最多花j元的收益。
f[i][j]=max(f[ed[id[i]]+1][j],f[i+1][j−vi]+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
块的内容:
右指针退回到第
然后变成同一块的所有操作:
处理一块的复杂度是:
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.时间回溯到第
对于每个操作,回答当前有多少书。
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)