NOI Day2線上同步賽崩盤記

Preface

蒟蒻愉快的NOI線上賽Day2之行,不過由於太菜就涼了node

此次因爲策略&&網絡的問題,最後兩題都沒有交,結果就靠T1穩住拿了75分就回家了。git

我真是太菜了。網絡


屠龍勇士

首先看到那個選取屠龍寶劍的操做,emm...既然是NOI,那我就手寫一個平衡樹吧post

蒟蒻是不知道有個叫multiset的東西的ui

而後每次查詢一個數的後繼便可,Treap就很資瓷了。咱們把打每一條龍時寶劍的攻擊力記爲\(d_i\)spa

而後接下來又到了請出分類討論大法的時候了:code

  • \(1\to4\&\&14,15\):這裏有一個很送分的性質,\(p_i=1\),也就是說一條龍我把它打到\(0\)血及如下時它就GG了,因此咱們直接求\(max(\lceil \frac{a_i}{d_i}\rceil)\)便可
  • \(8\to 13\):什麼\(n,m=1\),那麼咱們很容易得出一個同餘方程

\(d_ix\equiv a_i(mod\ p_i)\)ip

那麼咱們要求的就是\(x\)最小正整數解了,這個擴歐解決便可rem

  • \(5\to7\):這幾個點的\(n,m\le10^5\)而且知足\(lcm(p_i)≤10^6\),那麼咱們大力猜結論:此時答案不會超過\(lcm(p_i)≤10^6\)然而是對的,但我並不知道怎麼證

因而咱們枚舉答案而後判斷一下便可。get

綜上便可水得75pts,分類討論果真是幫助我這種菜雞水分的最好方法

CODE

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
typedef long long LL;
const LL N=100005,INF=1e9;
LL p[N],atk[N],n,m,rt,tot,ans,x,t,a[N],s[N],k; 
bool flag;
struct Treap
{
    LL val,dat,size,cnt,ch[2];
}node[N<<1];
inline char tc(void)
{
    static char fl[100000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(LL &x)
{
    x=0; char ch; while (!isdigit(ch=tc()));
    while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline LL gcd(LL m,LL n)
{
    return n?gcd(n,m%n):m;
}
inline LL lcm(LL m,LL n)
{
    return m/gcd(m,n)*n;
}
inline LL rand() 
{
    static LL seed=233;
    return seed=(LL)seed*482711LL%2147483647; 
}
inline void pushup(LL rt)
{
    node[rt].size=node[node[rt].ch[0]].size+node[node[rt].ch[1]].size+node[rt].cnt;
}
inline LL build(LL v)
{
    node[++tot].val=v; node[tot].dat=rand();
    node[tot].size=node[tot].cnt=1; return tot;
}
inline void init(void)
{
    tot=rt=ans=0; flag=k=1; memset(node,0,sizeof(node));
    rt=build(-INF); node[rt].ch[1]=build(INF); pushup(rt);
}
inline void rotate(LL &rt,LL d)
{
    LL temp=node[rt].ch[d^1]; node[rt].ch[d^1]=node[temp].ch[d]; node[temp].ch[d]=rt;
    rt=temp; pushup(node[rt].ch[d]); pushup(rt);
}
inline void insert(LL &rt,LL v)
{
    if (!rt) { rt=build(v); return; }
    if (v==node[rt].val) ++node[rt].cnt; else
    {
        LL d=v<node[rt].val?0:1; insert(node[rt].ch[d],v);
        if (node[node[rt].ch[d]].dat>node[rt].dat) rotate(rt,d^1);
    }
    pushup(rt);
}
inline void remove(LL &rt,LL v)
{
    if (!rt) return;
    if (v==node[rt].val)
    {
        if (node[rt].cnt>1) { --node[rt].cnt; pushup(rt); return; }
        if (node[rt].ch[0]||node[rt].ch[1])
        {
            if (!node[rt].ch[1]||node[node[rt].ch[0]].dat>node[node[rt].ch[1]].dat) rotate(rt,1),remove(node[rt].ch[1],v);
            else rotate(rt,0),remove(node[rt].ch[0],v); pushup(rt);
        } else rt=0; return;
    }
    if (v<node[rt].val) remove(node[rt].ch[0],v); else remove(node[rt].ch[1],v); pushup(rt);
}
inline LL get_val(LL &rt,LL rk)
{
    if (!rt) return INF;
    if (rk<=node[node[rt].ch[0]].size) return get_val(node[rt].ch[0],rk); else
    if (rk<=node[node[rt].ch[0]].size+node[rt].cnt) return node[rt].val; else
    return get_val(node[rt].ch[1],rk-node[node[rt].ch[0]].size-node[rt].cnt);
}
inline LL get_pre(LL &rt,LL v)
{
    LL now=rt,pre;
    while (now)
    {
        if (node[now].val<=v) pre=node[now].val,now=node[now].ch[1];
        else now=node[now].ch[0];
    }
    return pre;
}
inline LL max(LL a,LL b)
{
    return a>b?a:b;
}
inline LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if (!b) { x=1; y=0; return a; }
    LL d=exgcd(b,a%b,y,x); y-=a/b*x; return d;
}
inline bool check(LL x)
{
    for (register LL i=1;i<=n;++i)
    {
        if (a[i]>s[i]*x) return 0;
        if ((s[i]*x-a[i])%p[i]) return 0;
    } return 1;
}
inline void solve1(void)
{
    register LL i;
    for (i=1;i<=n;++i) ans=max(ans,(a[i]-1)/s[i]+1);
    printf("%lld\n",ans);
}
inline void solve2(void)
{
    LL A=s[1],B=p[1],C=a[1],x,y,D=exgcd(A,B,x,y);
    if (C%D) { puts("-1"); return; } x*=C/D; LL r=B/D;
    printf("%lld\n",(x%r+r)%r);
}
inline void solve3(void)
{
    for (register LL i=1;i<=k;++i)
    if (check(i)) { printf("%lld\n",i); return; }
    puts("-1");
}
int main()
{
    //freopen("dragon.in","r",stdin); freopen("dragon.out","w",stdout);
    register LL i; read(t);
    while (t--)
    {
        read(n); read(m); init();
        for (i=1;i<=n;++i) read(a[i]);
        for (i=1;i<=n;++i) read(p[i]),flag=flag&&(p[i]==1),k=lcm(k,p[i]);
        for (i=1;i<=n;++i) read(atk[i]);
        for (i=1;i<=m;++i) read(x),insert(rt,x);
        for (i=1;i<=n;++i)
        {
            LL now=get_pre(rt,a[i]); if (now==-INF) now=get_val(rt,2);
            s[i]=now; remove(rt,now); insert(rt,atk[i]);
        }
        if (flag) solve1(); else if (n==1&&m==1) solve2(); else solve3();
    }
    return 0;
}

情報中心

一道十分可怕的神仙題,反正我是準備寫暴力+鏈的特判的

可是鏈的狀況比較煩,致使最後暴力都來不及寫了

緬懷陳瀟然dalao由於網絡沒有交上去


多邊形

吉利的神仙題系列反正我都不會

爲何這種毒瘤題都是讓我看了一眼就連暴力都不想寫了。


Postscript

Day2儘管翻車了但也翻盤(霧)了,莫名在EZ兩天水了Rank2

大佬們不要讓我啊

相關文章
相關標籤/搜索