BeestCoder #76

10 篇文章 0 订阅
3 篇文章 0 订阅

鏼爷的题还真的是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);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值