先来推一波
然后传送门qaq
第一试
t1是看题面最容易的一道题了
正解似乎是可持久化01trie树
什么玩意???我太菜了告辞
————————————————————4.13————————————————————————
突然想起来把60分的简单做法放上来
这60分是省选之后第一节课yfl用了两分钟秒看出来的
。。。
我,我。。。orz...我果然是太菜了...yfl dalao tql%%%orz...
然后我们来看看60分的简单暴力(我怎么没想出来啊啊啊啊
首先维护一个前缀和
然后把每一段的异或和存到一个数组里(60的数据n是<=1000的,数组可以开到
这里每一段的异或和
l-r 我们知道相同的数异或=0,任何数异或0=它本身
用sum[l - 1] ^ sum[r]就是l-r的异或和了
(在考场上我推出来了但是检验的时候检错了我zz。。我瞎搞了个啥dp我也不记得了反正贼sd
代码老短了还老好想了我爆哭
#include#include #define sev enusing namespace std;#define N 1010long long n,a[N],sum[N],q[N * N],cnt,ans;int k;bool cmp(long long x,long long y) { return x > y;}int main() { scanf("%lld%d",&n,&k); for(int i = 1; i <= n; i++) { scanf("%lld",&a[i]); sum[i] = sum[i - 1] ^ a[i]; } for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++) q[++cnt] = sum[i] ^ sum[j - 1]; sort(q + 1,q + cnt + 1,cmp); for(int i = 1; i <= k; i++) ans += q[i]; printf("%lld",ans); return 0;}
嗯没错你翻到了代码的结尾
这有60分(o_o)
我爆粗口了啊喂!!!
——————————————————暴躁的结束4.13编辑————————————————————
t2也是数据结构
好像是叫后缀树???告辞
t3于纪平学长出的神仙题
找规律还有高精。。。
前几个点看出了规律
后面还有模数自己找的毒瘤数据点
还有prime和莫比乌斯和欧拉啥的。。。反正都不会
(就是他,他就是那个改变了传统题的男人!我的学长?!怎么会这么毒瘤?
然后就莫有了
爆零(8分咋得的???
友情提示:前一天晚上不要乱吃乱喝,肚子疼死导致只写了两个点,而且晚上还失眠了qaq
(嗯对,galgame真的很棒,我爱灯露椎她怎么辣么可爱
(跟qq姐不一样,这个黑幕可以刮开
第二试
t1。。。没思路
t2据说有贪心可以拿很多分。。。然而不知道为什么对t2一点印象都没
——————————————————————4.11————————————————————————
做了一下t2
真的。。是这次省选最简单的了
然而20分都没水到。。。qaq
这里吹一波我姐!!!tql!!!秒切!!!
首先如果考虑是一条链
可以用两个优先队列维护根节点两边的链
每次取最大的合并在一起就可以了
20get!
再把链推广到一个图
每次遍历节点下的链并合并
这样就可以辽
也不知道luogu为啥是黑题,有恶意评分嫌疑
蓝题紫题差不多吧
#include#include #include #define sev enusing namespace std;#define ll long long//不知道要不要开long long 但是以防万一qaq#define N 200010ll w[N],tmp[N];struct EDGE { int to,nxt;} e[N];int id[N];//这样把每条链标个编号,不然会t,只有60int head[N],cnt;priority_queue q[N];void add(int x,int y) { e[++cnt].to = y; e[cnt].nxt = head[x]; head[x] = cnt;}void dfs(int u) { id[u] = u; for(int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; dfs(v); if(i == head[u]) { id[u] = id[v]; continue; } if(q[id[v]].size() > q[id[u]].size()) swap(id[v],id[u]);//把短的并到长的上 int tot = 0; while(!q[id[v]].empty()) { tmp[++tot] = max(q[id[v]].top(),q[id[u]].top()); q[id[u]].pop(); q[id[v]].pop(); } for(int i = 1; i <= tot; i++) q[id[u]].push(tmp[i]);//合并操作 } q[id[u]].push(w[u]);//这个点自己的值别忘作为(目前)单独的一个集合加}int main() { int n; scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%lld",&w[i]); for(int i = 2; i <= n; i++) { int f; scanf("%d",&f); add(f,i); } dfs(1); ll ans = 0; while(!q[id[1]].empty()) { ans += q[id[1]].top(); q[id[1]].pop(); } printf("%lld",ans); return 0;}
en代码超短,但是写出正解的人也不多
我连链都没写出来果然是太菜了orz...
————————————————以上,4.11补题解 * 1————————————————————
t3好神啊。。题面暗示了什么。。尽管会爆零还要怀有希望?
诶看上去似乎部分分可写啊
爆零滚粗吧您呐
t3其实有想部分分写点分治。。。然而。。。忘了233
最后
学姐太强啦!!!
司队长nb!!!
ssy是神!!!(本质还是个小孩子
然后
很可惜也很悲伤
在手机上码了一些
这样复杂的情感和未来
真的很累
尽管无法接受
终究是这样了很悲伤啊他们的付出他们的努力他们外出集训的奔波他们机房里的日日夜夜他们那些未完成的闪耀的梦我非常非常非常喜欢啊他们的快乐他们的坚持他们的骄傲他们的一切见过他们赤诚的心不甘于那样的美好破碎那样溃不成军不值一提一样一直沉默的詹爷关上了门的dukelv离开机房跟兔哥说什么的lba还有中途告别的bin哥更早离开的那群人所有的他们我真心喜欢的OIer们但是啊就像码字时这曲悲伤的bgm放完了一样那些闪耀的美丽的它们都还在啊我相信它们会再次闪耀的会再次让我感动的它们会奏响的无论在哪条路,无论走向何方请 继续加油吧!
祝好。