CSP-S2019游记&拆塔记

不是拆广州塔

Day -inf

四套NOI模拟降智

Day0

拆了一发新新

本来想复习小圆脸结果拆了3h最后还没带任意门

没有帘子可还行

第一天由于没发现被子可以抽出来就没睡好

Day1

8:30开考,0.5h看题+切T1

1h切T2(主席树0.9s很虚)

以为能切T3,想了个很假的方法调了2h

T3SCP?

最后5min10分暴力

然而水法 并 非 全 部 木 大

T3正解:

枚举每个数最终到哪个点上,因为直接判边与边的关系不好搞,所以用链表维护每个点相连的边之间的关系

关系有三种:第一条,两条边相邻,最后一条

再建两个点表示头和尾,枚举时判断是否合法即可

因为剩下无限制的边随便放必定合法

code(洛谷数据):

#include 
#include 
#include 
#include 
#include 
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a

晚上又拆了一发新新

Day2

8:30看题,想了0.5h想到T184分,之后一直在想100分

9:30时打了84分,然后又想了0.5h优化想不出

10:00想T2,瞎猜结论从后往前贪心选最右且合法的

打了一发n^2过了样例,然后写了单调栈的O(n)

然后高精度打错了并且没有把type=0分开

期望(?)80

11:00想T3,写了55分

菊花图来不及想了

T2代码(洛谷数据):

#include 
#include 
#include 
#include 
#include 
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;

struct Type{
    long long a[4];
} ans,b,c;
long long a[40000001];
long long f[40000001];
int d[40000001];
int P[100001];
int L[100001];
int R[100001];
int n,type,i,j,k,l,h,t;
long long ans1,ans2,s,s1,s2,x,y,z,m;
bool bz;

int main()
{
//  freopen("testdata3.in","r",stdin);
//  freopen("d2t2.in","r",stdin);
    
    scanf("%d%d",&n,&type);
    if (!type)
    {
        fo(i,1,n)
        scanf("%lld",&a[i]),a[i]+=a[i-1];
    }
    else
    {
        scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&a[1],&a[2],&m);
        fo(i,1,m)
        scanf("%d%d%d",&P[i],&L[i],&R[i]);
        
        fo(i,3,n)
        a[i]=(x*a[i-1]+y*a[i-2]+z)%1073741824;
        
        fo(i,1,m)
        {
            fo(j,P[i-1]+1,P[i])
            a[j]=a[j]%(R[i]-L[i]+1)+L[i];
        }
        
        fo(i,1,n)
        a[i]+=a[i-1];
    }
    
    h=t=1;
    d[1]=0;
    fo(i,1,n)
    {
        while (h=f[i]+a[i])
        --t;
        
        d[++t]=i;
    }
    
    l=n;
    fd(i,n,1)
    if (f[i-1]<=a[l]-a[i-1])
    {
        s=a[l]-a[i-1];
        fo(j,0,3)
        {
            b.a[j]=s%100000000;
            s/=100000000;
            
            c.a[j]=0;
        }
        fo(j,0,3)
        {
            fo(k,0,j)
            c.a[j]+=b.a[k]*b.a[j-k];
            
            if (j<3)
            {
                c.a[j+1]+=c.a[j]/100000000;
                c.a[j]%=100000000;
            }
        }
        
        fo(j,0,3)
        {
            ans.a[j]+=c.a[j];
            if (j<3)
            {
                ans.a[j+1]+=ans.a[j]/100000000;
                ans.a[j]%=100000000;
            }
        }
        
        l=i-1;
    }
    
    bz=0;
    fd(i,3,0)
    if (ans.a[i])
    {
        if (bz)
        {
            j=ans.a[i];
            fo(k,1,8)
            {
                if (!j)
                printf("0");
                j/=10;
            }
        }
        else
        bz=1;
        
        printf("%lld",ans.a[i]);
    }
    printf("\n");
}

车上拆了半发新新

后记

成绩出了再补

教训:

想到可能是正解的东西要谨慎考虑(正确性&时间),一定要打先部分分

要把有把握能过的点特判出来,避免被其它不确定算法影响

暴力打满不打挂就有500了(

*程序一定要分段,就算是水法也要交上去但要注意分段的范围

多刷题,提升手速+智商

-11.20

突然发现D1T3应该可以过链?

-12.1

UOJ测试D2T288分?

实际上是后面三个点T了

好像在牛客也T了

CCF少爷机吼啊

-12.2

妙啊

D2T2只挂了4分,D1T3链过了,D1T2主席树没被卡

100+100+10+84+80+55=429-->100+100+35+84+96+55=470

CCF牛逼!(正论)

你可能感兴趣的:(CSP-S2019游记&拆塔记)