头大
这个暑假完就要去搞NOIP了。。。
暑假55天也就20次测试。。。为防万一我还是每次测试玩都写个总结。。
???曾老说好的题为什么做了一个半小时又换题了系列???
。。。这次更无语。。中途一群人闹着换题被搞晕然后心态失衡零分。
Day?(0/300)
T1 T1:排列的最大长度
自己不背最长子序列模板怪我咯
STD.CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<string>
#include<cstring>
#include<ctime>
using namespace std;
int n,input[100005],b[100005];
int a,f[100005];
int main()
{
cin >> n;
for(int i=1;i<=n;i++)cin>>a,input[a]=i;
for(int i=1;i<=n;i++)cin>>a,b[i]=input[a];
int l=1,r=0,top=0;
for(int i=1;i<=n;i++)
{
l = 1; r = top;
int mid = (l+r)/2;
while(l<=r)
{
mid = (l+r)/2;
if(f[mid]>b[i]) r = mid-1;
else l = mid+1;
}
if(l>top) top++,l=top;
f[l] = b[i];
}
cout << top;
}
T2 T2:覆盖节点
当时没读懂题就没做。。事后发现并不难想。。
STD.CPP
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
#include<ctime>
using namespace std;
int n,l,tot=0,first[2000002];
int stack[2000002];
bool visit[2000002];
struct node{
int x;
int y;
int w;
int next;
}side[2000002];
int d[1000005];
void addedge(int x,int y,int w)
{
side[++tot].x=x;
side[tot].y=y;
side[tot].w=w;
side[tot].next=first[x];
first[x]=tot;
d[x] += 1;
}
int main()
{
//freopen("t2.in","r",stdin);
//freopen("t2.out","w",stdout);
cin.sync_with_stdio(false);
int x,y;
cin >> n >> l;
l *= 2;
if(2*n==l) {cout << n;return 0;}
for(int i=1;i<n;i++)
{
cin >> x >> y;
addedge(x,y,1);
addedge(y,x,1);
}
int l1=1,r1=0;
for(int i=1;i<=n;i++)
if(d[i]==1)
{
r1 += 1; stack[r1] = i;
visit[i] = true;
}
int ans = 0;
while(l1<=r1)
{
int k = r1-l1+1;
ans += min(l,k);
for(int j=1;j<=k;j++)
for(int i=first[stack[l1++]];i;i=side[i].next)
{
d[side[i].y]--;
if(!visit[side[i].y]&&d[side[i].y]==1)
{
stack[++r1] = side[i].y;
visit[side[i].y] = true;
}
}
}
cout << ans;
}
T3 T3:系列维护
果断:当时还不会树状数组暴力又挂。。。还得研究研究
STD.CPP
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
using namespace std;
inline void readi(int &i)
{
char p;
p=getchar();
while(p>'9'||p<'0')p=getchar();
while(p>='0'&&p<='9')
{
i=i*10+p-'0';
p=getchar();
}
}
int m,n,size,us[1000005],s[1000005],c[1000005],a[1000005];
long long num,small,sum,tr2[1000005];
bool bz[1000005];
char ch;
int tr1[1000005];
inline int lowbit(int i)
{
return i&(-i);
}
inline void add(int x,int y)
{
int i=x;
while(i<=size)
{
tr1[i]+=y;
tr2[i]+=us[x]*y;
i+=lowbit(i);
}
}
inline void query(int x)
{
sum=0;
small=0;
while(x)
{
sum+=tr1[x];
small+=tr2[x];
x-=lowbit(x);
}
}
int main()
{
//freopen("1.in","r",stdin);
readi(n);
readi(m);
for(int i=1;i<=m;i++)
{
ch=getchar();
while(ch!='Z'&&ch!='U')ch=getchar();
if(ch=='Z')bz[i]=1;
readi(c[i]);
readi(s[i]);
us[++size]=s[i];
}
sort(us+1,us+size+1);
size=unique(us+1,us+size+1)-us-1;
for(int i=1;i<=m;i++)
s[i]=lower_bound(us+1,us+size+1,s[i])-us;
for(int i=1;i<=m;i++)
if(bz[i])
{
query(s[i]);
sum=num-sum;
if(small>=(long long)1*us[s[i]]*(c[i]-sum))puts("Yes");
else puts("No");
}
else
{
if(a[c[i]])add(a[c[i]],-1);
else num++;
add(s[i],1);
a[c[i]]=s[i];
}
return 0;
}
还是一句话:多刷题。。。