20181024(字符串模拟+three pointer+树形DP)

求导

(equation.cpp/c/pas)
【问题描述】
“看上去像⼏几何问题,实际上是函数问题。”
⽯石神是⼀一位天才数学家。为了能够将⾃自⼰己的研究进⾏行下去,选择了在⼀一所⾼高中教书。在⼀一次数学测
验中,⽯石神给学⽣生出了⼀一道简单的求导题。题中保证不出现指数相同的项,同时要求不改变求导前后每
⼀一项的顺序。
现在请你给出这道题的正确解答吧。
提⽰示:
1x, x^1, x^0, +x^2, x+x等,不是标准的多项式
x, 1, x^2-x等,是标准的多项式
【输⼊入】
输⼊入⽂文件名为equation.in
输⼊入仅⼀一⾏行,包含⼀一个标准的多项式,表⽰示原函数。
【输出】
输出⽂文件名为equation.out。
输出⼀一⾏行,包含⼀一个标准的多项式,表⽰示求导后的结果。
【输⼊入输出样例1】
【输⼊入输出样例2】
【数据说明】
对于40%的数据,原函数是单项式
对于100%的数据,原函数不超过100项,保证系数的绝对值≤100000,0≤指数≤100000
equation.in equation.out
2x+1 2
equation.in equation.out
2x^2+3x+1 4x+3
⻚页码:!2/!4
成绩调研
(survey.cpp/c/pas)
【问题描述】
“班上所有同学的成绩都贴在⿊黑板上。”
⽯石神显得有些⼼心不在焉。最近恍恍惚惚,还请了两天假。
这⼀一次的考试,学⽣生的成绩分为k等,成绩单上按照学⽣生的学号排序。此外,学校要抽⼀一些同学的考
卷去调研,⽯石神将这个任务委派给了你。
抽取的样本有如下要求:
学号连续的学⽣生
得到1等的学⽣生数量在[l_1,r_1]区间内
得到2等的学⽣生数量在[l_2,r_2]区间内

现在请问有多少种抽取样本的⽅方法。
【输⼊入】
输⼊入⽂文件名为survey.in
第⼀一⾏行包含两个数n和k,分别表⽰示班级⼈人数和成绩的等第数。
第⼆二⾏行包含n个数a_i(1 ≤ a_i ≤ k),分别表⽰示每个⼈人成绩的等第。
接下来k⾏行每⾏行包含两个数l_k和r_k,分别要求抽取的样本中,拿到k等第的⼈人数在[l_k,r_k]区间内。
【输出】
输出⽂文件名为survey.out。
输出⼀一⾏行,包含⼀一个整数,表⽰示抽取样本的⽅方案数。
【输⼊入输出样例1】
【输⼊入输出样例2】
【数据说明】
对于30%的数据,n≤200,k≤200
对于60%的数据,n≤2000,k≤2000
对于100%的数据,n≤200000,k≤200000
survey.in survey.out
3 2
1 1 2
1 2
1 1
2
survey.in survey.out
5 3
1 2 3 1 2
1 2
1 1
1 1
3

跟踪

(track.cpp/c/pas)
【问题描述】
“有些真相注定是要⼩小⼼心翼翼深埋⼼心底的,因为答案揭晓的那⼀一刻,也是灰⻜飞烟灭的开始。”
⽯石神从离开学校就被两个陌⽣生⼈人跟踪。
整个城市的地图形成了⼀一棵树,初始时⽯石神在其中的S点,两个陌⽣生⼈人分别在P和Q点。
⽯石神尽⼒力避开,然⽽而却被穷追不舍。
为了更好地描述他们的移动⽅方法,将其看成3秒为周期(k=0,1,2,3,…):
第3k+1秒⽯石神可以静⽌止或者移动到任意相邻的结点,两个陌⽣生⼈人暂不⾏行动。
第3k+2秒和第3k+3秒两个陌⽣生⼈人朝着⽯石神的⽅方向⾛走到相邻的结点,⽯石神暂不⾏行动。
现在请问⽯石神最迟在第⼏几秒的时候被追上。
【输⼊入】
输⼊入⽂文件名为track.in
第⼀一⾏行包含四个数n S P Q,n表⽰示树的⼤大⼩小,S P Q含义⻅见问题描述,保证S P Q互不相同。
接下来n-1⾏行每⾏行包含两个数x和y,表⽰示x与y点之间有⼀一条边相连。
【输出】
输出⽂文件名为track.out。
输出⼀一⾏行,包含⼀一个整数,表⽰示⽯石神最迟被追上的时间。
【输⼊入输出样例1】
【输⼊入输出样例2】
【数据说明】
对于30%的数据,n≤200
对于60%的数据,n≤2000
对于100%的数据,n≤200000
track.in track.out
4 2 1 3
1 2
2 3
3 4
2
track.in track.out
4 1 2 3
1 2
1 3
1 4
3

题目没咋复制,看题意概括好了

T1

题意概括:字符串大暴力模拟 ,跟求导没什么关系
求导:
多项式是由若干个单项式构成的
单项式的一般形式是 a x b ax^b ,其中ab都是常数,x是自变量
对于单项式 a x b ax^b 求导,结果就是 ( a b ) x b 1 (ab)x^{b-1}
对于多项式求导,就是把构成它的所有单项式分别求导之后相加
特别地,对于 a x 0 ax^0 ,即对常数 a a 求导,结果是 0 0

额根据求导的基本运算,然后字符串大模拟,模拟吐了我
注意点
1.负数
2.第一个多项式,当指数不为0时,系数可能为0
3.第一位可能是常数,
以上三条,我全没注意 27/100

