不是拆广州塔
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牛逼!(正论)