zoukankan      html  css  js  c++  java
  • CSP-S2019游记&拆塔记

    不是拆广州塔

    Day -inf

    四套NOI模拟降智

    Day0

    拆了一发新新

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

    没有帘子可还行

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

    Day1

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

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

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

    T3SCP?

    最后5min10分暴力

    然而水法 并 非 全 部 木 大

    T3正解:

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

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

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

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

    code(洛谷数据):

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #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<b?a:b)
    using namespace std;
    
    int a[4002][2];
    int ls[2001];
    int b[2001];
    int pre[2001][2002];
    int nxt[2001][2002];
    int ans[2001];
    int d[2001];
    int d1[2001];
    int d2[2001];
    int T,n,i,j,k,l,len,mn,tot;
    bool bz;
    
    void New(int x,int y)
    {
    	++len;
    	a[len][0]=y;
    	a[len][1]=ls[x];
    	ls[x]=len;
    }
    
    void dfs(int Fa,int Ls,int t)
    {
    	int id,i,j,k,l;
    	
    	if (t==2 && Fa==0)
    	n=n;
    	
    	if (Ls && nxt[t][Ls]==Ls && pre[t][n+1]==n+1 && (pre[t][Ls]!=0 || d[t]==1))
    	mn=min(mn,t);
    	
    	for (i=ls[t]; i; i=a[i][1])
    	if (a[i][0]!=Fa)
    	{
    		if (t==3)
    		n=n;
    		
    		id=i/2;
    		
    		if (!Ls && pre[t][id]==id && nxt[t][0]==0 && (nxt[t][id]!=n+1 || d[t]==1) || Ls && pre[t][Ls]!=id && nxt[t][Ls]==Ls && pre[t][id]==id && (pre[t][Ls]!=0 || nxt[t][id]!=n+1 || d[t]==1))
    		dfs(t,id,a[i][0]);
    	}
    }
    
    void Dfs(int Fa,int t)
    {
    	int i;
    	
    	if (t==mn)
    	{
    		bz=1;
    		return;
    	}
    	
    	for (i=ls[t]; i; i=a[i][1])
    	if (a[i][0]!=Fa)
    	{
    		++tot;
    		d1[tot]=a[i][0];
    		d2[tot]=i/2;
    		
    		Dfs(t,a[i][0]);
    		
    		if (bz)
    		return;
    		
    		--tot;
    	}
    }
    
    int main()
    {
    //	freopen("testdata1.in","r",stdin);
    //	freopen("d1t3.in","r",stdin);
    	
    	scanf("%d",&T);
    	for (;T;--T)
    	{
    		memset(ls,0,sizeof(ls));
    		len=1;
    		
    		scanf("%d",&n);
    		fo(i,1,n)
    		scanf("%d",&b[i]),++d[i];
    		fo(i,2,n)
    		{
    			scanf("%d%d",&j,&k);
    			
    			New(j,k);
    			New(k,j);
    			
    			++d[j];
    			++d[k];
    		}
    		
    		fo(i,1,n)
    		{
    			fo(j,0,n+1)
    			pre[i][j]=nxt[i][j]=j;
    		}
    		
    		fo(i,1,n)
    		{
    			bz=tot=0;
    			mn=n+1;
    			
    			dfs(0,0,b[i]);
    			Dfs(0,b[i]);
    			
    			nxt[b[i]][0]=d2[1];
    			pre[b[i]][nxt[b[i]][d2[1]]]=0;
    			
    			if (nxt[b[i]][d2[1]]!=d2[1])
    			pre[b[i]][d2[1]]=nxt[b[i]][d2[1]]=-1;
    			
    			--d[b[i]];
    			
    			fo(j,1,tot-1)
    			{
    				k=pre[d1[j]][d2[j]];
    				l=nxt[d1[j]][d2[j+1]];
    				
    				nxt[d1[j]][k]=l;
    				pre[d1[j]][l]=k;
    				
    				if (pre[d1[j]][d2[j]]!=d2[j])
    				nxt[d1[j]][d2[j]]=pre[d1[j]][d2[j]]=-1;
    				if (nxt[d1[j]][d2[j+1]]!=d2[j+1])
    				nxt[d1[j]][d2[j+1]]=pre[d1[j]][d2[j+1]]=-1;
    				
    				--d[d1[j]];
    			}
    			
    			pre[d1[tot]][n+1]=d2[tot];
    			nxt[d1[tot]][pre[d1[tot]][d2[tot]]]=n+1;
    			
    			if (pre[d1[tot]][d2[tot]]!=d2[tot])
    			pre[d1[tot]][d2[tot]]=nxt[d1[tot]][d2[tot]]=-1;
    			
    			--d[d1[tot]];
    			
    			ans[i]=mn;
    		}
    		
    		fo(i,1,n)
    		printf("%d ",ans[i]);
    		printf("
    ");
    	}
    }
    

    晚上又拆了一发新新

    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 <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #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<t && f[d[h+1]]+a[d[h+1]]<=a[i])
    		++h;
    		
    		f[i]=a[i]-a[d[h]];
    		while (h<=t && f[d[t]]+a[d[t]]>=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("
    ");
    }
    

    车上拆了半发新新

    后记

    成绩出了再补

    教训:

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

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

    暴力打满不打挂就有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牛逼!(正论)

  • 相关阅读:
    我的后端开发书架2015 2.0版
    Java根据字节数据判断文件类型
    基于lucene的案例开发:查询语句创建PackQuery
    Web 前沿——HTML5 Form Data 对象的使用
    基于HTML5的可预览多图片Ajax上传
    【面试】Spring问答Top 25
    【劳动节江南白衣Calvin 】我的后端开发书架2015
    【转载】Java 动态代理
    使用iframe给页面的localStorage扩容
    js中的||和&&使用技巧
  • 原文地址:https://www.cnblogs.com/gmh77/p/11891051.html
Copyright © 2011-2022 走看看