#include<bits/stdc++.h>
#define int long long 
#define R(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
using namespace std;
int getNum(int l,int r,char* a) {
    int res=0;
    R(i,l,r) res=res*10+a[i]-'0';
    return res;
}
char s[10000],e[105][100];
int len;
bool flg,pos[105];
signed main() {
    scanf("%s",s+1);
    len=strlen(s+1);
    int st=1;
    if(s[1]=='-') st++;
    else pos[1]=true;
    int e_cnt=1,s_cnt=0;
    R(i,st,len)
        if(s[i]=='+'||s[i]=='-') {
            e_cnt++; s_cnt=0;
            if(s[i]=='+') pos[e_cnt]=true;
        } else e[e_cnt][++s_cnt]=s[i];
    R(i,1,e_cnt) {
        int p=1,l=strlen(e[i]+1);
        while(!isalpha(e[i][p])&&p<=l) p++;
        if(p==l+1) {
            if(e_cnt==1) cout<<0;
            continue;
        }
        int a,b;
        a=(p==1?1:getNum(1,p-1,e[i]));
        b=(p==l?1:getNum(p+2,l,e[i]));
        int c=a*b; if(!pos[i]) c=-c;
        int d=b-1;
        if(pos[i]&&flg) cout<<'+';
        if(c!=1||d==0) cout<<c;
        if(d) cout<<'x';
        if(d>1) cout<<'^'<<d;
        flg=true;
    }
    return 0;
}

T2

题意概括:有一个序列,每个元素有一个等第,取一些连续的元素,求这些元素在等第 i i [ l i , r i ] [li,ri] 区间内的方案有多少

t h r e e p o i n t e r s three pointers
看上去是一个装逼名字,
但是其实就是维护三个指针
头指针
尾指针1——指向能满足条件的从头指针开始的第一个节点,(从头指针到该节点的所有连续的数,下同)
尾指针2——指向能满足条件的从头指针开始的最后一个节点
每次方案则为 2 1 + 1 尾指针2-尾指针1+1

#include<bits/stdc++.h>
using namespace std;
const int maxn=200010;
struct node
{
    int l,r;
}q[maxn];
long long  a[maxn],n,m,sum1[maxn],misnum,sum2[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    long long cnt=m;
    for (int i=1; i<=n; i++)
      scanf("%d",&a[i]);
    for (int i=1; i<=m; i++)
      {
      scanf("%d%d",&q[i].l,&q[i].r);
      if (q[i].l==0) cnt--;
      }
    long long  t1=1,t2=1,ans=0;
    for (int i=1;i<=n;i++)
    {
        while(t1<i)t1++;
        while(t2<i)t2++;
        if(i>1){
            if (sum1[a[i-1]]==q[a[i-1]].l) cnt++;
            sum1[a[i-1]]--;
            sum2[a[i-1]]--;
        }
        while(t2<=n&&sum2[a[t2]]<q[a[t2]].r){
            sum2[a[t2]]++;
            t2++;
        }
        while(t1<=n&&cnt){
            if (sum1[a[t1]]==q[a[t1]].l-1)cnt--;
            sum1[a[t1]]++;
            t1++;
        }
        if (t1<=t2&&cnt==0){
            ans+=t2-t1+1;
        }
    }
    cout<<ans;
}

T3
题意概括:有一棵树,S,P,Q三个点,时刻一S走一步,P,Q不动,时刻二三PQ各走两步,S不动,求PQ追上的S的最短时刻

明显是从s开始做。
然后每次往下走,如果儿子不是p或q的父亲,那么就可以直接算。
或者可以待在原地不动(直接算出答案)。
算的时候,画个图,推一推就好了。

#include<bits/stdc++.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=nxt[i])
using namespace std;
const int maxn=200007;
int i,j,k,l,t,n,m,ans,s,p,q,pp,qq,ppp,qqq;
int first[maxn*2],nxt[maxn*2],head[maxn*2],num;
int f[maxn],deep[maxn],shen[maxn];
int vis[maxn];
void add(int x,int y){
    head[++num]=y,nxt[num]=first[x],first[x]=num;
}
void dfs(int x,int y){
    int i;f[x]=y;deep[x]=deep[y]+1;shen[x]=1;
    rep(i,x){
        if(head[i]!=y){
            dfs(head[i],x);
            shen[x]=max(shen[x],shen[head[i]]+1);
        }
    }
}
void dfs1(int x,int y,int z,int p,int q){
    int i;
    if(p<=0||q<=0){
        z+=min(p,q);
        ans=max(ans,z);
        return;
    }
    rep(i,x){
        if(head[i]!=y&&!vis[head[i]]){
            int k=min(p,q),t=shen[head[i]];
            if(k<=t)ans=max(ans,z+k*3);
            else{
                int o=z+t*3;k-=t;
                o+=(k/2)*3+(k%2)*2;
                ans=max(ans,o);
            }
        }
    }
    rep(i,x){
        if(vis[head[i]]){
            if(vis[head[i]]==ppp)dfs1(head[i],x,z+3,p-3,q-1);
            else dfs1(head[i],x,z+3,p-1,q-3);
        }
    }
    k=min(p,q);
    int o=z;
    o+=(k/2)*3+(k%2)*2;
    ans=max(ans,o);
}
int main(){
    scanf("%d%d%d%d",&n,&s,&p,&q);pp=ppp=p,qq=qqq=q;
    fo(i,1,n-1){
        scanf("%d%d",&k,&l);
        add(k,l);add(l,k);
    }
    dfs(s,0);
    while(pp)vis[pp]=p,pp=f[pp];
    while(qq)vis[qq]=q,qq=f[qq];
    dfs1(s,0,0,deep[p]-1,deep[q]-1);
    printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/beautiful_CXW/article/details/83348329