鏼爷的题还真的是hentai
我真的不是很想打那个数位DP
讲道理啊 题目用的东西的确不难 但是难想啊QAQ
1001
没打
1002
貌似用一点不等式的东西就好了?
感谢×××友情提供的代码
1003
G[i]表示子树需要附加贡献
F[i]表示子树贡献
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const
int Mod=1000000007;
int G[200001],F[200001];
struct Chain
{
Chain *next;
int u;
}*Head[200001];
inline void add(int a,int b)
{Chain *tp=new Chain;tp->u=b,tp->next=Head[a];Head[a]=tp;}
int ans;
void DFS(int u,int f)
{
G[u]=F[u]=1;
for(Chain *tp=Head[u];tp;tp=tp->next)
if(tp->u!=f)
{
DFS(tp->u,u);
F[u]=((G[tp->u]+1ll)*F[u]+G[u]*1ll*F[tp->u])%Mod;
G[u]=(G[u]*(G[tp->u]+1ll))%Mod;
}
ans+=F[u];
if(ans>=Mod)ans-=Mod;
}
char c;
inline void read(int &a)
{
a=0;
do c=getchar();while(c<'0'||c>'9');
while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}
int main()
{
int T;
read(T);
while(T--)
{
int n,j;
ans=0;
read(n);
memset(Head,0,sizeof(Head));
for(int i=2;i<=n;i++)
read(j),add(i,j),add(j,i);
DFS(1,0);
printf("%d\n",ans);
}
}
1004
数位DP 用个Hash+Queue就可以了应该
1005
线段树
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct Seg
{
int l,r;
int sum;
int flag;//1 clear 2 All1 0
}T[1000001];
inline void Addflag(int place,int flag)
{T[place].flag=flag;T[place].sum=(flag==1?0:(T[place].r-T[place].l+1));}
inline void pushdown(int place)
{
int lc=place<<1,rc=lc|1;
Addflag(lc,T[place].flag);
Addflag(rc,T[place].flag);
T[place].flag=0;
}
void Modify(int place,int l,int r,int flag)
{
if(l>r)return;
if(T[place].l>=l&&T[place].r<=r){Addflag(place,flag);return ;}
if(T[place].flag)pushdown(place);
int lc=place<<1,rc=lc|1,mid=T[lc].r;
if(mid>=l)Modify(lc,l,r,flag);
if(mid<r)Modify(rc,l,r,flag);
T[place].sum=T[lc].sum+T[rc].sum;
}
int Mid;
int D[160001];
void Build(int place,int l,int r)
{
T[place].l=l,T[place].r=r;T[place].flag=0;
if(l^r)
{int mid=l+r>>1,lc=place<<1,rc=lc|1;Build(lc,l,mid),Build(rc,mid+1,r);T[place].sum=T[lc].sum+T[rc].sum;return ;}
T[place].sum=(D[l]<Mid?0:1);
}
int Query(int place,int l,int r)
{
if(T[place].sum==0)return 0;
if(T[place].l>=l&&T[place].r<=r)
return T[place].sum;
if(T[place].flag)pushdown(place);
int res=0,lc=place<<1,rc=lc|1,mid=T[lc].r;
if(mid>=l)res=Query(lc,l,r);
if(mid<r)res+=Query(rc,l,r);
return res;
}
struct Que
{
int op,l,r;
}K[100001];
int m;
inline void Rev()
{
for(int i=1;i<=m;i++)
{
int l=K[i].l,r=K[i].r;
if(K[i].op)
{
int Con=Query(1,l,r);
Modify(1,l,l+Con-1,2);
Modify(1,l+Con,r,1);
}
else
{
int Con=Query(1,l,r);
Modify(1,l,r-Con,1);
Modify(1,r-Con+1,r,2);
}
}
}
char c;
inline void read(int &a)
{
a=0;do c=getchar();while(c<'0'||c>'9');
while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}
int main()
{
int Tt;
read(Tt);
while(Tt--)
{
int n;
read(n);read(m);
for(int i=1;i<=n;i++) read(D[i]);
for(int i=1;i<=m;i++)
read(K[i].op),read(K[i].l),read(K[i].r);
int k,L=1,Ans=n,R=n;
read(k);
while(L<R)
{
Mid=L+R>>1;
Mid++;
Build(1,1,n);
Rev();
if(Query(1,k,k))
L=Mid;
else
R=Mid-1;
}
printf("%d\n",L);
}
}