LNOI2019【12省联考】

先来推一波我姐的游记qwq

然后传送门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<cstdio>
#include<algorithm>
#define sev en
using namespace std;
#define N 1010

long 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<cstdio>
#include<algorithm>
#include<queue>
#define sev en
using namespace std;
#define ll long long//不知道要不要开long long 但是以防万一qaq
#define N 200010

ll w[N],tmp[N];
struct EDGE {
    int to,nxt;
} e[N];
int id[N];//这样把每条链标个编号,不然会t,只有60
int head[N],cnt;
priority_queue<ll>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放完了一样
那些闪耀的美丽的
它们都还在啊
我相信它们会再次闪耀的
会再次让我感动的
它们会奏响的
无论在哪条路,无论走向何方
请 继续加油吧!

祝好。

posted @ 2019-04-07 20:51  ./seven  阅读(489)  评论(1编辑  收藏  举报